Как разделить git commit на две части на основе одного и того же родителя? - PullRequest
3 голосов
/ 24 февраля 2011

Я нахожусь на ветке foo, с родителем A:

---A---foo

Я хочу разделить изменения от A до foo на две ветви, обе на основе A. Я считаю, что могу сделать половину работыкак это:

git checkout -b halfFoo
git reset HEAD~
    # Only choose half the stuff.
git add -i
git commit

Это дает мне:

---A---foo
    \
     \-halfFoo

Я знаю, как это сделать (git checkout -b otherHalfFoo; git commit -a):

---A---foo
    \
     \-halfFoo
      \
       \-otherHalfFoo

Но то, что я хотел бы получить это:

---A---foo
   |\
   | \-halfFoo
    \
     \-otherHalfFoo'

Как я могу сделать это без необходимости проходить через 'git add -i' (и выбирать отрицательный из того, что былоснова выбрали для halfFoo?

Ответы [ 4 ]

3 голосов
/ 24 февраля 2011

Сначала вернитесь к предыдущей фиксации, оставив изменения с тех пор.Затем откройте ветку и примените некоторые изменения.Снова разветвитесь от исходной ветви и примените остальные изменения.

git branch original_tip_with_foo  # if you want a reference to the foo commit
git reset HEAD~
git stash
git branch branch_2  # we'll get there in a moment ...
git checkout -b branch_1
git stash pop
git add -p
# ... add your first set of changes, for the first branch ...
git commit -m'first set of changes'
git stash
git checkout branch_2
git stash pop
git add -p
# ... add your second set of changes ...
git commit -m'second set of changes'
1 голос
/ 24 февраля 2011

Самый простой способ это:

git checkout -b branch1 foo
git rebase -i A
git checkout -b branch2 foo
git rebase -i A

При появлении запроса удалите строки, содержащие коммиты, которые вам не нужны, и отметьте те, которые вам нужно отредактировать, буквой "e" вместо "pick".

0 голосов
/ 09 марта 2013

Используйте checkout -i, чтобы интерактивно выбрать нужные биты в одну половину и зафиксировать это.Затем используйте git revert на ветке со всем, чтобы удалить то, что вы разбили.

Из вашего примера на ветке foo с родителем A:

---A---foo

Создайте новую ветку и добавьте в интерактивном режимеизменения, которые вы хотите там:

git co -b halfFoo foo~
git checkout -i foo
git commit

Это дает:

---A---foo
    \
     \-halfFoo

Затем легко создайте ветку foo без элементов, выбранных для halfFoo, используя git revert:

git co -b otherHalfFooWithHistory foo
git revert halfFoo

---A---foo
    \     \-otherHalfFooWithHistory
     \-halfFoo

Это концептуально то, что вы хотите для otherHalfFoo, но у него есть история, когда существовал весь foo, а затем часть из него была удалена.Вы можете при желании очистить его с помощью merge --squash:

git co -b otherHalfFoo foo~
git merge --squash otherHalfFooWithHistory
git branch -D otherHalfFooWithHistory

---A---foo
   |\
   | \-halfFoo
    \
     \-otherHalfFoo
0 голосов
/ 24 февраля 2011

Из ваших графиков, чтобы добраться до последнего изображения из предпоследнего графика, снова оформите A, создайте новую ветвь и выберите вишню otherHalfFoo. Затем сбросьте --hard ветку с halfFoo на правильный коммит (возможно, HEAD ~ 1).

...