Переместить коммиты из мастера на ветку с помощью git - PullRequest
60 голосов
/ 15 сентября 2010

Я пытаюсь узнать, как эффективно использовать Git, и мне интересно, как я должен (хорошая практика / плохая практика?) Решить следующий случай:

Скажем, у меня есть следующая цепочка коммитов вmaster:

  • Первоначальный коммит
  • Коммит 1
  • Коммит 2
  • Коммит 3

Тогда я понимаю, чтото, что было сделано в двух последних коммитах, совершенно неверно, и мне нужно начинать с коммита 1 снова.Вопросы:

  • Как мне это сделать?
  • Могу ли я переместить коммит 2 и 3 в отдельную ветку, чтобы сохранить для дальнейшего использования (скажем, они не так уж и плохи)и продолжить работу с коммита 1 на мастере?

1 Ответ

73 голосов
/ 15 сентября 2010
git branch tmp            # mark the current commit with a tmp branch
git reset --hard Commit1  # revert to Commit1

Ответ SO " В чем разница между" git reset "и" git checkout "в git? " весьма поучителен для операций такого типа

alt text

A git reset --hard HEAD~2 сделает то же самое (без необходимости сначала возвращать SHA1 для Commit1).

Поскольку Commit2 и Commit3 по-прежнему ссылаются на Git ref (здесь ветвь), вы все равно можете вернуться к ним в любое время, когда захотите (git checkout tmp).


На самом деле, Дариен упоминает в комментариях (относительно перемещения Commit2 и Commit3 в другую ветку):

Случайно зафиксированный в неправильной ветви, это позволяет мне переместить ее, did:

git checkout correctbranch
git rebase tmp
git branch -d tmp

Это работает здесь, поскольку начальная ветвь была сброшена до Commit1, что означает, что git rebase tmp будет воспроизводить каждый коммит после Commit1 (так что здесь Commit2и Commit3) к новому 'correctbranch'.

...