あなたがプッシュした場合、サーバーにコミットした後、それは(とローカルにコミット書き換えgit reset
、git rebase
、git filter-branch
書き換えられたことを押した後、または任意の他の歴史操作)、およびバックアップサーバーへのコミット、あなたが引っ張っていた他の誰を台無しにします。ここに例があります。Aをコミットし、サーバーにプッシュしたとしましょう。
-*-*-A <-マスター
-*-*-A <-発信元/マスター
ここで、前述の方法でAを書き換え、リセットして再コミットすることにします。これにより、ダングリングコミットAが残り、到達できないため、最終的にはガベージコレクションされます。
-*-*-A
\
A '<-マスター
-*-*-A <-発信元/マスター
他の誰かが、たとえばフレッドが、master
あなたがこれをしている間にサーバーからプルダウンした場合、彼らはAへの参照を持ちます。
-*-*-A '<-マスター
-*-*-A <-発信元/マスター
-*-*-AB <-フレッド/マスター
ここで、A 'をorigin / masterにプッシュできた場合、早送りではなくなり、履歴にAが含まれなくなります。したがって、フレッドがもう一度プルしようとした場合、彼は突然マージする必要があり、Aコミットを再導入します。
-*-*-A '<-マスター
-*-*-A <-発信元/マスター
-*-*-AB- \
\ * <-フレッド/マスター
A '-/
フレッドがたまたまこれに気づいた場合、彼はリベースを行うことができ、コミットAが再び現れるのを防ぎます。しかし、彼はこれに気づく必要があり、これを忘れないでください。また、Aを引き下げた人が複数いる場合は、ツリーで余分なAコミットが取得されないように、全員がリベースする必要があります。
そのため、他の人がそこからプルしたリポジトリの履歴を変更することは、一般的には良い考えではありません。ただし、そのリポジトリから他の人がプルしていないことがわかった場合(たとえば、それが自分のプライベートリポジトリであるか、プロジェクトを簡単に調整できる他の開発者が1人しかいない場合)、強制的に実行して更新:
git push -f
または
git push origin +master
これらは両方とも、非早送りプッシュのチェックを無視し、サーバーの内容を新しいA 'リビジョンに更新し、Aリビジョンを破棄して、最終的にはガベージコレクションされます。
receive.denyNonFastForwards
configオプションで強制プッシュが完全に無効にされている可能性があります。このオプションは、共有リポジトリではデフォルトで有効になっています。その場合、本当にプッシュを強制したい場合は、ブランチを削除して再作成するのが最善のオプションですgit push origin :master; git push origin master:master
。ただし、このdenyNonFastForwards
オプションは上記の理由で有効になっています。共有リポジトリでは、それを使用するすべての人が新しい履歴に基づいてリベースする必要があることを意味します。
共有レポジトリでは、一般的に、問題を修正する新しいコミットを上にプッシュする方が適切です。git revert
以前のコミットの変更を取り消すコミットを生成するために使用できます。