28

リポジトリにいくつかのコミットがあります:

お気に入り:

A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

ここで、E は私が行った最新のコミットです。ここで、機能 C で行った変更を取り除きたいのですが、D と E で追加した変更を保持したいと考えています。

あなたが私を助けてくれることを願っています。

ありがとうございました

4

8 に答える 8

45

インタラクティブなリベースはあなたの友達です!

他の人が言ったように:

$ git rebase -i HEAD~5

...ここ-iでインタラクティブフラグでありHEAD~5、インタラクティブリベースに最後の5つのコミットを含めることを意味します。

上記を発行した結果としてエディターが起動したら、開いたファイルのコメントを見てください。

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

あなたにとって重要なのは、ここで行を削除すると、コミットが失われるということです。

そのため、削除したいコミットを参照する行を削除し、保存して閉じると、git が残りを処理します (コミットの性質と削除しようとしている復帰によっては、いくつかの競合を修正する必要がある場合があります)。 )。

あなたがすでにコードをプッシュし、他の人がそれをプルしている場合、あなたのブランチをチェックアウトした誰かが次にプッシュしたときにコミットがそこに戻ってくるため、上記の方法は機能しないことに注意することが重要です。インタラクティブなリベースは、コミットの記録がない範囲でコミットを削除するため、他のクローンはそれらが削除されたことを知りません。次にプッシュするとき、ローカル クローンは、削除したオブジェクト (コミット) がオリジンにないことを「確認」するため、それらを復元しようとします。

于 2013-07-16T11:22:41.980 に答える
9

実際に「コミットを削除する」(タイトルで指定されているように) ではなく、「変更を取り除く」(質問本文で指定されているように) だけが必要な場合、簡単なオプションは新しいコミットを追加することです。以前のコミットが行ったことの。

これは絶対確実というわけではなく、それ以降に行われた変更によって競合が発生する可能性がありますが、履歴は変更されず、取り消しとその理由を文書化でき、他の作業コピーとうまく連携できます。

git revert一連のコミットのこのような邪悪な双子を作成するために使用されるツールです。

于 2013-07-16T12:15:00.313 に答える
2

これを行うには、次の手順に従います。

git rebase -i HEAD~3

次に、コミットCを一番下に移動すると、次のようになります

D - Added Feature D
E - Added Feature D
C - Redesigned Feature C

保存して終了したら、

git reset HEAD^

これにより、コミット C が取り消されます。

于 2013-07-16T11:13:25.617 に答える
-1
git reabse -i HEAD~3

最後の 3 つのコミット メッセージのリストが表示されます。

C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

元に戻したいコミットの前に x git reset HEAD^ を挿入するだけで、コミット C を元に戻したいので、このようになります

    C - Redesigned Feature C
x git reset HEAD^
    D - Added Feature D
    E - Added Feature D

rebase コンソールを終了すると、コミットがログに記録されなくなり、ファイルがステージングされていることがわかります。

于 2013-07-16T15:27:15.120 に答える