web-dev-qa-db-ja.com

復帰したGitコミットを「元に戻す」にはどうすればよいですか?

commitを使用してコミットした後にrevertを使用して元に戻す変更を考えた場合、その変更を元に戻すための最善の方法は何ですか?

理想的には、これは履歴を書き換えないように新しいコミットで行われるべきです。

366
JimmidyJoo

まだその変更をプッシュしていないのであれば、git reset --hard HEAD^

そうでなければ、復帰を元に戻すことは完全に問題ありません。

別の方法はgit checkout HEAD^^ -- .そして次にgit add -A && git commitです。

290
Adam Dymitruk

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

元に戻すを元に戻すと、同じことが行われますが、コミットメッセージが煩雑になります。
git revert <commit sha of the revert>

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

354
Stephan

復帰コミットは、gitの他のコミットとまったく同じです。つまり、次のように元に戻すことができます。

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

それは明らかに変更がプッシュされたとき、そして特にあなたが目的のブランチにプッシュを強制することができないときにのみ意味があります(これはあなたのmasterブランチには良い考えです)。変更がプッシュされていない場合は、他の投稿と同様にチェリーピック、元に戻す、または単に元に戻すコミットを削除してください。

私たちのチームでは、メインブランチでコミットされたRevertコメントに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'

このようにして、あなたは歴史をたどって物語全体を理解することができます、そして、遺産の知識がない人でさえ彼ら自身のためにそれを解決することができました。あなたがチェリーピックまたはものをリベースした場合、この貴重な情報は失われます(コメントに含めない限り)。

明らかに、コミットが一度以上戻ったり戻ったりした場合、それはかなり面倒になります。

10
Nestor Milyaev

あるいはgit checkout -b <new-branch>git cherry-pick <commit>を前に、そしてgit rebaserevert commitにドロップすることもできます。以前と同様にプルリクエストを送信します。

2
Ryan Chou

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

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

weird history

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

2
RredCat

元に戻すことはトリックをするでしょう

例えば、

If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,

それから、

git revert ghijkl

これは復帰を元に戻します

2
Rafeeque KP

これが私のやり方です。
分岐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
それから私は新しいブランチにpull requestをしました。

1
Drew LeSueur

「復帰を元に戻す」という考えが気に入らない場合(特にそれが多くのコミットで履歴情報を失うことを意味する場合)、いつでも 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
0

コミット後に元に戻された、ステージングされていない段階的な変更を元に戻すには、次のようにします。

git reset HEAD@{1}

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

git ls-files -d | xargs git checkout --
0
Richa Goyal