Mesclagem Git sem confirmação automática

403

É possível fazer um git merge, mas sem um commit?

"man git merge" diz o seguinte:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

Mas quando tento usá git merge- --no-commitlo, ele ainda é confirmado automaticamente. Aqui está o que eu fiz:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

Um subsequente git logrevela todas as confirmações da ramificação v1.0 mescladas no mestre.

selbie
fonte

Respostas:

617

Observe a saída ao fazer a mesclagem - está dizendo Fast Forward

Em tais situações, você deseja fazer:

git merge v1.0 --no-commit --no-ff
manojlds
fonte
7
e se houver um conflito.
Jürgen Paul
20
@PineappleUndertheSea Fast forward nunca causa conflitos. No caso de mesclagem "real" sem avanço rápido, a --no-commitopção será efetiva somente se não ocorrer conflito; no caso de conflito, o git nunca será confirmado automaticamente.
gronostaj
38
FYI: Se você deseja mesclar as alterações e, em seguida, confirmar como se tivesse digitado manualmente todas as alterações nas quais você mesclou (em oposição a uma mesclagem tradicional), precisará executar rm .git/MERGE_HEADposteriormente, o que forçará o git a esquecer que a mesclagem ocorreu.
Jonn 27/02
7
FYI: Aqui é exemplo de saída para uma fusão de sucesso:Automatic merge went well; stopped before committing as requested
kevinarpe
6
Aparentemente, git merge BRANCHENAME --no-commit --no-ffdeixei meu espaço de trabalho no estado git "MERGING". Não tenho muita certeza do que isso faz exatamente, mas um ciclo simples git stash savee git stash popparecia retornar tudo ao normal; com apenas os arquivos modificados da ramificação de destino no lugar conforme pretendido e não mais com o status MERGING.
Moonlite
49

Você está entendendo mal o significado da mesclagem aqui.

Os --no-commitimpede que o MERGE COMMIT a ocorrer, e que só acontece quando você mesclar duas histórias divergentes de filiais; no seu exemplo, esse não é o caso, pois o Git indica que foi uma mesclagem de "avanço rápido" e, em seguida, o Git aplica apenas os commits já presentes na ramificação sequencialmente.

Samus_
fonte
12
Isso não (imo) necessariamente esclareceria a confusão; Acho que é uma vez (relativamente rara) que os documentos são realmente claros: git help merge=> "Ao --no-commitexecutar a mesclagem, mas finge que a mesclagem falhou e não é confirmada automaticamente, para dar ao usuário a chance de inspecionar e ajustar ainda mais o resultado da mesclagem antes de confirmar. " A chave do curso é usá-lo em conjunto com--no-ff
michael
6
... talvez seja menos confuso sair da terminologia estrita e descrevê-la desta maneira: um "git merge" que faz um avanço rápido não tem um commit de mesclagem, porque na verdade não existe uma mesclagem. Esta é de fato a situação ideal: avançar rapidamente é uma coisa boa, e não ter esse "compromisso de mesclagem" extra faz sentido. Esse é um bom comportamento padrão e não deve ser desativado. (Na linguagem adequada, um fast-forward é um tipo de fusão, mas não é um "verdadeiro merge".)
michael
4
é relativo às políticas do projeto; em alguns casos, é útil ter / forçar esses "commits de consolidação" extras, mesmo que seja um ff, porque você precisa marcar a inclusão do recurso no ramo principal.
Samus_
7
...o que. Tudo bem, acho que o git é praticamente imperdível. Esta resposta em particular me convenceu a experimentar o Mercurial.
Brian Gordon
24

Se você deseja confirmar apenas todas as alterações em um commit como se você tivesse se digitado, --squash também

$ git merge --squash v1.0
$ git commit
Adrian Li
fonte
11
É este o mesmo efeito quegit merge v1.0 --no-commit --no-ff
jpierson 18/08/19
2
Não, efeito diferente. O Squash cria um novo commit com um novo hash. Ele combina todas as confirmações em uma ramificação em uma confirmação para a mesclagem.
Kavi Siegel
23

Eu prefiro assim, para não precisar me lembrar de parâmetros raros.

git merge branch_name

Em seguida, ele diz que sua ramificação está " #" à frente com confirmações, agora você pode desabilitá-las e colocá-las nas alterações de trabalho com o seguinte:

git reset @~#

Por exemplo, se após a mesclagem for 1 confirmação antecipada, use:

git reset @~1

Nota: No Windows, são necessárias aspas. (Como Josh observou nos comentários), por exemplo:

git reset "@~1"
Pellet
fonte
4
No Windows, são necessárias aspas:git reset "@~1"
Josh
1

Quando há um commit apenas no branch, eu costumo

git merge branch_name --ff
Sithu
fonte