A resposta curta
Desde que você faça uma mesclagem de avanço rápido , você pode simplesmente usar
git fetch <remote> <sourceBranch>:<destinationBranch>
Exemplos:
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
Embora a resposta de Amber também funcione em casos de avanço rápido, usar git fetch
dessa maneira é um pouco mais seguro do que apenas mover a referência de ramificação com força, pois git fetch
evitará automaticamente avanços acidentais não rápidos desde que você não use +
o refspec.
A resposta longa
Você não pode mesclar uma ramificação B na ramificação A sem fazer check-out de A primeiro se isso resultar em uma mesclagem de avanço rápido. Isso ocorre porque é necessária uma cópia de trabalho para resolver possíveis conflitos.
No entanto, no caso de mesclagens de avanço rápido, isso é possível , porque essas mesclas nunca podem resultar em conflitos, por definição. Para fazer isso sem verificar primeiro uma ramificação, você pode usar git fetch
com um refspec.
Aqui está um exemplo de atualização master
(não permitindo alterações sem avanço rápido) se você tiver outra ramificação em feature
check-out:
git fetch upstream master:master
Esse caso de uso é tão comum que você provavelmente desejará criar um alias para ele no seu arquivo de configuração git, como este:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
O que esse alias faz é o seguinte:
git checkout HEAD
: coloca sua cópia de trabalho em um estado de desanexação. Isso é útil se você deseja atualizar master
enquanto faz o check-out. Eu acho que era necessário fazer isso, porque, caso contrário, a referência de ramificação para master
não se moverá, mas não me lembro se isso é realmente certo.
git fetch upstream master:master
: encaminha o local rapidamente master
para o mesmo local que upstream/master
.
git checkout -
faz check-out de sua filial com check-out anterior (é o que -
faz neste caso).
A sintaxe de git fetch
mesclagens de avanço rápido (não)
Se você deseja que o fetch
comando falhe se a atualização não for um avanço rápido, basta usar um refspec do formulário
git fetch <remote> <remoteBranch>:<localBranch>
Se você deseja permitir atualizações sem avanço rápido, adicione um +
à frente do refspec:
git fetch <remote> +<remoteBranch>:<localBranch>
Observe que você pode passar seu repositório local como o parâmetro "remote" usando .
:
git fetch . <sourceBranch>:<destinationBranch>
A documentação
A partir da git fetch
documentação que explica esta sintaxe (ênfase minha):
<refspec>
O formato de um <refspec>
parâmetro é uma vantagem opcional +
, seguida pela referência de origem <src>
, seguida de dois pontos :
, seguida pela ref de destino <dst>
.
A ref remota que corresponde <src>
é buscada e, se <dst>
não for uma cadeia vazia, a ref local que corresponde a ela é encaminhada rapidamente usando<src>
. Se o plus opcional+
for usado, a referência local será atualizada mesmo que não resulte em uma atualização de avanço rápido.
Veja também
Git checkout e mesclar sem tocar na árvore de trabalho
Mesclando sem alterar o diretório de trabalho