Перемещение завершается с мастера на ветку с помощью git

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

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

  • Исходная фиксация
  • Commit 1
  • Commit 2
  • Commit 3

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

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

Ответы

Ответ 1

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).


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

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

git checkout correctbranch
git rebase tmp
git branch -d tmp

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