Como fazer o Git pull usar rebase por padrão para todos os meus repositórios?

186

Existe uma maneira de configurar o repositório Git do host de forma que qualquer git pullfeito a partir de seus clones (locais) use --rebasepor padrão? Ao pesquisar no Stack Overflow, aprendi branch.autosetuprebase, mas ele precisa ser configurado por clone individualmente.

Meu fluxo projeto está configurado tal que pullo developramo antes mergeing um ramo de recurso a ele. Isso pullquase sempre usa --rebase, então estou tentando descobrir se esse pode ser o padrão.

Homem mascarado
fonte
6
Porque você quer isso? Eu acho que é mais razoável ensinar aos usuários a pensar ativamente sobre qual caso será mais apropriado (com base na magnitude das mudanças que eles fizeram ou esperam do upstream) ''
Jonas Schäfer
4
@JonasWielicki Sim, eu concordo. Alguns membros da minha equipe são novos no Git e gostaria de saber se há uma maneira de aplicá-lo para evitar problemas durante a fase inicial (até que eles aprendam). A equipe também trabalha remotamente em um fuso horário diferente, o que significa que eles ficariam presos por várias horas se algo desse errado. Apenas curioso para saber se isso é possível.
Masked Man
1
Eu acho que, especialmente nas configurações iniciais, é melhor ir para a mesclagem. Rebase cria coisas muito mais estranhas se o seu código realmente diverge. Você precisa resolver os mesmos conflitos repetidamente até pressionar. Portanto, se um membro da equipe quiser trabalhar em algum código, sempre usar rebase e não pressionar até que ele termine (o que os novatos podem fazer, em vez de se ramificarem), serão confrontados com os mesmos conflitos que já resolveram X vezes .
Jonas Schäfer
3
@JonasWielicki Os membros da equipe fazer fazer um novo ramo para cada novo recurso que trabalhar (e isso, eles já entenderam muito bem). A necessidade de rebase vem porque outros desenvolvedores se comprometeram com o ramo de desenvolvimento "remoto" quando ele está pronto para fazer suas alterações. Por isso, gostaria que ele fizesse um rebase do controle remoto antes de enviar suas alterações. O projeto em si é bastante maduro, apenas a equipe é nova. :) Portanto, é uma "configuração inicial" apenas em termos de pessoas. Qual seria o seu conselho para esse cenário?
Masked Man
5
Respondendo ao seu primeiro comentário, na maioria dos casos (quase todos), rebase é a escolha certa, pois leva muito tempo para testar minuciosamente um novo recurso, etc. No momento em que isso é feito, certamente haverá muitos commits de outros desenvolvedores.
Masked Man

Respostas:

205

Agora, existem três níveis diferentes de configuração para o comportamento de recebimento padrão. Do mais geral ao mais fino, são:

1 pull.rebase

Definir isso como truesignifica que git pullé sempre equivalente a git pull --rebase(a menos que branch.<branchname>.rebaseseja explicitamente definido como false). Isso também pode ser definido por repositório ou globalmente.

2) branch.autosetuprebase

Definir isso como alwayssignifica que sempre que uma ramificação de rastreamento for criada, uma entrada de configuração como a abaixo será criada para ela. Para um controlo mais fino granulado, este também pode ser definida como never, localou remotee podem ser definidos por ou repositório globalmente. Veja git config --helppara mais detalhes.

3) branch.<branchname>.rebase

Definindo para truemeios de que um determinado ramo sempre puxar do seu montante através rebasing, a menos que git pull --no-rebaseseja explicitamente utilizado.

Conclusão

Portanto, embora não seja possível alterar o comportamento padrão para todos os futuros clones de um repositório, você pode alterar o padrão para todos os repositórios do usuário atual (existente e futuro) via git config --global pull.rebase true.

Parker Coates
fonte
4
Obrigado pela sua resposta. Eu estava explorando se poderia ter uma configuração para que qualquer pessoa que clone o repositório a habilite por padrão. A configuração acima seria armazenada ~/.gitconfig, o que significa que cada desenvolvedor que clona o repositório host precisará executar o comando. Não reclame da sua solução. É bom, só quero confirmar que entendi seu ponto de vista corretamente.
Homem mascarado
Obrigado pela resposta. De fato, parece que isso é o mais próximo possível.
Masked Man
139

E se

git config --global pull.rebase true

Isso diz ao git para sempre puxar com rebase.

mackuntu
fonte
3
Obrigado, isso funciona muito bem para ramos de rastreamento existentes.
Fls'Zen
1
Por favor, remova --bool, é desnecessário
diralik
38

A resposta é não.

Não há uma maneira de configurar um repositório remoto para que todos que o clonam tenham o comportamento padrão de git pullalterado.

No entanto, você pode configurar um gancho do lado do servidor que verifique se ninguém envia pushs de consolidação ( algo como isto , talvez).

Também há algumas opções de configuração nas quais você pode se interessar. Todos os desenvolvedores que clonam no repositório remoto terão que configurá-los manualmente.

1. Opção branch.<name>.rebase

Você pode configurar uma filial local para sempre usar --rebase, assim, substituindo <name>por um nome de filial:

git config branch.<name>.rebase true

Depois de executá-lo master, a masterseção em .git/configficou assim:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Opção branch.autosetuprebase

A execução desse comando de configuração anterior para cada ramificação do Git pode ser um aborrecimento, portanto, você pode configurar o Git para configurá-lo automaticamente para cada nova ramificação:

git config branch.autosetuprebase always

(Você também pode especificar never, remotee local, veja man git-configpara mais detalhes.)

Sem a --globalopção, a configuração é salva .git/confige apenas o repositório atual é afetado. Com --global, a configuração é salva ~/.gitconfige todos os repositórios não configurados são afetados.

Esta opção não afeta as ramificações já existentes.

3. Opção pull.rebase

git config --bool pull.rebase true

(Você também pode dar a --globalopção.)

Se essa opção for verdadeira, a execução git pullserá equivalente a git pull --rebase, a menos que branch.<name>.rebasetenha sido definida como false.

Flimm
fonte
3

Isso torna a --rebaseopção o padrão ao emitir uma git pull em uma determinada ramificação.

@Limlim, eu precisava adicionar truepara fazer sua primeira opção funcionar.

Portanto, a sintaxe correta é:

git config branch.<branch>.rebase true

Para executar este comando na developramificação:

git config branch.develop.rebase true

E agora a developseção .git/configaparece assim:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true
Daishi
fonte
Obrigado, editei minha resposta. No futuro, fique à vontade para editar a resposta.
Flimm
2
Donwvoter, quem quer que seja, por favor, explique seus motivos. Fazer voto negativo sem um comentário parece completamente arbitrário e pouco construtivo para mim.
Daishi 11/02
1

Atualmente, não há como definir a política padrão para um repositório.

Se você quiser e usar pelo menos o git 1.7.9, poderá definir globalmente a pull.rebaseconfiguração da seguinte maneira:

git config --global pull.rebase true

Mas você terá que fazer em cada máquina. Uma opção poderia ser configurar o modelo / esqueleto inicial do usuário padrão com essa opção. Os usuários podem, no entanto, alterar essa opção.

Se você não deseja mesclagens, você pode definir um gancho do lado do servidor para rejeitar empates com mesclagens.

Para sua referência, esta é a documentação de origem do pull.rebase:

Quando verdadeiro, rebase as ramificações na parte superior da ramificação buscada, em vez de mesclar a ramificação padrão do controle remoto padrão quando "git pull" for executado. Consulte "branch..rebase" para definir isso em uma base por ramo.

Quando mescladas, passe a opção --rebase-mesclas para git rebase, para que as confirmações de mesclagem local sejam incluídas na rebase (consulte git-rebase para obter detalhes).

Ao preservar, também passe --preserve-mescla para o git rebase, para que as confirmações de mesclagem confirmadas localmente não sejam achatadas pela execução do git pull.

Quando o valor é interativo, o rebase é executado no modo interativo.

NOTA: esta é uma operação possivelmente perigosa; não o use, a menos que você entenda as implicações (consulte git-rebase para obter detalhes).

David
fonte