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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top