Как переместить ветку назад в 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
которые должны быть сохранены, то следующее должно сделать трюк:
- Сделайте резервную копию вашего репо (на всякий случай)
-
git checkout A
-
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
не удаляет мои коммиты, работает отлично, спасибо.