Используйте git rebase, чтобы задним числом сделать коммиты земли в другой ветке? - PullRequest
9 голосов
/ 15 января 2011

У меня есть коммиты:

 - 1 - 2 - 3 - 4 - 5 (HEAD, master)

Впоследствии я замечаю, что коммиты 2 и 3 действительно должны были пойти на свою собственную ветку. Они полностью независимы от коммитов 4 и 5. Могу ли я использовать git rebase для создания?

 - 1 - 4 - 5 (HEAD, master)
    \
     2 - 3 (TestBranch)

И самое главное, останутся ли SHA1 для Commit 2 и Commit 3 такими же, какими они были до перебазирования?

Ответы [ 2 ]

9 голосов
/ 15 января 2011

Во-первых, обратите внимание, что требуемый TestBranch просто указывает на текущий коммит 3; вам не нужно ничего делать, кроме git branch TestBranch <commit 3>, чтобы сделать это. Помните, что ветки - это просто указатели на коммиты. Это должно ответить на ваш вопрос о SHA1 коммитов 2 и 3. Вы не изменили эти коммиты вообще, поэтому их SHA1, конечно, одинаковы.

Чтобы получить текущую ветку (master) там, где вы хотите (коммиты 1, 4, 5), вы действительно сделаете ребаз. Это очень простой случай для его интерактивного режима. Сначала запустите:

git rebase -i <commit 1> master     # -i is a synonym for --interactive

Git запустит ваш редактор и покажет вам все коммиты, начиная с коммита 1 в вашей основной ветке (2,3,4,5), вместе с некоторыми подсказками о том, что делать. Вам просто нужно удалить строки для коммитов 2 и 3, затем сохранить и выйти. Затем он применяет то, что осталось (4 и 5), оставляя вас с тем, что вы хотите. Конечно, если коммиты 4 и 5 зависели от коммита 2 или 3, вы получите конфликты слияния, когда git попытается применить свои патчи во время ребазинга.

Обратите внимание, что это изменит изменения SHA1 коммитов 4 и 5, поскольку SHA1 коммита зависит от его родителя. Это будет мешать любому, кто потянул эту ветку. (Вас предупредили.) Ваш фактический конечный результат будет более точно описан так:

- 1 - 4' - 5' (HEAD, master)
   \
    2 - 3 (TestBranch)

Коммиты 4 'и 5' имеют те же различия, что и коммиты 4 и 5, но имеют разных родителей, поэтому они являются разными коммитами.

2 голосов
/ 15 января 2011

Если вы выберете 3, вы можете создать новую ветку TestBranch в этой точке и получить желаемую ветвь.

Затем вы можете вернуться к ветви master и интерактивно перебазировать ее с помощью git rebase -i HEAD~6, удалив 2 и 3, удалив их строки.

...