ヤダヤダ悪い歴史の書き直しです。
しかし、リモートブランチからいくつかのコミットを永久に削除するにはどうすればよいですか?
ヤダヤダ悪い歴史の書き直しです。
しかし、リモートブランチからいくつかのコミットを永久に削除するにはどうすればよいですか?
回答:
あなたgit reset --hard
ワーキングツリーとインデックスからの変更を削除し、あなたのためにあなたのローカルブランチgit push --force
リモートに自分の改訂ローカルブランチを。(ここに他の解決策、リモートブランチを削除してそれを再プッシュすることを含む)
このSOの回答は、特に人々が自分のローカルリポジトリのリモート履歴に依存している場合、そのようなコマンドの危険性を示しています。マニュアルページの「UPSREAM REBASE
からの復旧」セクションに人々を指摘する準備をする必要がありgit rebase
ます。
Git 2.23(2019年8月、9年後)では、新しいコマンドを使用しますgit switch
。
つまり:(削除するコミットの数に
置き換えます)git switch -C mybranch origin/mybranch~n
n
これにより、インデックスと作業ツリーが復元されますgit reset --hard
。
push --force
離れて
git gc
リモート側で常に十分な頻度で実行されるとは限りません。たとえば、GitHubの場合:twitter.com/githubhelp/status/387926738161774592
last_working_commit_id
機能していないコミットを元に戻すときは、
git reset --hard <last_working_commit_id>
したがって、必要のないものにリセットしcommit_id
てはなりません。
次に、リモートブランチにプッシュする必要があります。
git push --force
git reset --hard
、実行することになっています。
このチュートリアルには3つのオプションがあります。リンクが切れた場合は、ここで主な手順を行います。
1完全なコミットを元に戻す
git revert dd61ab23
2最後のコミットを削除する
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
または、ブランチがローカルで利用可能な場合
git reset HEAD^ --hard
git push <<remote>> -f
ここで、+ dd61 ...はコミットハッシュであり、gitはx ^をxの親として解釈し、+は強制的な高速でないプッシュとして解釈します。
3リストからコミットを削除する
git rebase -i dd61ab23^
これが開き、すべてのコミットのリストを示すエディターが表示されます。取り除きたいものを削除します。リベースを終了し、フォースをレポにプッシュします。
git rebase --continue
git push <remote_repo> <remote_branch> -f
たとえば最後の3
コミットを削除する場合は、次のコマンドを実行して、ローカルブランチのファイルシステム(作業ツリー)とコミット履歴(インデックス)から変更を削除します。
git reset --hard HEAD~3
次に、ローカルマシンで次のコマンドを実行して、リモートブランチにその履歴を強制的に書き換えさせます。
git push --force
おめでとう!全部終わった!
いくつかのメモ:
次のコマンドを実行すると、目的のコミットIDを取得できます
git log
そして、あなたは置き換えることができHEAD~N
て<desired-commit-id>
、このように:
git reset --hard <desired-commit-id>
ファイルシステムの変更を保持し、インデックス(コミット履歴)を変更するだけの場合は、などの--soft
フラグを使用しますgit reset --soft HEAD~3
。次に、最新の変更を確認し、それらのすべてまたは一部を保持または削除する機会があります。後者の場合、runnig git status
はから変更されたファイルを表示します<desired-commit-id>
。--hard
オプションを使用git status
すると、ローカルブランチがリモートブランチとまったく同じであることを通知します。--hard
norを使用しない--soft
場合、デフォルトのモードであるが使用されます--mixed
。このモードでgit help reset
は、言う:
インデックスをリセットしますが、作業ツリーはリセットしません(つまり、変更されたファイルは保持されますが、コミットのマークは付けられません)。更新されていないものを報告します。
同様にこのブログ投稿に基づいて、pctrollの回答から簡略化します。
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
この問題を修正する最も簡単な方法は、コードが適切であることがわかっている場所から新しいブランチを作成することです。その後、後でそこから他のコミットを選択する必要がある場合に備えて、誤ったブランチ履歴をそのままにしておくことができます。これにより、コミット履歴も失われなくなりました。
ローカルの誤ったブランチから:
git log
ブランチを配置したいコミットハッシュをコピーしてgitログを終了します
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
これで、思い通りの方法で新しいブランチができました。
新しいブランチにないエラーのあるブランチからの特定のコミットも保持する必要がある場合は、必要な特定のコミットを簡単に選択できます。
git checkout the_errant_branch
git log
適切なブランチにプルし、gitログを終了するために必要な1つのコミットのコミットハッシュをコピーします。
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
背中をなでます。