Заголовок не является очень четким. Что я на самом деле должен сделать, часто следующее:
Скажем, у меня есть разработка, продолжающая несколько фиксаций c1, c2... и 3 ответвления A, B, C
c1--c2--c3--(B)--c4--(A,C)
Ответвление A и C в той же фиксации.
Теперь я хочу, чтобы ответвление возвратилось, где B, так, чтобы это было похоже на это:
c1--c2--c3--(A,B)--c4--(C)
Важный то, что это должно произойти локально и на GitHub.
Используйте подкоманду сброса:
git checkout A
git reset --hard B
git push --force github
В качестве примечания, вы должны быть осторожны при использовании git reset
, когда ветка уже была перенесена в другое место. Это может вызвать проблемы у тех, кто уже проверил ваши изменения.
Если на ветке A
нет коммитов, то git reset --hard B
решение, данное Брэмом Шонмакерсом, будет работать.
Однако если есть коммиты в ветке A
, которые должны быть сохранены, то следующее решение должно сработать:
git checkout A
git rebase -i --onto B SHA1-A^
. ...где SHA1-A^
- идентификатор коммита родительской ветки A
Подробности смотрите на странице git rebase
man page.
ПРИМЕЧАНИЕ: При этом история будет переписана (как это всегда делает rebase). Следует обратить особое внимание, если ваша ветка A
была когда-либо выложена в публичное репо.
Удалите ветку как локально, так и удаленно, воссоздайте ветку, отправьте ветку обратно на сервер.
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
в ветке, которая была перенесена в удаленное репо, они могут вызвать массу проблем для вас или кого-либо еще, использующего это репо.