290

ここで少し問題が発生28sしました。Git に問題固有のブランチがあり、それを一般ブランチにマージしましたdevelop。あまりにも速すぎたことが判明したため、git-revert を使用してマージを元に戻しました。しかし、今度は にマージする時が来ましたが28sdevelopgit-merge コマンドは元のマージを確認し、すべてが順調でブランチが既にマージされていることを喜んでアナウンスします。私は今何をしますか?「Revert "Revert "28s -> development""」コミットを作成しますか? それを行うには良い方法ではないようですが、現時点では他に想像できません.

ツリー構造は次のようになります。

Git ログ出力

4

8 に答える 8

203

「元に戻す」必要があります。元に戻す方法によっては、思ったほど簡単ではないかもしれません。このトピックに関する公式文書を見てください。

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

許可する:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

しかし、それはすべて機能しますか?確かにそうです。マージを元に戻すことができます。純粋に技術的な角度から見ると、git は非常に自然にそれを行い、実際の問題はありませんでした。
「マージ前の状態」から「マージ後の状態」への変更と見なされただけで、それだけでした。
複雑なこと、奇妙なこと、本当に危険なことは何もありません。Git は何も考えずに実行します。

したがって、技術的な観点からは、マージを元に戻すことに何の問題もありませんが、ワークフローの観点からは、一般的に避けるべきことです

たとえば、メイン ツリーにマージされた問題を見つけた場合は、マージを元に戻すのではなく、可能な限り次のことを試してください

  • 問題をマージしたブランチに分割し、修正するだけです。
  • または、それを引き起こした個々のコミットを元に戻そうとします。

はい、それはもっと複雑ですし、いいえ、常にうまくいくとは限りません (答えは、「おっと、まだ準備ができていなかったのでマージすべきではなかったので、実際にはすべて元に戻す必要がある」という場合もあります)。マージ")。したがって、実際にはマージを元に戻す必要がありますが、マージをやり直したい場合は、元に戻すことによって実行する必要があります。

于 2009-07-03T07:35:17.540 に答える
72

そんな経歴をお持ちだとしましょう

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

A、B はコミットに失敗し、W - は M の復帰です

そのため、見つかった問題の修正を開始する前に、ブランチへの W コミットのチェリーピックを行います

git cherry-pick -x W

次に、ブランチで W コミットを元に戻します

git revert W 

修正を続けることができた後。

最終的な履歴は次のようになります。

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

PR を送信すると、PR が undo revert であり、いくつかの新しいコミットが追加されていることが明確に示されます。

于 2013-03-26T20:21:19.200 に答える
18

GIT で元に戻すには:

git revert <commit-hash-of-previous-revert>
于 2018-08-09T21:06:47.037 に答える
6

使用する代わりに、ブランチgit-revertでこのコマンドを使用して、間違っマージコミットを破棄 (元に戻す) することができます (元に戻すのではなく)。devel

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

これにより、それに応じて作業ディレクトリの内容も調整されます。注意してください

  • 変更内容もによって消去されるため、develop ブランチに変更を保存します(間違ったマージのため) git-reset。引数として指定したコミット以降のすべてのコミットは削除されgit resetます!
  • また、リセットによって履歴が書き換えられるため、変更が他のリポジトリから既にプルされている場合は、これを行わないでください。

git-resetこれを試す前に、マンページを注意深く読むことをお勧めします。

ここで、リセット後、変更を再適用してdevelから行うことができます

git checkout devel
git merge 28s

これは、最初のマージ (現在は git の履歴から消去されています) のようなから28sへの実際のマージになります。devel

于 2009-07-05T14:29:09.860 に答える