3

私は 8 つのコミットのようなものを編集していた大きなインタラクティブなリベースを行っていました。これは で行われgit commit --amendます。私の問題は、ある時点で気付かなかったマージの競合が発生したことです。そのため、素朴に修正とgit rebase --continue-ingを続けました。どうやら複数のコミットを 1 つに修正したようで、リベースの終了後に約 4 つのコミットがなくなりました。変更は他のコミットに修正されました。

これらの修正を元に戻す方法、またはなくなったコミットを再適用する方法はありますか?

もちろん; 1 つの解決策は、戻ってリベースをやり直すことですが、リベースでかなり多くの編集を行ったので、すべての作業をやり直す必要がないようにしたいと考えています。どうやってこの苦境に陥ったかは別の話です。

Git ツリーの例:

リベース前:A-B-C-D-E-F

リベース後: A-B-C-F(C は現在、D および E からの変更が修正されています)

4

3 に答える 3

3

はい、できます。

通常、私はすぐに戻ってすべてをやり直しますが、問題は理解できます。すでにリベースに多くの時間を費やしているように思えます。

あなたの例の内容はF、まさにあなたが最終結果にしたいものであると思います. DandEコミットが欠けているだけです.

あなたができることはこれです:

git checkout C             # "git status" should be empty right now
git checkout F .
git reset .
git add only-changes-from-D ; git commit -m D
git add only-changes-from-E ; git commit -m E
git add -A ; git commit -m F

git checkout F . ; git reset .、作業ディレクトリに が含まれるようにしますFが、HEAD はまだ を指してCおり、インデックスには何もありません。とgit statusの間の完全な差分が表示されます。CF

ここで、お気に入りの追加/コミット ツール (私は が好きですgit gui) を使用して、最初に属していたすべての変更を選択し、コミットDします。について繰り返しEます。その後は、からの変更のみFが存在します。一度に追加してコミットできます。もちろん、間にもっとある場合EF、すすぎと繰り返しが必要です。

これには、実際には何も変更する必要がないという利点があります。最終結果は正確Fになりますが、必要に応じていくつかの中間コミットを取得します。

于 2017-01-03T08:56:15.113 に答える