Как переместить ответвление назад в мерзавца?

Заголовок не является очень четким. Что я на самом деле должен сделать, часто следующее:

Скажем, у меня есть разработка, продолжающая несколько фиксаций c1, c2... и 3 ответвления A, B, C

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

Ответвление A и C в той же фиксации.

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

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

Важный то, что это должно произойти локально и на GitHub.

46
задан Michiel van Oosterhout 22 May 2019 в 06:10
поделиться

3 ответа

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

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

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

65
ответ дан 26 November 2019 в 20:21
поделиться

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

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

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

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

Подробности смотрите на странице git rebase man page.

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

25
ответ дан 26 November 2019 в 20:21
поделиться

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

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 в ветке, которая была перенесена в удаленное репо, они могут вызвать массу проблем для вас или кого-либо еще, использующего это репо.

1
ответ дан 26 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: