Git - Qual é a diferença entre push.default “matching” e “simple”

285

Estou usando o git há algum tempo, mas nunca precisei configurar um novo repositório remoto e fiquei curioso em fazê-lo. Eu tenho lido tutoriais e estou confuso sobre como fazer o "git push" funcionar.

Se eu simplesmente usá- git pushlo, solicita que eu veja um ramo padrão (?) Para apontar? Qual é a diferença entre essas duas opções que ele me fornece?

git config --global push.default matching
git config --global push.default simple

A correspondência apenas empurra todos os ramos que eu tenho no meu repositório local e, se eles não coincidirem, tenho que dizer manualmente para enviar os ramos novos que eu tenho, correto? Essa é a melhor prática a ser usada ou a simples é a melhor?

Josh
fonte
1
Agora, se apenas pull.defaultestá disponível para atualizar todos os ramos localmente
Nogurenn

Respostas:

367

git push pode enviar todas as ramificações ou uma única dependente dessa configuração:

Empurre todos os ramos

git config --global push.default matching

Ele empurrará todos os ramos para o ramo remoto e os fundirá. Se você não deseja enviar todas as ramificações, pode enviar apenas a ramificação atual.

Enviar apenas a ramificação atual

git config --global push.default simple

Portanto, é melhor, na minha opinião, usar essa opção e enviar seu código por ramo. É melhor enviar ramificações manualmente e individualmente.

Lalit Sachdeva
fonte
16
Gostei push.default currentda resposta de @UpAndAdam. Não sabia disso.
Alanjds 17/01/2015
4
Observe que simplenão é mais uma opção. No 1.7.8.4(e anterior?), Resulta em um erro quando você tenta enviar por push. mas currentainda está disponível
sixty4bit 10/16
@ sixty4bit: estou usando a versão 1.7.1 do git. Estou usando tracking-> empurre o ramo atual para o ramo upstream.
Kevinarpe
@ sixty4bit Não, foi incluído em uma versão posterior do Git que eu não sei em qual, mas (1.7) é velho demais, mesmo para 2016. Eu não recomendaria o uso de versões antigas.
21717 Schmoudi
Votado. Desculpe, mas a descrição da página vinculada simplenão faz sentido, contradiz esta resposta e está incorreta - o que torna essa resposta confusa. A página vinculada diz simple"empurrará as ramificações uma a uma. Principalmente conectada à ramificação atual". Isso significa que ele empurrará os galhos sequencialmente e não em paralelo? O que significa "principalmente conectado"? Então, a descrição para simplecontinua citando a descrição para matching, a qual alguém pensaria que significa que a descrição matchingtambém se aplica simple. Mas obviamente isso não é verdade.
tvanc 11/06/19
91

Da documentação do GIT: Git Docs

Abaixo fornece todas as informações. Em suma, simpleapenas empurrará o current working branche, mesmo assim, somente se ele também tiver o mesmo nome no controle remoto. Essa é uma configuração muito boa para iniciantes e se tornará o padrão emGIT 2.0

Considerando matchingque empurrará todos os ramos localmente que tenham o mesmo nome no controle remoto. (Sem considerar o seu ramo de trabalho atual). Isso significa que potencialmente muitas ramificações diferentes serão enviadas, incluindo aquelas que você talvez nem queira compartilhar.

No meu uso pessoal, geralmente uso uma opção diferente: currentque empurra o ramo de trabalho atual (porque eu sempre faço o ramo de alterações). Mas para um iniciante, eu sugirosimple

push.default
Define a ação que o git push deve executar se nenhum refspec for explicitamente fornecido. Valores diferentes são adequados para fluxos de trabalho específicos; por exemplo, em um fluxo de trabalho puramente central (ou seja, a fonte de busca é igual ao destino de envio), o upstream é provavelmente o que você deseja. Os valores possíveis são:

nada - não envie nada (erro) a menos que um refspec seja fornecido explicitamente. Isso se destina principalmente a pessoas que desejam evitar erros sempre sendo explícitos.

current - pressione a ramificação atual para atualizar uma ramificação com o mesmo nome na extremidade receptora. Funciona em fluxos de trabalho centrais e não centrais.

upstream - envie a ramificação atual de volta à ramificação cujas alterações geralmente são integradas à ramificação atual (chamada @ {upstream}). Este modo só faz sentido se você estiver empurrando para o mesmo repositório do qual normalmente retiraria (ou seja, fluxo de trabalho central).

simples - no fluxo de trabalho centralizado, trabalhe como upstream com uma segurança adicional para se recusar a enviar por push se o nome da ramificação upstream for diferente do local.

Ao empurrar para um controle remoto diferente do que você normalmente puxa, trabalhe como atual. Esta é a opção mais segura e é adequada para iniciantes.

Este modo se tornará o padrão no Git 2.0.

correspondência - pressione todas as ramificações com o mesmo nome nas duas extremidades. Isso faz com que o repositório que você está pressionando lembre-se do conjunto de ramificações que serão empurradas para fora (por exemplo, se você sempre pressiona maint e master e não há outras ramificações, o repositório para o qual você pressiona terá essas duas ramificações e sua manutenção e mestre local será empurrado para lá).

Para usar esse modo efetivamente, você deve garantir que todos os desvios que você deseja enviar estejam prontos para serem retirados antes de executar o git push, pois o objetivo desse modo é permitir que você envie todos os ramos de uma só vez. Se você normalmente termina o trabalho em apenas uma ramificação e obtém o resultado, enquanto outras ramificações estão inacabadas, esse modo não é para você. Além disso, este modo não é adequado para enviar para um repositório central compartilhado, pois outras pessoas podem adicionar novas ramificações ou atualizar a ponta das ramificações existentes fora do seu controle.

Atualmente, esse é o padrão, mas o Git 2.0 alterará o padrão para simples.

UpAndAdam
fonte
sim, mas suponho que, mesmo com a configuração push.default, se você fizer "$ git push origin master ", ele enviará apenas a ramificação atual para a ramificação na origem com o mesmo nome ... certo? você deve mencionar que também há um controle remoto padrão
Alexander Mills
1
Não sei ao certo o que você está dizendo. Em QUALQUER MODO, se você disser git push origin masterque fará a mesma coisa. O ponto dos modos e padrões é geralmente o que acontece quando você simplesmente diz git pushe não diz a ele um controle remoto ou um ramo. Qual configuração padrão? você quer dizer a configuração padrão de push.default? a configuração padrão em que versão do git ... se você não conseguir, seu comentário é extremamente vago.
UpAndAdam
'push.default Define a ação que o git push deve executar se nenhum refspec for explicitamente fornecido' se você diz que o mestre de origem do git push está fornecendo mais informações e ainda pode não fazer o que você descreve; dependendo do refspec que você configurou .. git-scm.com/book/en/v2/Git-Internals-The-Refspec
UpAndAdam 21/15
2

Notas de versão do Git v2.0

Notas de compatibilidade com versões anteriores

Quando git push [$there]não diz o que enviar, usamos a semântica tradicional de "correspondência" até agora (todas as suas ramificações foram enviadas para o controle remoto desde que já existam ramificações com o mesmo nome por lá). No Git 2.0, o padrão agora é a semântica "simples", que empurra:

  • somente a ramificação atual para a ramificação com o mesmo nome e somente quando a ramificação atual estiver configurada para integrar-se a essa ramificação remota, se você estiver empurrando para o mesmo controle remoto de onde você busca; ou

  • somente a ramificação atual para a ramificação com o mesmo nome, se você estiver enviando para um controle remoto que não é o local de onde você normalmente busca.

Você pode usar a variável de configuração "push.default" para alterar isso. Se você é um veterano que deseja continuar usando a semântica "correspondente", pode definir a variável como "correspondente", por exemplo. Leia a documentação para outras possibilidades.

Quando git add -ue git add -Asão executados dentro de um subdiretório sem especificar quais caminhos adicionar na linha de comando, eles operam em toda a árvore para obter consistência com git commit -aoutros comandos (esses comandos costumavam operar apenas no subdiretório atual). Diga git add -u .ou git add -A .se você deseja limitar a operação ao diretório atual.

git add <path>é o mesmo de git add -A <path>agora, para que git add dir/você observe os caminhos removidos do diretório e registre a remoção. Nas versões mais antigas do Git, git add <path>costumava ignorar remoções. Você pode git add --ignore-removal <path>adicionar apenas os caminhos adicionados ou modificados <path>, se realmente quiser.

CodeWizard
fonte