Como posso me mover de compromisso do porta -malas para um ramo no Git?
-
24-09-2019 - |
Pergunta
Fiz um monte de compromissos com o Mestre e percebi após o fato de que eles deveriam estar em um ramo.
Eu olhei para várias coisas sobre rebasing, fundir e redefinir o mestre. Mas nenhuma tentativa de manipulação produziu uma história que se parece com o que estou tentando fazer.
Minhas tentativas me levam a acreditar que requer alguma combinação de rebase --onto
e reset --hard
Para mover o mestre de volta no tempo. Mas minha compreensão das ramificações de Git deixa algo a desejar. Parte de fazer isso é aprender como posso usá -lo.
Deve -se notar nenhuma das mudanças que estou tentando me mover, foi empurrada para fora.
Atual
* remote/trunk
--o--a--b--c--d--e--f <- master
|
o <- remote branch foo
Resultado desejado
* remote/trunk
--o <- master
|
o--a--b--c--d--e--f <- remote branch foo
Solução
Não tenho certeza de que renomear os galhos é a solução certa, pois seria de: de:
* remote/trunk
--M--a--b--c--d--e--f <- master
|
F <- remote branch foo
para:
--F <- master
|
M--a--b--c--d--e--f <- remote branch foo
* remote/trunk
(desde que você renomeie remote/foo
, o que não é aconselhável: você deve rastreá -lo primeiro e depois renomeá -lo, mas mesmo que o resultado final seja diferente do que você precisa)
Qual não é o "resultado desejado" que você deseja (Foo precisa começar de F, não M):
* remote/trunk
--M <- master
|
F--a--b--c--d--e--f <- remote branch foo
Você só pode conseguir isso através de um rebase --onto
git checkout --track -b origin/foo # create a local branch named after the remote one
git branch tmp # mark current foo HEAD to 'F'
git branch -f foo master # put foo where it should b: at 'f'
git branch -f master tmp^ # reset master to M, parent of tmp
git checkout tmp # go to where we must replay the commits
git rebase --onto tmp master foo # replay a to f on top of tmp
git svn dcommit # push the local foo in order to update remote/foo
dando-lhe:
* remote/trunk
--M <- master
|
F--a'--b'--c'--d'--e'--f' <- local foo and remote branch foo
Outras dicas
Uma variação da resposta de Martin que não será necessariamente aplicável à sua situação, mas eu quero postar de qualquer maneira :)
Suponha que você esqueceu de criar o ramo no compromisso o
, Então você tem:
x--y--z--o--a--b--c--d--e--f master
|
+
[forgot to make a branch here]
E então você percebeu que o que realmente queria era:
x--y--z--o master
|
+--a--b--c--d--e--f topic
O que você pode fazer neste caso é criar um ramo em o
Usando seu hash:
git branch topic # creates new branch 'topic' - will be at commit `f`
git checkout o -b newmaster # creates new branch called newmaster pointing on commit `o` (please replace `o` with the actual hash)
git branch -M newmaster master # force rename newmaster to master (means master points on hash `o`)
Você estará no ramo mestre (comprometimento o
), então, como último passo, você pode:
git checkout topic
O hash, é claro, pode ser apenas os primeiros 5 caracteres.
EDITAR
Não deve importar muito que você esteja usando git-svn
, o que realmente importa é que você não publicou sua filial mestre em nenhum momento depois o
Um ramo em Git não passa de um ponteiro para um compromisso. É por isso que a ramificação é tão barata: você apenas cria um ponteiro e tem uma filial.
No entanto, não sei sobre rastrear ramos remotos, pode ser necessário configurá -lo após renomear/mover suas filiais.
Quase correto o que Hasen J sugere, mas eu tive que fazer algumas pequenas modificações (e uso Git-SVN):
# create the branch with your commits
git branch performance
# fork the master to a new branch at the commit before your local, non pushed commits
git branch newmaster 2d0516dfe8252de87
# checkout your branch
git checkout performance
# rename the newmaster
git branch -M newmaster master
# now checkout the master
git checkout master
Você não pode renomear uma filial em que você está, então eu verifiquei a filial de desempenho onde mudei minhas confirmações.