以前の2つのコミットをロールバックする方法は?


83

このシナリオを検討してください。

  1. 開発者Aはコミットを行います: #n
  2. 開発者 Bはコミットします +1を
  3. 開発者 Aはコミットします +2を
  4. #n +3をコミットします

そして、彼のコミット#n + 2で、彼が欠陥を導入したことを発見します。

どのように開発できますか。彼の最後の2つのコミットをロールバックし、コミット#n + 1で開発を続けますか?

git reset --hard HEAD~2*を試しましたが、開発者Aのコミット#nに戻ってきました。


2
その時点でBコミットをプルした場合、git reset HEAD〜2は#n +1コミットにリセットする必要があります。あなたはそれらを引っ張ったのですか?
Snowbear 2011年

1
...#n +2コミットの前ではありません。[0] Bが#n commit+ 1をプッシュ、[1] A committed#n + 2、[2]が失敗push、[3] pull、[4]pushでした。したがって、githubには、コミット(#n + 2)とマージブランチ 'master'(#n + 3)があります。
Marius Butuc 2011年

2
コミットをすでに公開している場合は、リセットを使用してコミットをロールバックしないでください。(あなたに知られていない他の開発者が引っ張った場合、これは苦痛を引き起こします。)代わりに、revertを使用して、あなたが望む状態にあなたを連れて来る新しいコミットをします。公開された履歴は絶対に変更しないでください。book.git-scm.com/を
William Pursell 2011年

回答:


122

n +1コミットに戻るはずです。おそらくそこにもマージコミットがあります。あなたはまたすることができますgit reset --hard <sha1_of_where_you_want_to_be>

警告!!--hard現在行っているコミットされていない変更は永久に破棄されることを意味します。


2
リモートコミットのsha1を取得するにはどうすればよいですか(私は実行しません)?を使用してみましたgit reflogが、ローカルのreflog情報にしかアクセスできません。たとえば、コミット#n、#n + 2、#n + 3 ...で、#n + 1ではありません
Marius Butuc 2011年

13
必要なsha1をaから取得しましたgit logが、agit push -fも必要だったため、変更はgithubに反映されます。
Marius Butuc 2011年

1
はい、でもリモコンも更新したいとは思いませんでした:)
Adam Dymitruk 2011年

25
警告!!--hard現在行っているコミットされていない変更は永久に破棄されることを意味します。作業を破棄せずに前のコミットにロールバックするには、を使用します--soft
ケンM.ハガティ2015

4
--softの代わりに--hardの使用について説明してください
iuridiniz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.