Como posso combinar dois commits em um commit?

102

Eu tenho um branch 'firstproject' com 2 commits. Eu quero me livrar desses commits e fazê-los aparecer como um único commit.

O comando git merge --squashparece promissor, mas quando executo git merge --squashmeu terminal apenas exibe opções para o comando. Qual é o comando correto?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
Don P
fonte
Não acho que seja o comando certo. Além disso, estou duvidando que você possa alterar commits assim.
BSull
Nah, você pode alterar vários commits em um commit: git-scm.com/book/en/Git-Tools-Rewriting-History minha pergunta é apenas sobre o comando específico para ele.
Don P
@BSull Você absolutamente pode alterar os commits da maneira que quiser. Eles são totalmente editáveis ​​a qualquer momento. Se você estiver compartilhando código com outras pessoas, isso irá reescrever seu histórico e você estará efetivamente trabalhando com um branch diferente de todos os outros.
meagar
Isso nunca deveria ter sido enganado. Na verdade, aquele outro deveria ter sido fechado como muito amplo. A outra questão da qual isso é marcado como um truque é desnecessária e complexa, pois envolve o abandono de um rebase anterior.
Evan Carroll

Respostas:

144

Você deseja git rebase -irealizar um rebase interativo .

Se você está atualmente no seu "commit 1", e o commit que deseja mesclar, "commit 2", é o commit anterior, você pode executar git rebase -i HEAD~2, o que irá gerar um editor listando todos os commits que o rebase irá percorrer. Você deve ver duas linhas começando com "pick". Para continuar a esmagar, altere a primeira palavra da segunda linha de "escolher" para "esmagar". Em seguida, salve o arquivo e saia. Git irá esmagar seu primeiro commit em seu segundo último commit.

Observe que este processo reescreve a história do seu ramo. Se você estiver enviando seu código para algum lugar, terá que fazê-lo git push -fe qualquer pessoa que compartilhe seu código terá que passar por alguns obstáculos para obter suas alterações.

Note que se os dois commits em questão não são os últimos dois commits no branch, o processo será ligeiramente diferente.

meagar
fonte
2
Como fazer Then write your file, and quit? Estou usando o Android Studio Terminal, o próprio git console Ou até abri o git console pelo software SourceTree. Mas como economizar e desistir?
Dr.jacky,
1
Como combinar 2 commits que não são os dois últimos commits no branch?
Weishi Zeng
1
@meagar acho que faz sentido ... se você verificar este problema (uma duplicata deste), esmagar a 'direção' fez uma grande diferença e foi a raiz de todo o problema (veja o primeiro comentário com cerca de 200 votos positivos sobre ' esmagando o caminho errado ') - stackoverflow.com/a/2568581/43453
PandaWood
1
@PandaWood Você está interpretando mal a resposta. A primeira maneira era simplesmente errada , não diferente . Você pode compactar para trás, não faz sentido pensar em compactar um commit mais antigo em um mais novo, mas se você pudesse , seria a mesma operação.
meagar
1
Eu entendi até "mudar a primeira palavra da segunda linha" - segunda linha de quê?
Andrew Torr
75

Versão simples preguiçosa para esquecidos como eu:

git rebase -i HEAD~3 ou quantos commits em vez de 3.

Vire isso

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

nisso

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

e faça alguma ação onde você clicar em escseguida enterpara salvar as alterações. [1]

Quando a próxima tela aparecer, livre-se dessas linhas inúteis [2] e crie uma nova mensagem de commit ou algo assim, e faça a mesma escape enteração. [1]

Uau, você tem menos commits. Ou você simplesmente quebrou tudo.


[1] - ou o que quer que funcione com sua configuração git. Esta é apenas uma sequência eficiente, dada a minha configuração.

[2] - você verá algumas coisas como # this is your n'th commitalgumas vezes, com seus commits originais logo abaixo desta mensagem. Você deseja remover essas linhas e criar uma mensagem de commit para refletir as intenções dos n commits que você está combinando em 1.

Stachu
fonte
1
Solução muito concisa - obrigado. Pode ser útil delinear que susado aqui significa squash. Para usar o commit, mas se fundir ao commit anterior
UrbanConor
Se você acabou de fazer 2commits e deseja combinar o mesmo 2commit, você precisará executar git reset --soft HEAD~e git commit --amend.
scrutari
@Stachu Quando eu comando push depois disso, ele pedirá pull e merge. O que posso fazer para evitar isso?
Abhay Koradiya de
Por que você não quer puxar e mesclar?
Stachu
23
  1. Verifique seu branch e conte a quantidade de todos os seus commits.
  2. Abra o git bash e escreva: git rebase -i HEAD~<quantity of your commits>(ou seja git rebase -i HEAD~5)
  3. No txtarquivo aberto, altere a pickpalavra-chave para squashpara todos os commits, exceto o primeiro commit (que está no topo). Para o primeiro, mude para reword(o que significa que você fornecerá um novo comentário para este commit na próxima etapa) e clique em SALVAR! Se estiver no vim, pressione esce salve inserindo wq!e pressione enter.
  4. Forneça um comentário.
  5. Abra o Git e faça "Fetch all" para ver as novas mudanças.

Feito

user5820972
fonte
O primeiro me diz como usar no vim. Muito obrigado
Ho Luong