мерзавец ветка несколько коммитов назад? - PullRequest
3 голосов
/ 05 ноября 2010

Вот текущая настройка ветки:

A---B---C-----------------D---E---F master
         \
          G---H---I---J---K---L branchA

Я понял, когда начал работать над branchA, что последние несколько коммитов были для новой функции, которая должна быть новой веткой. Поэтому я хочу, чтобы дерево выглядело так:

A---B---C-----------------D---E---F master
         \
          G---H---I------------M branchA
                   \
                    J---K---L branchB

Я не хочу переименовывать ветку, так как это переименует G, H и I в новое имя ветви. Я могу создать новую ветку, начиная с I (git branch branchB <SHA-of-I>), но как лучше «переместить» коммиты J, K и L? git merge branchA в то время как на ветке B просто перематывает вперед ветку B в ту же точку, что и ветка A.

Ответы [ 3 ]

6 голосов
/ 05 ноября 2010

Вам не нужно перемещать J, K и L. Вы хотите их на ветви B? Сделайте так, чтобы BranchB указывал на фиксацию L.

git branch branchB branchA    # start branch B at commit L
git checkout branchA
git reset --hard <SHA1-of-I>

# If you don't want to check out branchA, you could use
#     git branch -f branchA <SHA1-of-I>

То, что нужно переместить, - это branchA , которое перемещается назад, чтобы совершить I.

Если коммит M уже был сделан, вам нужно будет использовать rebase. Вместо сброса ответвления A используйте git rebase --onto <SHA1-of-I> <SHA1-of-L> branchA, чтобы переместить все после коммита L в ответвлении A на коммит I.

0 голосов
/ 06 ноября 2010

Я не понимаю вашего беспокойства по поводу G, H, я появляюсь на ветви B вместо ветви A.Я имею в виду, что если вы переименуете свой branchA в branchB и ответвите от I, чтобы создать новый branchA, и подтвердите M на branchA, вы получите то, что хотите.

Насколько я знаю, ветви просто называются заголовками, указывающими на конкретные коммиты (смотрите .git / refs / head), а остальная часть дерева определяется исключительно отношениями родитель-потомок в git.Даже если вам каким-то образом удастся переустановить JKL на новую ветку B и зафиксировать M в свободном месте, данные объекта будут идентичны.И M, и J указывали бы на I как на своих родителей, а G / D указывали на C как на своих родителей, а остальные просто указывали на своих непосредственных родителей.Я что-то здесь упускаю?

0 голосов
/ 05 ноября 2010

Вы пробовали использовать git rebase ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...