Usando gitk log
, eu não conseguia identificar a diferença entre os dois. Como posso observar a diferença (com um comando git ou alguma ferramenta)?
git
merge
fast-forward
user1162226
fonte
fonte
Respostas:
O
--no-ff
sinalizador impede agit merge
execução de um "avanço rápido" se detectar que o seu atualHEAD
é um ancestral do commit que você está tentando mesclar. Um avanço rápido é quando, em vez de construir um commit de mesclagem, o git apenas move o ponteiro do branch para apontar para o commit de entrada. Isso geralmente ocorre ao fazer umgit pull
sem alterações locais.No entanto, ocasionalmente, você deseja impedir que esse comportamento aconteça, normalmente porque você deseja manter uma topologia de ramificação específica (por exemplo, você está mesclando em uma ramificação de tópico e deseja garantir a aparência dessa maneira ao ler o histórico). A fim de fazer isso, você pode passar a
--no-ff
bandeira egit merge
vai sempre construir uma mesclagem em vez de fast-encaminhamento.Da mesma forma, se você deseja executar um
git pull
ou usargit merge
para avançar explicitamente, e deseja resgatar se ele não puder avançar rapidamente, use o--ff-only
sinalizador. Dessa forma, você podegit pull --ff-only
executar regularmente algo como sem pensar e, se ocorrer um erro, poderá voltar e decidir se deseja mesclar ou refazer o processo.fonte
gitk
ougit log --graph
que a mesclagem de avanço rápido não criou uma consolidação de mesclagem, enquanto a não-avanço rápido fez.--no-ff
de um recurso para desenvolver ou desenvolver para dominar é semelhante à mesclagem de uma solicitação pull?--no-ff
.Resposta gráfica a esta pergunta
Aqui está um site com uma explicação clara e uma ilustração gráfica do uso
git merge --no-ff
:Até ver isso, eu estava completamente perdido com o git. O uso
--no-ff
permite que alguém que revise o histórico veja claramente a ramificação na qual você fez check-out para trabalhar. (esse link aponta para a ferramenta de visualização "rede" do github) E aqui está outra ótima referência com ilustrações. Essa referência complementa bem a primeira, com mais foco naqueles menos familiarizados com o git.Informações básicas para newbs como eu
Se você é como eu, e não um git-guru, minha resposta aqui descreve como lidar com a exclusão de arquivos do rastreamento do git sem excluí-los do sistema de arquivos local, que parece mal documentado, mas geralmente ocorre. Outra situação nova é obter o código atual , que ainda consegue me iludir.
Exemplo de fluxo de trabalho
Atualizei um pacote para o meu site e tive que voltar às minhas anotações para ver meu fluxo de trabalho; Achei útil adicionar um exemplo a esta resposta.
Meu fluxo de trabalho de comandos git:
Abaixo: uso real, incluindo explicações.
Nota: a saída abaixo é cortada; git é bastante detalhado.
Observe três coisas acima:
1) Na saída, você pode ver as alterações da atualização do pacote ECC, incluindo a adição de novos arquivos.
2) Observe também que existem dois arquivos (que não estão na
/ecc
pasta) que apaguei independentemente dessa alteração. Em vez de confundir essas exclusões de arquivosecc
, criarei umacleanup
ramificação diferente posteriormente para refletir a exclusão desses arquivos.3) Não segui meu fluxo de trabalho! Eu esqueci o git enquanto tentava fazer o ecc funcionar novamente.
Abaixo: em vez de incluir tudo incluído
git commit -am "updated ecc package"
, normalmente, eu só queria adicionar os arquivos na/ecc
pasta. Esses arquivos excluídos não faziam parte especificamente dos meusgit add
, mas como eles já foram rastreados no git, preciso removê-los do commit deste ramo:Script para automatizar o acima
Tendo usado esse processo mais de 10 vezes em um dia, comecei a escrever scripts em lote para executar os comandos, então criei um
git_update.sh <branch> <"commit message">
script quase adequado para executar as etapas acima. Aqui está a fonte Gist para esse script.Em vez de
git commit -am
selecionar arquivos da lista "modificada" produzida porgit status
e colá-los no script. Isso aconteceu porque eu fiz dezenas de edições, mas queria nomes de filial variados para ajudar a agrupar as alterações.fonte
--no-ff
opção?Estratégias de mesclagem
Mesclagem explícita : cria uma nova confirmação de mesclagem. (Isso é o que você obterá se usou
--no-ff
.)Mesclagem de avanço rápido : encaminhe rapidamente, sem criar uma nova confirmação:
Rebase : estabeleça um novo nível básico:
Squash: Esmague ou aperte (alguma coisa) com força para que fique plana:
fonte
A
--no-ff
opção garante que uma mesclagem de avanço rápido não aconteça e que um novo objeto de confirmação seja sempre criado . Isso pode ser desejável se você quiser que o git mantenha um histórico de ramificações de recursos. Na imagem acima, o lado esquerdo é um exemplo do histórico do git após o usogit merge --no-ff
e o lado direito é um exemplo de usogit merge
onde uma fusão ff era possível.EDIT : Uma versão anterior desta imagem indicava apenas um pai único para a confirmação de mesclagem. As confirmações de mesclagem têm várias confirmações pai que o git usa para manter um histórico do "ramo de recurso" e do ramo original. Os vários links pai estão destacados em verde.
fonte
Essa é uma pergunta antiga e mencionada de maneira sutil nas outras postagens, mas a explicação que me deu esse clique é que mesclagens sem avanço rápido exigirão uma confirmação separada .
fonte
git merge --no-ff ecc
você simplesmente terá uma confirmação de mesclagem adicional nogit log
mestre de ramificação for. Tecnicamente, isso não é necessário, caso o mestre esteja apontando para um ancestral direto do commit ecc, mas especificando a opção --no-ff, você está forçando a criação desse commit de mesclagem. Ele terá o título:Merge branch 'ecc'
O sinalizador --no-ff faz com que a mesclagem sempre crie um novo objeto de confirmação, mesmo que a mesclagem possa ser executada com um avanço rápido. Isso evita a perda de informações sobre a existência histórica de uma ramificação de recurso e agrupa todas as confirmações que adicionaram o recurso
fonte