Redefinir outro ramo para atual sem um check-out

110

Estou escrevendo alguns scripts para meu fluxo de trabalho Git.

Eu preciso redefinir outro branch (existente) para o atual, sem check-out.

Antes:

 CurrentBranch: commit A
 OtherBranch: commit B

Depois de:

 CurrentBranch: commit A
 OtherBranch: commit A

Equivalente a

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Observação --soft: não quero afetar a árvore de trabalho.)

Isso é possível?

Alexander Gladysh
fonte
Alguém sabe se isso também é possível no Egit?
zedoo

Respostas:

84

Os fluxos de trabalho que você descreve não são equivalentes: ao executar, reset --hardvocê perde todas as alterações na árvore de trabalho (você pode querer fazer isso reset --soft).

O que você precisa é

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
P Shved
fonte
3
Cara, eu queria que isso funcionasse sem o supérfluo refs/heads/...
ELLIOTTCABLE
41
Uma maneira muito melhor de fazer isso é git push . current:other. Isso funciona sem refs/heads(/ cc @elliottcable) e também impede que você atualize o branch em check-out. Observe que você pode precisar passar -f (ou usar +current:other) se a atualização não for um avanço rápido.
Lily Ballard
4
Você também pode usar o -m 'some text'argumento para registrar o motivo da atualização ref a ser mostrada por git reflog OtherBranchcomando, como "sincronizado com CurrentBranch". Pode ser útil lembrar por que você fez isso mais tarde.
Levi Haskell
18
Por que você usaria git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchou git push . CurrentBranch OtherBranchquando poderia usar o muito mais limpo (IMO) em git branch -f OtherBranch CurrentBranchvez disso? (Veja minha resposta em git branch -f abaixo)
Colin D Bennett
1
@BenHymers Portanto, a página do manual para "git push" é uma mentira. Ele descreve o comando como "Atualizar referências remotas ...". quando na verdade ele pode atualizar refs locais muito bem.
Kaz
228

Definido otherbranchpara apontar para o mesmo commit que currentbranchexecutando

git branch -f otherbranch currentbranch

A -fopção (forçar) diz que git branch sim, realmente pretendo substituir qualquer otherbranchreferência existente pela nova .

Da documentação :

-f
--force

Redefina para se já existir. Sem -f, o git branch se recusa a alterar um branch existente.

Colin D Bennett
fonte
6
Esta é a resposta mais fácil. Obrigado!
Robert Karl
Eu entendo fatal: Cannot force update the current branch.quando tento fazer isso.
Fuad Saud
4
@FuadSaud isso é porque você já fez otherbranchcheck-out. Esta questão SO é especificamente sobre redefinir outro branch para um commit diferente (ou seja, não redefinir o branch em check-out). O que você deseja fazer é redefinir o branch atual com git reset targetbranchpara forçar o branch atual a ser apontado targetbranch. Adicione --hardtambém para forçar a árvore de trabalho a esse conteúdo. Ou --softdeixar o índice sozinho e apenas alterar o próprio ramo.
Colin D Bennett
Certo, então, eu sei sobre reset. O que eu procurava era uma maneira de, dentro de uma rotina, sempre apontar o master local para o upstream / master, independentemente do que foi verificado. Eu pensei que branch -fpoderia fazer isso.
Fuad Saud
9
Imo, essa deve ser a resposta aceita. Isso melhorou muito meu fluxo de trabalho!
guitarra letal de
23

Você pode sincronizar com este comando suas filiais a qualquer momento

$ git push . CurrentBranch:OtherBranch -f

Também sem -f ele substitui este conjunto de comandos

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

Pode ser útil quando você não precisa comprometer todos os seus arquivos em CurrentBranch e, portanto, não pode alternar para outros branches.

Denis Kuznetsov
fonte
Pode causar "remote: error: denying non-fast-forward"
Basilevs
3
Eu não incluiria a -fopção a menos que seja absolutamente inevitável. Funciona bem sem ele no meu caso.
Melebius