Git pull sem check-out?

133

Estou acostumado a executar o git pull e outros comandos de dentro de um ramo em que estou trabalhando. Mas eu configurei um servidor de desenvolvimento no qual várias pessoas trabalham, por isso não quero mudar de ramificação quando o fizer. Se eu quiser atualizar uma ramificação existente no servidor dev a partir do repositório github que todos usamos, qual seria a maneira correta de fazer isso? Se eu executar o comando 'git pull github branchname', isso simplesmente puxará a ramificação para a ramificação atual?

Todos os exemplos do git que posso encontrar parecem indicar que você executa 'checkout branchname' primeiro e depois executa o pull. Estou tentando evitar isso. Como eu disse, este é um ramo existente e só quero atualizar para a versão mais recente.

Diana Saunders
fonte
6
git fetchdeve fazer o que quiser.
21413 Brad
11
git fetchatualizaria a cópia local da filial remota, mas não qualquer filial local, mesmo que uma esteja configurada para rastrear essa filial remota específica. Pode ou não ser o que se deseja. (. Edit: por padrão, de qualquer maneira É possível chamá-lo com argumentos para torná-lo comportar de maneira diferente, mas, nesse caso, os argumentos realmente deve ser salientado.)
2
Eu não entendo direito ... todos estão usando o mesmo repositório local no servidor de desenvolvimento? É por isso que você não quer mudar de ramo? Por que não fazer com que todos criem seu próprio clone privado no qual possam trabalhar? Veja também git: atualizar uma ramificação local sem fazer check-out? .
Possível duplicado de mesclagem, atualizar e puxar ramos Git sem usar checkouts
Michael Mrozek

Respostas:

221

Eu estava procurando a mesma coisa e finalmente encontrei a resposta que funcionou para mim em outra postagem do stackoverflow: mesclar, atualizar e puxar ramificações do Git sem usar caixas

Basicamente:

git fetch <remote> <srcBranch>:<destBranch>

Koral
fonte
Existe uma maneira de usar a ramificação upstream em vez de especificar a ramificação de origem?
cambunctious
Infelizmente, mas o pulltem parâmetros que o fetchnão: -s <strategy>, -Xsubtree=...o que foi um vital para mim, então isso não é um substituto equivalente. Eu tive o problema descrito aqui: congruityservice.com/blog/…, mas no meu caso, eu não queria um checkout.
Andry
2
Considerando que a pergunta é sobre puxar, parece que a resposta deveria ser git pull <remote> <srcBranch>:<destBranch>.
J marmota
Se as confirmações já estiverem no seu repositório local:git fetch . origin/master:master
Evan
74

Eu tive o mesmo problema com a necessidade de confirmar ou ocultar as alterações atuais dos recursos, fazer o checkout da ramificação principal , o pullcomando obter tudo, desde o masterespaço de trabalho remoto até o local , em seguida, alternar novamente para uma ramificação de recursos e executar um rebasepara atualizá-lo mestre.

Para fazer tudo isso, mantenha o espaço de trabalho na ramificação do recurso e evite toda a alternância, faço o seguinte:

git fetch origin master:master

git rebase master

E faz o truque bem.

Marcin TP zyuczyński
fonte
19
Este é um bom conselho, mas esconde o lede: de acordo com as respostas abaixo, se você está ligado featuree tudo o que você quer fazer é atualizar seu local masterpara estar de acordo com a origem, SEM tocar feature, apenas faça git fetch origin master:master... e é como se você fizesse stash-checkoutMaster-pull-checkoutFeature-stashPop!
btown 26/07/19
7
Para mesclar o mestre de origem em sua ramificação local, você não precisa puxar o mestre local. Você pode usar git merge origin/master
Dan
-1

Se você deseja que as dicas das filiais locais sejam redirecionadas depois git fetch, precisará de algumas etapas adicionais.

Mais concretamente, suponha que o repo github tem filiais D, B, C, e master(a razão para este estranho nome_agencia-set ficará claro em um momento). Você está no host devhoste está em um repositório onde originestá o repositório do github. Você faz git fetch, o que traz mais de todos os objetos e atualizações origin/D, origin/B, origin/C, e origin/master. Por enquanto, tudo bem. Mas agora você diz que quer que aconteça alguma coisa, sobre devhost, para locais ramos D, B, C, e / ou master?

Eu tenho essas perguntas óbvias (para mim de qualquer maneira):

  1. Por que você deseja que as dicas de todas as filiais sejam atualizadas?
  2. E se algum ramo (por exemplo, B) confirmar que o repositório remoto (github) não possui? Eles devem ser mesclados, reformulados ou ...?
  3. E se você estiver em algum ramo (por exemplo, C) e o diretório de trabalho e / ou o índice forem modificados, mas não confirmados?
  4. E se o repositório remoto tiver novas ramificações adicionadas ( A) e / ou ramificadas excluídas ( D)?

Se a resposta para (1) for "porque devhostnão é realmente para desenvolvimento, mas sim um espelho local que simplesmente mantém uma cópia localmente disponível do repositório do github, para que todos os nossos desenvolvedores reais possam ler rapidamente, em vez de ler lentamente de github ", você quer um" espelho "em vez de um repositório" normal ". Ele não deve ter um diretório de trabalho e, talvez, também não deva aceitar impulsos; nesse caso, as perguntas restantes desaparecem.

Se houver outra resposta, (2-4) se tornará problemático.

De qualquer forma, aqui está uma maneira de lidar com a atualização de referências locais com base em referências remotas (após a execução, git fetch -ppor exemplo):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

O que se passa na ... code here ...seção depende das respostas às perguntas (2-4).

torek
fonte
-5

Usar

git fetch

em vez de. Ele atualiza as referências e objetos remotos no seu repositório, mas deixa as ramificações locais, HEAD e a árvore de trabalho em paz.

SzG
fonte
17
Mas isso não atualiza as ramificações locais de seu servidor de desenvolvimento ... apenas atualiza as ramificações "origin" nessa pasta git, que correspondem ao repositório do github do asker.
ANeves 03/10/19
1
Ou, se você quiser a minha versão do problema: desejo mesclar minha ramificação de trabalho com "master" e não com "origin / master of ssh: // bla bla bla". Fazer busca atualizará a origem / mestre, mas não o mestre.
ANeves 03/10/19
-6

EDIT: Use 'git pull' Ele buscará todos os ramos do repositório e também será atualizado para o mais recente se o ramo sair no sistema local apenas para o ramo atual. Nota: git pull é equivalente a buscar + mesclar, que busca todos os ramos, mas mescla apenas o ramo atual.

Anuj Aneja
fonte
6
Melhor dizer: pullfaz uma busca (que, sim, busca tudo no controle remoto), mas depois mescla apenas o ramo atual .
torek 17/09/2013
Sem ofensa pretendida com o meu voto negativo, eu sei que o que você está dizendo é correto e factual, e o OP realmente pediu confirmação sobre o que a atração faz (e você deu a ele essa explicação), mas não aborda a questão. ponto crucial do que ele estava procurando: Existe uma maneira de atualizar uma de suas ramificações locais para as confirmações mais recentes em sua ramificação remota associada sem precisar fazer check-out da ramificação primeiro.
Gurce