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?


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

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.