мерзавец: перемещение головы ветви - PullRequest
29 голосов
/ 18 марта 2012

У меня есть две ветки git, "A" и "B", и коммиты пронумерованы от 1 до 8. Моя история выглядит так

1 -> 2 -> 3 -> 4[A] -> 5 -> 6 -> 7 -> 8[B]

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

1 -> 2 -> 3 -> 4 -> 5 -> 6[A] -> 7 -> 8[B]

То есть я хочу переместить заголовок ветви A из коммита 4 в коммит 6.

Какие команды я использую для этого?

Ответы [ 3 ]

44 голосов
/ 18 марта 2012

Вы можете запустить:

git branch -f A 6
13 голосов
/ 18 марта 2012
git checkout A
git reset --hard 6
7 голосов
/ 19 марта 2012

Это особый случай перебазирования, просто ветвь пуста:

git checkout A
git rebase B

rebase является более общим;он также обрабатывает этот случай:

До:

                  A1 -> A2 -> [A]
                /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]

После:

                                      A1' -> A2' -> [A]
                                     /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]

A1 'и A2' объединяются для учета дельты между 4 и 8в родительской ветви.

Git rebase обрабатывает этот тривиальный случай без хлопот.Я создал репо с двумя коммитами на master и веткой br, указывающей на первый коммит.

$ git checkout br
Switched to branch 'br'
$ git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded br to master.

Пуф, готово.Теперь в журнале отображается ветвь, указывающая на второй коммит.

Мы также можем достичь этого «После»: [спасибо М. Флашену за то, что он указал, что это пропало]:

                            A1'' -> A2'' -> [A]
                           /
1 -> 2 -> 3 -> 4  -> 5 -> 6 -> 7 -> 8[B]

Вместо того, чтобы переходить к ветви B, мы бы назвали конкретный коммит 6, например,

git checkout A
git rebase 6   # rather than rebase B

Когда нет коммитов А1 и А2, это сводится к первоначальному вопросу: перемещение указателя [A] из 4до 6.

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