web-dev-qa-db-ja.com

gitの履歴がクリスマスツリーのように見えるのはなぜですか?

git log --decorate --oneline --graphクリスマス直前のリポジトリの1つで、次の構造が出現したことがわかりました(うっすらとお祭りのテーマを強調するために回転しました)。

redacted git log output, rotated to look like a Christmas tree

コミットグラフのこのパターンはどのようにして発生しましたか?

もちろん、これは意図的に多少ばかげていますが、興味深い点があります。git履歴ブラウザーで特定のパターンをコミットグラフに表示すると、解釈する方法がわかりにくい場合があります。

69
Mark Longair

この場合、リポジトリの1つのクローンのmasterブランチの先端にプッシュされていないコミットがあったという状況でした。次に、同じリポジトリでgit pullが何度も実行されましたが、アップストリームで多くの新しい作業が行われていました。 (この場合、自動化されたスクリプトが原因で発生しましたが、開発者がブランチを最新の状態に保つために、たとえば、リベースするのではなく、繰り返しブランチにプルするだけでも同じことが起こります。)

masterには常にmasterアップストリームにはないコミットがあったため、新しいコミットがアップストリームになるたびにプルするたびに新しいマージコミットが作成されました。

最終的に、このリポジトリのマスターブランチからの履歴は上流にプッシュされたため、他の開発者は、次に上流のリポジトリからプルしたときに、この構造をコミットグラフに突然表示しました。

同じような構造の履歴があり、この問題の原因となったコミット/開発者を見つけたい場合は、到達するまで、星を含む行(基本的にはすべてのマージの最初の親の後に続く)を確認できます最初の非マージコミット。写真のケースでは、それはb275805 —以前にプッシュされたはずのコミットでした。

これが、人々がgit pull --rebaseの使用を好む理由の1つです。これにより、プッシュされていない履歴がシンプルになります。

期日までにクレジットを表示するために、私の同僚 Matthew Somerville がこれを発見し、何が起こっているのかを解明しました。

36
Mark Longair