誤って間違ったブランチにコミットしました。そのコミットを削除するにはどうすればよいですか?
誤って間違ったブランチにコミットしました。そのコミットを削除するにはどうすればよいですか?
回答:
行った作業を維持しながら、最新のコミットを削除します。
git reset --soft HEAD~1
最新のコミットを削除して、実行した作業を破棄します。
git reset --hard HEAD~1
git reset --hard origin
git remote
は私のために起源をリストアップするgit reset --hard origin
と言いfatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
ます。どうして?
git reset HEAD~1
また、すべての変更を保持しますが、(--soft
オプションのように)すべてを保持するのではなく、空のインデックスを残します。
なぜ私が見つけた最良の答えがコメントだけにあるのだろう!(投票数86のDaenythによる)
git reset --hard origin
このコマンドは、ローカルリポジトリをリモートリポジトリと同期し、ローカルで行ったすべての変更を削除します。以下を実行して、オリジンにある正確なブランチをフェッチすることもできます。
git reset --hard origin/<branch>
git reset --hard origin/<branch>
git reset --soft origin/<branch>
、コミットを取り除き、ローカルの作業を維持したい場合。
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
:あなたが枝のように指定する必要があり、git reset --hard origin/feature/my-cool-stuff
削除しないでください。1つのコミットgit cherry-pick
で十分です。
しかし、間違ったブランチで複数のコミットがあった場合、それがgit rebase --onto
優れています。
これがあるとします:
x--x--x--x <-- master
\
-y--y--m--m <- y branch, with commits which should have been on master
、それからマークmaster
したい場所に移動します:
git checkout master
git branch tmp
git checkout y
git branch -f master
x--x--x--x <-- tmp
\
-y--y--m--m <- y branch, master branch
、yブランチを本来の場所にリセットします。
git checkout y
git reset --hard HEAD~2 # ~1 in your case,
# or ~n, n = number of commits to cancel
x--x--x--x <-- tmp
\
-y--y--m--m <- master branch
^
|
-- y branch
、最後にコミットを移動します(再適用して、実際に新しいコミットを作成します)
git rebase --onto tmp y master
git branch -D tmp
x--x--x--x--m'--m' <-- master
\
-y--y <- y branch
そのコミットを別のブランチに移動する場合は、問題のコミットのSHAを取得します
git rev-parse HEAD
次に、現在のブランチを切り替えます
git checkout other-branch
そしてへcherry-pick
のコミットother-branch
git cherry-pick <sha-of-the-commit>
git reset --hard HEAD~1
後で必要になります。reset --soft
ブランチを切り替えて再度コミットすると、余分な作業を省けると思います。次に、SourceTreeを使用して基本的なことのほとんどを実行していました。エラーが発生した後は、これをコマンドラインで実行するだけです。
参考までに、git reset --hardだけでなく、次のコマンドでも、現在のブランチからコミットを「ハードカット」できると思います。
git checkout -B <branch-name> <SHA>
実際、チェックアウトする必要がない場合は、次のようにブランチを好きなように設定できます。
git branch -f <branch-name> <SHA>
これは、たとえばブランチから新しいコミットをコピーするために(リベースを使用して)ブランチからコミットを削除するプログラム的な方法です。
他の場所からソースを取得してブランチにダンプしたため、マスターから切断されたブランチがあるとします。
これで、変更を適用したブランチができました。「トピック」と呼びましょう。
ここで、トピックブランチの複製を作成し、それをブランチ「dump」にあるソースコードダンプにリベースします。
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
これで、「dump」の開始点に基づいてブランチのtopic_duplicateに変更が再適用されますが、「master」以降に発生したコミットのみが適用されます。したがって、マスター以降の変更は「ダンプ」の上に再適用されますが、結果は「トピック_重複」になります。
次に、「dump」を「topic_duplicate」に置き換えることができます。
git branch -f dump topic_duplicate
git branch -D topic_duplicate
または
git branch -M topic_duplicate dump
または、ダンプを破棄するだけで
git branch -D dump
おそらく、現在の "topic_duplicate"をクリアした後でチェリーピックすることもできます。
私が言うことをしようとしていることは、あなたが現在を更新したい場合は、別の祖先のオフに基づいて枝を「複製」あなたが最初以前に実行してコミットを「cherrypicked」を削除しなければならないということですgit reset --hard <last-commit-to-retain>
かgit branch -f topic_duplicate <last-commit-to-retain>
、その後、メインから(上の他のコミットをコピーしますトピックブランチ)リベースまたはチェリーピッキング。
リベースは、すでにコミットされているブランチでのみ機能するため、それを行うたびにトピックブランチを複製する必要があります。
チェリーピッキングははるかに簡単です:
git cherry-pick master..topic
したがって、シーケンス全体は次のようになります。
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
トピック複製ブランチがチェックアウトされたとき。これにより、以前に選択したコミットが現在の複製から削除され、現在の「ダンプ」(異なる祖先)の上にある「トピック」で発生するすべての変更が再適用されます。別の「ダウンストリーム」マスターを使用しながら、「実際の」アップストリームマスターに基づいて開発を行い、ローカルの変更がまだ適用されるかどうかを確認するのは、かなり便利な方法のようです。あるいは、diffを生成して、Gitソースツリーの外部に適用することもできます。ただし、この方法では、実際の開発が実際のアップストリームマスターに反する一方で、ディストリビューションのバージョンに基づく最新の修正済み(パッチ済み)バージョンを維持できます。
だから単に示すために:
これが誰かを助けることを願っています。これを書き直すつもりでしたが、今はどうしようもありません。よろしく。