元に戻されたGitコミットを「元に戻す」方法を教えてください。


486

を使用してコミットされcommit、次にを使用して元に戻された変更がある場合、revertその元に戻すを元に戻す最善の方法は何ですか?

理想的には、履歴を書き直さないように、新しいコミットでこれを行う必要があります。



@phuclv重複の可能性のあるコメントをここに示します。1つはオリジナルのマークを付け、もう1つは重複のマークを付ける必要があります
John Demetriou

@JohnDemetriouより良い答えのセットがある質問は開いたままにしておく必要があります。時間はここでは関係ありません重複した質問はどのように処理する必要がありますか?
phuclv

時間については言いませんでした。私はたまたまこの問題について2つのうちの1つについてコメントしました
John Demetriou

回答:


385

その変更をまだプッシュしていない場合は、 git reset --hard HEAD^

それ以外の場合は、復帰を完全に元に戻します。

もう1つの方法はgit checkout HEAD^^ -- .、それを行うことgit add -A && git commitです。


8
元の変更をすぐにマスターブランチに適用せずに元に戻す場合は、(1)元のブランチが削除された場合は元に戻し、(2)Adamの指示に従って元に戻すブランチで [元に戻す]をクリックしてから、( 3)結果のPRのヘッダーにある[編集]をクリックし、ターゲットブランチをマスターではなく元のブランチに変更します。これで、元のブランチを再マージして、以前に元に戻された変更を有効にすることができます。
pauljm 2014

1
これにより、作業ツリーとインデックスのすべての変更が削除されます。git stashを使用して、失いたくない変更を保存します。
zpon

3
チェックアウト&&コミットメソッドの利点は何ですか?一般的な場合、git cherry-pickまたは別のgit revert方法では、復帰を元に戻す最も簡単な方法のようです。
ロバートジャックウィル

5
次の方法を示してからOtherwise, reverting the revert is perfectly fine.、何git checkout HEAD^^ -- .が行われているかを説明すると役立つと思います。
トッド

3
git add -Aすべてのファイルをバージョン管理に追加したい場合を除いて、使用しないでください。これは、たいていの場合、望んでいないことです。
カイテン

474

git cherry-pick <original commit sha>
元のコミットのコピーを作成し、基本的にコミットを再適用します

元に戻すと、同じことが行われますが、より厄介なコミットメッセージが表示されます。
git revert <commit sha of the revert>

これらのいずれの方法でもgit push、復帰後に新しいコミットが作成されるため、履歴を上書きせずに実行できます。
commit shaを入力するとき、通常必要なのは最初の5文字または6文字だけです。
git cherry-pick 6bfabc


61
これは簡単に、OPの質問に対する最もエレガントで完全なソリューションです。コミットツリーのHEADにあるリバートコミットについての仮定があるため、受け入れられた回答よりもはるかに優れています。オペレーションはまた、履歴を書き換えないソリューションを具体的に求めたため、受け入れられた回答で提供されたハードソリューションは単に間違っています。
Timo

6
@Timo明確にするために、受け入れられた回答には、私が使用したソリューション(「復帰を元に戻す」)が含まれており、質問から数時間以内に投稿されました- この回答よりも明らかに3年前です。したがって、チェックマーク。
JimmidyJoo 2017

6
@JimmidyJoo私は3年遅れていたと思います。グーグル検索からここに来て人々がより良い答えを見つけたかっただけです
Stephan

2
@Stephan Yepですが、繰り返しになりますが、問題を解決するために使用したのではなく、より良い答えです。チェックマークがどこにあるのかをコメントしました。全員への質問:SOの慣習では、過去の質問を「維持」し、新しい回答があったときにチェックマークを再割り当てするように指示していますか?
JimmidyJoo

3
@JimmidyJoo私はSOの慣習について何も知りません。しかし、グーグルサーチャーとして、私は本当により良い答えがチェックされるのを見たいと思っています。そして、過去の質問を維持するための誰かの努力に感謝します。
Paiman Roointan

30

コミットを元に戻すは、gitの他のコミットと同じです。つまり、次のようにして元に戻すことができます。

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

これは明らかに、変更がプッシュされて初めて意味があり、特に宛先ブランチにプッシュを強制できない場合(これはマスターブランチに適しています)です。変更がプッシュされていない場合は、他の投稿と同様に、チェリーピック、元に戻す、または単に元に戻すコミットを削除するだけです。

私たちのチームでは、主なブランチでコミットされたRevertコミットをに戻すというルールを使用しています。これは主に履歴をクリーンに保つため、どのコミットが何をに戻すかを確認できるようにするためです。

      7963f4b2a9d   Revert "Revert "OD-9033 parallel reporting configuration"
      "This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
                    ...
     a0e5e86d3b6    Revert "OD-9055 paralel reporting configuration"
     This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
                ...
     Merge pull request parallel_reporting_dbs to master* commit 
    '648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'

このようにして、履歴を追跡し、全体のストーリーを把握できます。また、遺産の知識がない人でも自分で解決できます。一方、ものを選択したりリベースしたりすると、この貴重な情報は失われます(コメントに含めない限り)。

明らかに、コミットが元に戻されて複数回戻された場合、それはかなり厄介なものになります。


14

元に戻すことはトリックを行います

例えば、

もし abcdef、あなたがコミットされ、ghijklであるあなたがコミット戻ったときにあなたが持っているコミットしabcdef、その後、実行します。

git revert ghijkl

これは元に戻ります


4

私にはバカに見えます。しかし、私は同じ状況にあり、コミットを元に戻しました。私は番号を元に戻したので、「コミットを元に戻す」ごとに元に戻す必要がありました。

今私のコミット履歴は少し奇妙に見えます。

奇妙な歴史

ペットプロジェクトなので大丈夫です。しかし、実際のプロジェクトでは、元に戻す前に最後のコミットに進み、すべての元に戻されたコードを1つのコミットとより合理的なコメントで復元します。


4
:鉱山の別の質問への回答に興味ができるstackoverflow.com/questions/10415565/...
JimmidyJoo

2
自動コミットを回避し、復帰時に--no-commitフラグを使用してメッセージをコミットすることを選択し、関連するメッセージでコミットすることができます
David Barda

また、git revertを使用する場合は、複数のコミットIDを指定できます(正しい順序である必要があると思います)。
Aalex Gabi

githubデスクトップから実行できますか?
ギヨームF.

4

ここに私がそれをした方法があります:
ブランチmy_branchnameが元に戻されたマージに含まれていた場合。そして私は元に戻したいと思いましたmy_branchname

最初にgit checkout -b my_new_branchnameからを行いmy_branchnameます。
それから私はないgit reset --soft $COMMIT_HASHところ$COMMIT_HASH、右のハッシュをコミットコミットされた前に、最初のコミットmy_branchname(参照git log
その後、私は新しいコミット作るgit commit -m "Add back reverted changes"
それから私は新しい枝を押し上げるgit push origin new_branchname
その後、私は新しいブランチのプルリクエストを行いました。


「チェリーピック」が多すぎて実行できない場合の方法。この回答に賛成票が少ない理由はわかりません
Fundhor

2

それとも、可能性git checkout -b <new-branch>git cherry-pick <commit>の前とgit rebase降下にrevertコミット。以前と同様にプルリクエストを送信します。


1

「復帰を元に戻す」という考えが気に入らない場合(特に、多くのコミットの履歴情報が失われることを意味する場合)は、「障害のあるマージを元に戻す」に関するgitドキュメントをいつでも参照できます。

次の開始状況を考えると

 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E   <-- fixed-up topic branch

(WはマージMの最初の復帰です; DとEは最初に壊れた機能ブランチ/コミットの修正です)

コミットAからEを単純に再生できるようになりました。これにより、元のマージに「所属」するものはなくなります。

$ git checkout E
$ git rebase --no-ff P

これで、ブランチの新しいコピーをmaster再びマージできます。

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E

良いアイデアとドキュメントリンクへの感謝。通常、マージする前にマスターでリベースしますが、gitはA '、B'、C 'が以前のものと同じであることを認識しているように見え、W(pastebin)の後にD、Eができました。これを解決する方法についての提案?
Kristoffer Bakkejord

0

コミット後に元に戻されたステージングされていない変更とステージングされた変更を元に戻すには:

git reset HEAD@{1}

ステージングされていないすべての削除を復元するには:

git ls-files -d | xargs git checkout --
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.