Git のルールは、履歴が共有、公開、またはプッシュされた後は、履歴を変更しようとしてはならないということです。もちろん、本当にそうしたい場合や十分な権限がある場合はそうすることができますが、他の人を台無しにする可能性があるため、細心の注意を払って行う必要があります。
幸いなことに、単一のアップストリーム リポジトリ (オリジン) を備えた典型的な Git の展開があり、それが宇宙のすべての善と真実のソースである場合git pull --rebase
、心ゆくまで使用することができ、完全に安全であり、私の意見ではあなたはもっと正気な(つまり直線的な)歴史を持っています。私と私のチームはそれを継続的に使用しています。
ただし、複数のリモートを持ち始めてgit pull --rebase <arguments>
、毎回同じターゲットに対してリベースしなくなったり、プライマリ アップストリームで実行する前にブランチを別のリポジトリにプッシュし始めたりすると、問題が発生し始める可能性があります。git pull --rebase
変更を別のリモート/リポジトリと共有してから、それらの変更を変更するときはいつでも(コミットメッセージ/コンテンツが変更されていなくても、変更の値がSHA、親などの変更に等しい場合)、人を台無しにすることができます誰が古い変更をしたか。
rebase sanity の範囲を超えない限り、それはあなたgit pull --rebase
にとって非常に良いことです。
git pull --rebase
それは、エラー、との違いについての質問には答えませんgit fetch && git rebase @{u}
。先に進んで、私は何の違いも認識していないと言います。違いがあるとしても、Git を何年も使用してきた間に気付かなかったほど微妙です。おそらく、複数のリポジトリがあり、「オリジン」がこのブランチの上流ではない場合、ブランチがフェッチする必要がある正しいリポジトリをシステムが把握するということですか?
そして、たとえ git-rebase で非常にうまくいかなかったとしても、もちろん、git log -g
and/orを使用して元のリベース前の環境に簡単に戻すことができますgit reset --hard ORIG_HEAD
。強制プッシュを行わないでください (ほとんどすべての Git サーバーでデフォルトで許可されていません)。
編集済み
時間が経つにつれて、私の理解は広がりました。git pull --rebase
リベース作業を行うための呼び出しgit rebase
なので、その意味ではそれらの間に違いはありません。ただし、 git-pull は実際に呼び出しますgit rebase --onto @{u} $(git merge-base HEAD @{u}@{1})
OK、その構文 ("@{u}@{1}") はおそらく少し不透明で、起動を単純化していますが、要点は、fetch コマンドを実行する前に、アップストリームへのマージ ベースが何であったかを検出することです。これはどのような違いを生むのでしょうか?
まあ、通常の場合はありません。ただし、アップストリームが指している場所を変更している場合、またはアップストリーム自体がリベースされている場合は、かなりの数になります。アップストリームが書き直されてからgit rebase @{u}
、古いコミットがどれだけ書き直されたかによっては、非常に不幸になり、二重コミットや競合が発生する可能性があります。
ただし、背後にある魔法git pull --rebase
は、あなたのものであり、あなたのものだけが @{u} の上に適用されます。
OK、これも簡略化です。アップストリームが 100 コミット前からリベースを実行し (実際には履歴には 101 件以上のコミットがあります) 、実行git fetch
前にを実行したgit pull --rebase
場合、Git は適切な履歴マージベースが何であったかを正確に判断できません。あなたのローカルコミットは.
その結果、git fetch
有害と見なされます (ローカル コミットがあり、アップストリームが書き換えられた場合)。ただし、実際の経験則は、「共有、公開、またはプッシュされた後は履歴を変更しようとしないこと」であり、これが私が始めたところです。
TL;DR:
git fetch
有害と見なされます (したがって、 を使用しますgit pull --rebase
)。また、共有、公開、またはプッシュされた後は、履歴を変更しようとしないでください (とりわけ、git fetch
有害になるため)。