Como você rebase as alterações da filial atual em cima das alterações que estão sendo mescladas?

144

OK. Se eu estiver em uma ramificação (digamos working) e desejar mesclar as alterações de outra ramificação (digamos master), então eu executo o comando git-merge masterenquanto estiver na workingramificação, e as alterações serão mescladas sem refazer o histórico. Se eu executar git-rebase master, as alterações masterserão reinscritas para serem colocadas na parte superior da minha workingramificação. Mas e se eu quiser mesclar as alterações, mastermas refazer minhas alterações workingpara estar no topo? Como faço isso? Isso pode ser feito?

Eu poderia executar git-rebase workingno meu masterramo para colocar minhas alterações no topo master, mas gostaria de poder fazer isso no meu workingramo, e não tenho ideia de como. O mais próximo que posso pensar em criar é criar uma nova ramificação mastere, depois disso, refazer workingas alterações, mas então eu teria uma nova ramificação em vez de alterar a workingramificação.

Jonathan M Davis
fonte

Respostas:

255

Você tem o que rebasefaz de trás para frente. git rebase masterfaz o que você está solicitando - pega as alterações no ramo atual (desde a divergência com o mestre) e as repete em cima master, depois define o chefe do ramo atual como o chefe dessa nova história. Ele não repetir as mudanças de masterno topo do ramo atual.

hobbs
fonte
3
@ Jonathan é legal. Este é um tópico um pouco complicado. By the way, git rebase workingse moveria master's mudanças (após o ponto que workingramificou-se) para estar no topo do workingramo - mas isso não é uma coisa muito sensata a fazer para master:)
Hobbs
66

Outra maneira de ver isso é considerar git rebase mastercomo:

Rebase a ramificação atual em cima de master

Aqui, ' master' é o ramo upstream , e isso explica por que, durante um rebase, ourse theirsé revertido .

VonC
fonte
Isso também explica por que LOCAL e REMOTE são revertidos. Obrigado.
AVIDeveloper
@AVIDeveloper em LOCAL e REMOTE, você também pode ler stackoverflow.com/a/3052118/6309
VonC
5
@@ VonC: Obrigado. Sim, depois de passar uma tarde resmungando comigo mesma: "REMOTE é meu ramo .. LOCAL não é meu", tudo se encaixou. Honestamente, eu preferiria ver os nomes dos ramos (ou abrev. SHA) em vez de REMOTE / LOCAL / nossos / deles / meus. Meus pensamentos são os mesmos em relação à git difftoolhorrível esquerda / direita. Meio fora de tópico, mas difftooleu gosto do git-meld e gosto de nomes como 'working-dir', 'stash @ {0}', etc.
AVIDeveloper 23/07
1
@VonC: Você pode explicar como pode ser isso depois que fazemos: git checkout branch_to_update git rebase mastereu recebo no git log os commits do master no topo da ramificação local, e não o contrário?
JavaSa
1
@JavaSa Isso é estranho, a menos que a recuperação não tenha sido concluída corretamente? Você pode precisar fazer uma pergunta separada com mais detalhes.
VonC