Подтвердить что ты не робот

Git: перемещение головки

У меня есть две ветки 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]

То есть, я хочу переместить голову ветки А из фиксации 4, чтобы совершить 6.

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

4b9b3361

Ответ 1

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

git branch -f A 6

Ответ 2

git checkout A
git reset --hard 6

Ответ 3

Это особый случай rebase, только ветка пуста:

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, мы будем называть конкретное commit 6, например.

git checkout A
git rebase 6   # rather than rebase B

Если нет A1 и A2, это сводится к исходному вопросу: перемещение указателя [A] с 4 до 6.