リモート ブランチには、削除したいコミットがいくつかあります。たとえば、履歴が次のようになっている場合:
A->B->C->D
C と D を削除して、次の情報を提供したいと思います。
A->B
B は現在 HEAD ですか?
リモート ブランチには、削除したいコミットがいくつかあります。たとえば、履歴が次のようになっている場合:
A->B->C->D
C と D を削除して、次の情報を提供したいと思います。
A->B
B は現在 HEAD ですか?
コミットを削除するさまざまな方法と、それらをいつ使用する必要があるかについて説明します。 これらのいずれかを行う前に、安全のためにブランチを別のブランチにコピーすることを強くお勧めします。
これを実行してから、実行git checkout -b copy_branch
して元のブランチに戻りますgit checkout the_branch_i_want_to_delete_from_again
あなたの場合のように、すでにプッシュしている場合は、#3 にスキップできますが、プッシュしていない場合は、1 と 2 を見ることができます。
1) 私はまだプッシュしていないか、単独で作業しており、削除したいコミットは最新のコミットです:
私が持っている場合: A---B---C---D
CとDを削除したい。
それからするgit reset --hard sha_of_B
その結果: A---B
あなたの場合のように、すでにプッシュしている場合でも、この方法で実行してからgit push --force origin the_branch
を実行できますが、このプロジェクトで作業している他の人を台無しにする可能性があるため、これはお勧めできません。代わりに #3 に従う必要があります。
2) まだプッシュしていないか、単独で作業しており、削除したいコミットがブランチの途中にあります:
私が持っている場合: A---B---C---D
Cを削除したい。
git rebase -i sha_of_B_the_commit_before_the_one_i_want_to_delete
これにより、非常に便利なインタラクティブなリベース画面が開きます。
pick sha_of_C C
pick sha_of_D D
git が「# ここで行を削除すると、コミットが失われます。」と表示されます。 それが私たちがやろうとしていることです。
行を削除すると、次のようにpick sha_of_C C
なります。
pick sha_of_D D
:wq を使用して vi に保存すると、次のようになります。
A---B---D
あなたの場合のように、すでにプッシュしている場合でも、この方法で実行してからgit push --force origin the_branch
を実行できますが、このプロジェクトで作業している他の人を台無しにする可能性があるため、これはお勧めできません。代わりに #3 に従う必要があります。
3)私はすでにプッシュしており、他の人と協力しています:
A---B---C---D があり、C と D を削除したい場合。
それからする
git revert sha_of_D
ここで競合を解決してからコミットする必要がある場合があることに注意してください。それからする
git revert sha_of_C
ここで競合を解決してからコミットする必要がある場合があることに注意してください。
これにより、次の結果が得られます。
A---B---C---D---Reverted_D---Reverted_C
これは、C と D のすべての変更を元に戻すコミットを追加するだけなので、プッシュしても安全です。基本的には削除します。
git push --force
どうしても必要な場合を除き、一般的には絶対に避けるべきです。しかし、プッシュ フォースを実行しようとしている場合は、保護を使用してください。そうする前に、必ずブランチのコピーを作成する必要があります。すでにプッシュしている場合は、通常、#3 に固執することをお勧めします。
うまくいけば、これは役に立ちます。
ダン
最後のコミットを削除するには
$ git reset --hard HEAD^
最新の 2 つのコミットを削除するには
$ git reset --hard HEAD~2
ブランチをローカルにダウンロードできます。次に、コミットを削除し、プッシュ --force を実行します
$ git pull origin
$ git checkout origin/<branchname>
$ git checkout -b <branchname>
$ git reset --hard HEAD~2
$ git push origin <branchname> --force