Posso desativar o encaminhamento rápido por padrão no git?


263

Eu realmente não posso jamais pensar em um momento em que eu usaria git mergeem vez de git rebasee não querem ter uma confirmação aparecer. Existe alguma maneira de configurar o git para ter o encaminhamento rápido desativado por padrão? O fato de haver uma --ffopção parece implicar que existe uma maneira, mas não consigo encontrá-la na documentação.


3
Eu uso mergeo tempo todo para ramificações quando não efetuamos nenhum commit no controle remoto para avançar rapidamente. Parece a maneira mais simples e segura de fazer isso. Estou curioso, você obviamente tem um caso de uso. Por que você desejaria criar um commit de mesclagem onde não há commit de um lado do branch?
CB Bailey

12
Uso ramos para criar um agrupamento lógico de confirmações. Então, se eu fizer uma mesclagem, é basicamente uma maneira de dizer "esses commits andam juntos". Você quase pode pensar nisso como rebase e squash interativos de um pobre homem. :-)
Jason Baker

13
Desligando o avanço rápido é extremamente útil, especialmente quando se segue um modelo de como um GIT sucesso ramificação modelo
steinybot

2
Altere a resposta aceita para a resposta de Eric Platon stackoverflow.com/a/6810687/3408 - Eu executei as etapas na resposta aceita e percebi que era apenas para a ramificação principal no repositório atual, o que é bobagem.
Rjmunro 02/10/2015

3
@ jpmc26 Cada um por conta própria, eu acho. Por acaso discordo desse artigo. Encontrar os dois pais de uma consolidação de mesclagem não é difícil e informa exatamente quais foram as alterações. Então você pode fazer essas alterações e fazer uma "reformulação" em algum outro ramo. Com o modelo plano, você precisa encontrar manualmente e escolher a cereja. Escolhemos abraçar a ramificação. Claro que é complexo quando se olha para a árvore inteira, mas essa é a realidade, várias mudanças ocorrem paralelamente. Achatar tudo apenas oculta o que realmente aconteceu.
steinybot

Respostas:


282

Sim existe --no-ff. Você pode configurar opções de mesclagem por filial, por exemplo

git config branch.master.mergeoptions  "--no-ff"

adiciona o seguinte ao seu $(REPO)/.git/configarquivo:

[branch "master"]
    mergeoptions = --no-ff

Nota de rodapé: falando da minha experiência, acabei descobrindo que alternar o avanço rápido para o off foi mais útil para os iniciantes do git - no entanto, quando a sensação de fluxos de trabalho e conceitos começar a afundar, você definitivamente quer evitar desfocar seu gráfico de log com toneladas de inúteis 'mesclados O tipo remoto ..blarf 'confirma.

Nota de rodapé 2, uma década depois: as outras respostas abaixo fornecem opções de configuração mais modernas, mas, na verdade, você provavelmente deseja permanecer com os padrões (por exemplo, avanço rápido sempre que possível) nos dias de hoje, porque a mesclagem vazia realmente é apenas tornar a história muito mais difícil de raciocinar.


142
Aprender git é um pouco como escalar montanhas; mas, em vez de começar com pequenos penhascos e progredir para outros mais difíceis, o git faz com que você suba a mesma montanha repetidamente, apenas para cair em alturas diferentes a cada vez, sempre tão surpreso que a linha de vida não esteja presa.
23710

12
@ Thomas: Sim; git pullé git fetch+ git merge.
Michelle Tilley

9
Parece bom, mas existe alguma maneira de fazer isso globalmente, para todos os ramos, em vez de precisar configurá-lo para todos os ramos?
bwinton

33
Cuidado com os dragões. Essa opção é perigosa, como o @Thomas disse ... Cada puxar git cria uma consolidação de mesclagem. git pull --ff não substitui as mergeoptions = no-ff na configuração do git.
Dalibor Filus 15/09/11

15
E se eu estiver cansado de digitar git merge --no-ff (branchname)? E eu quero git pullfuncionar como sempre tem?
Dogweather

341

Parece que ainda há uma pergunta pendente no tópico: Como fazê-lo globalmente (ou seja, para todos os ramos)? Para os registros, podemos usar o seguinte:

git config --add merge.ff false

... para aplicá-lo a todas as ramificações no repositório atual. Para aplicá-lo a todas as ramificações em todos os repositórios em que alguém não a executou sem a --globalopção (configurações locais substituem global), execute o seguinte:

git config --global --add merge.ff false

A partir da documentação :

merge.ff
Por padrão, o git não cria uma confirmação de mesclagem extra ao mesclar uma confirmação que é descendente da confirmação atual. Em vez disso, a ponta da ramificação atual é encaminhada rapidamente. Quando definida como false, essa variável diz ao git para criar um commit de mesclagem extra nesse caso (equivalente a dar a --no-ffopção na linha de comando). Quando definido como somente, apenas essas mesclagens de avanço rápido são permitidas (equivalente a dar a --ff-onlyopção na linha de comando).


18
Nota: merge.fffoi introduzido no Git 1.7.6. Não é eficaz em versões mais antigas.
31411 Chris Chrissen

2
Para pessoas que usam o Git 1.7.6, esta é a solução melhor e mais simples.
Ryan Lundy

22
Estou usando isso junto com um apelido #puff = "pull --ff --ff-only"
stigi 27/06/2012

11
Existe também (agora, consulte git-scm.com/docs/git-config ) a opção pull.ff, que pode ser configurada apenas , o que fará o mesmo que o alias.
jotomo

1
Obrigado, @jotomo. Esse recurso está disponível no Git v2.0.0 (a partir do commit b814da891e8261b909fc5d9fb07b4e8b13989c2d).
quer

14

Lendo o tópico de respostas, acabei usando as duas opções a seguir

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

Apenas pouco relacionado, também achei que essa configuração evita problemas durante a extração

git config --global pull.rebase true # set up pull to rebase instead of merge

1
git config --global pull.rebase true # observe 'true' no final da linha
zowers

Obrigado @zowers Eu corrigi isso
bastian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.