Как переместить ветку назад в git?

Название не очень понятно. Что мне действительно нужно делать часто, так это следующее:

Допустим, у меня идет разработка с несколькими коммитами c1, c2,... и 3 ветками A, B, C

c1--c2--c3--(B)--c4--(A,C)

Ветви A и C находятся в одном коммите.

Теперь я хочу, чтобы ветвь A вернулась туда, где B, чтобы она выглядела так:

c1--c2--c3--(A,B)--c4--(C)

Важно то, что это должно происходить локально и на GitHub.

Ответ 1

Используйте подкоманду reset:

git checkout A
git reset --hard B
git push --force github

Как побочный элемент, вы должны быть осторожны при использовании git reset, пока ветвь уже была нажата в другом месте. Это может вызвать проблемы для тех, кто уже проверил ваши изменения.

Ответ 2

Если в ветки A нет git reset --hard B будет работать решение git reset --hard B данное Брэмом Шенмейкером.

Однако, если есть коммиты ветки A которые должны быть сохранены, то следующее должно сделать трюк:

  1. Сделайте резервную копию вашего репо (на всякий случай)
  2. git checkout A
  3. git rebase -i --onto B SHA1-A^

... где SHA1-A^ - идентификатор фиксации родителя вашей ветки A

Смотрите страницу руководства git rebase для подробностей.

ПРИМЕЧАНИЕ. Это переписывает историю (как всегда делает rebase). Особое внимание должно быть уделено, если ваша ветка A когда-либо была передана в публичное репо.

Ответ 3

Я обычно использую эту последовательность и нахожу ее самым простым способом:

git checkout B
git branch -f A B

Ответ 4

Удалите ветвь как локально, так и удаленно, заново создайте ветвь, нажмите ветвь на сервер.

git branch -d A
git push origin :heads/A
git branch B A
git push origin A:A

В качестве альтернативы вы можете использовать следующую команду для отмены последнего фиксации.

git revert c4

Что будет выглядеть так:

c1--c2--c3--(B)
             \
              c4--(C)
               \
                (^c4)--(A)

где (^c4) - это фиксация, которая отменяет c4

Я не рекомендую использовать rebase или revert на ветке, которая была нажата на удаленное репо, они могут вызвать массу проблем для вас или для кого-либо другого, использующего это репо.

Ответ 5

Я сделал это, и git reset --hard не удаляет мои коммиты, работает отлично, спасибо.