Como comprometo apenas alguns arquivos?

259

Eu tenho dois projetos. Um é o projeto "oficial" e o segundo é uma modificação leve (alguns arquivos foram adicionados). Criei um novo ramo e coloquei novos arquivos neles. Porém, durante o desenvolvimento, alguns arquivos comuns aos dois ramos são alterados.

Como comprometo apenas esses arquivos?

Nips
fonte
Esses dois projetos estão conectados ao mesmo repositório git?
precisa
Sim, é o mesmo repositório, mas eu não quero colocar o meu ramo para servidor
Nips
Então por que não você mesclar seu novo ramo de dominar (ou outro ramo oficial)
Oleksandr
1
As respostas a estas perguntas o ajudarão: stackoverflow.com/questions/7161860/… stackoverflow.com/questions/7175869/…
eckes

Respostas:

261

Suponho que você deseja confirmar as alterações em um ramo e, em seguida, tornar essas alterações visíveis no outro ramo. No git, você não deve ter alterações em cima do HEAD ao alterar ramificações.

Você confirma apenas os arquivos alterados:

git commit [some files]

Ou, se tiver certeza de que possui uma área de preparação limpa, pode

git add [some files]       # add [some files] to staging area
git add [some more files]  # add [some more files] to staging area
git commit                 # commit [some files] and [some more files]

Se você deseja disponibilizar esse commit nos dois ramos,

git stash                     # remove all changes from HEAD and save them somewhere else
git checkout <other-project>  # change branches
git cherry-pick <commit-id>   # pick a commit from ANY branch and apply it to the current
git checkout <first-project>  # change to the other branch
git stash pop                 # restore all changes again
Alex
fonte
22
Para literalmente confirmar apenas esses arquivos, mesmo que outras alterações tenham sido testadas, o segundo exemplo ( git commit [some files]que implica a --onlyopção) deve ser usado. O primeiro exemplo ( git add [some files]seguido por git commit) também confirmará outras alterações que foram preparadas.
precisa saber é o seguinte
4
Seria útil fornecer exemplos para o git commit [alguns arquivos]. como, como você deve substituir [alguns arquivos], vírgula, espaço em branco?
Claudiu Creanga 26/03
2
@claudiu geralmente o material do shell é delimitado por espaço. E se você mergulhar a uma profundidade suficiente Você pode mudar isso para nada
Alex
Se você pode adicionar alguns exemplos, esta resposta será ótima.
Yamur 01/06
154

Obtenha uma lista dos arquivos que você deseja confirmar

$ git status

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   file1
modified:   file2
modified:   file3
modified:   file4

Adicione os arquivos ao teste

$ git add file1 file2

Verifique para ver o que você está comprometendo

$ git status

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   file1
    modified:   file2

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   file3
    modified:   file4

Confirme os arquivos com uma mensagem de confirmação

$ git commit -m "Fixed files 1 and 2"

Se você acidentalmente confirmar os arquivos errados

$ git reset --soft HEAD~1

Se você deseja desfazer os arquivos e começar de novo

$ git reset

Unstaged changes after reset:
M file1
M file2
M file3
M file4
Abram
fonte
92

Você pode confirmar alguns arquivos atualizados, como este:

git commit file1 file2 file5 -m "commit message"
Adriano Rivolli
fonte
30

Parte disso parece "incompleto"

Grupos de pessoas NÃO saberão se devem usar aspas etc.

Adicione 1 arquivo específico mostrando os caminhos do local também

git add JobManager/Controllers/APIs/ProfileApiController.cs

Confirmar (lembre-se, a confirmação é apenas local, não está afetando nenhum outro sistema)

git commit -m "your message"  

Enviar para repo remoto

git push  (this is after the commit and this attempts to Merge INTO the remote location you have instructed it to merge into)

Outra (s) resposta (s) mostra (s) o esconderijo etc., que você às vezes desejará fazer

Tom Stickel
fonte
11

Se você já preparou os arquivos, simplesmente desinstale-os:

git reset HEAD [file-name-A.ext] [file-name-B.ext]

Em seguida, adicione-os pouco a pouco novamente.

kaiser
fonte
11

Suponha que você tenha feito alterações em vários arquivos, como:

  • Arquivo1
  • Arquivo2
  • Arquivo3
  • Pasta / Processo4
  • Pasta / Processo5

Mas você deseja confirmar apenas alterações de Arquivo1 e Arquivo3.

Existem duas maneiras de fazer isso:

1.Stage apenas esses dois arquivos, usando:

git add file1 file2

então, comprometa

git commit -m "your message"

então empurre,

git push

2. Confirmação direta

git commit file1 file3 -m "my message"

então empurre,

git push

Na verdade, o primeiro método é útil no caso de estarmos modificando arquivos regularmente e organizando-os -> Projetos grandes, geralmente projetos ao vivo.
Mas, se estamos modificando arquivos e não os preparando, podemos fazer o commit direto -> Pequenos projetos

KamalDeep
fonte
Quando não especificar o nome do arquivo como sugere o segundo exemplo, o git assume que o sinalizador de comando para esses argumentos é --only. Em seguida, seria o mesmo comando git commit --only file1 --only file3 -m "my message"ou usando um atalho como git commit -o file1 -o file3 -m "my message"Referência: git-scm.com/docs/git-commit
user
0

Esta é uma abordagem simples se você não tiver muitas alterações de código:

1. git stash
2. git stash apply
3. remove the files/code you don't want to commit
4. commit the remaining files/code you do want

Então, se você quiser o código que você removeu (bits que você não confirmou) em um commit separado ou em outro ramo, enquanto ainda estiver nesse ramo, faça:

5. git stash apply
6. git stash

Com a etapa 5, como você já aplicou o stash e confirmou o código desejado na etapa 4, o diff e o não rastreado no stash recém-aplicado são apenas o código que você removeu na etapa 3 antes de confirmar na etapa 4.

Como essa etapa 6 é uma reserva do código que você não deseja confirmar, pois provavelmente não deseja perder essas alterações, certo? Portanto, o novo stash da etapa 6 agora pode ser comprometido com este ou qualquer outro ramo, aplicando o git stash no ramo e confirmação corretos.

Obviamente, isso pressupõe que você execute as etapas em um fluxo, se você esconder em qualquer outro ponto dessas etapas, precisará observar a ref do esconderijo para cada etapa acima (em vez de apenas esconderijo básico e aplicar o esconderijo mais recente).

James
fonte