GitサブモジュールとGitサブツリーの比較
GITの外部依存関係を管理するには、正確なバージョン制御と独立したプロジェクト追跡が必要な場合はサブモジュールを使用します。特定のコミットを参照し、明確な分離を維持し、積極的に維持された依存関係に最適です。シンプルさが重要な場合はサブツリーを使用します。外部コードをリポジトリに直接マージし、セットアップの複雑さを減らし、新しい貢献者のコラボレーションを容易にするためです。
大規模なソフトウェアプロジェクトに取り組む場合、外部依存関係または共有コンポーネントを含めることが一般的です。 GITは、このような依存関係を管理するための2つの方法を提供します:サブモジュールとサブツリー。どちらもプロジェクトに別のgitリポジトリを埋め込みましたが、それらは非常に異なって動作し、明確なトレードオフを備えています。これは、ワークフローに適合するものを決定するのに役立つ実用的な比較です。

Gitサブモジュールとは何ですか?
Gitサブモジュールは、別のリポジトリでの特定のコミットへの参照です。サブモジュールを追加すると、Gitは外部リポジトリのコミットハッシュを記録し、メインプロジェクトに保存します。
サブモジュールの仕組み:
-
git submodule add <repo-url> <path></path></repo-url>
を実行して、レポを含めます。 - gitは、サブモジュールのURLとパスをリストする
.gitmodules
ファイルを作成します。 - 実際のコードは、サブモジュールディレクトリ内の別の
.git
フォルダーに存在します。 - サブモジュールでレポをクローニングするには、追加の手順が必要です。
git clone -recurse-submodules <main-repo>
または
git clone <main-repo> Gitサブモジュールアップデート - Init- Recursive
サブモジュールの長所:
- 独立して依存関係を隔離し、バージョン制御を維持します。
- 特定のコミットに固定して、安定性を確保することができます。
- サブモジュールの変更は、明示的に追跡および更新できます。
- 含まれているプロジェクトが個別に維持される場合は理想的です。
サブモジュールの短所:
- 貢献者の複雑さ:新しいチームメンバーは、サブモジュールコマンドを学習する必要があります。
- サブモジュールの更新をコミットするのを忘れがちです(例:サブモジュールの変更後)。
- 変更を引き出すには、サブモジュールを手動で更新する必要があります。
- CI/CDパイプラインは、サブモジュールを処理するために追加の構成が必要です。
サブモジュールは強力ですが、「git内のgit」のように感じることができます。その余分な層は摩擦を追加します。
Gitサブツリーとは何ですか?
Git Subtreeは、外部リポジトリの履歴をメインプロジェクトのサブディレクトリにマージします。サブモジュールとは異なり、外部参照はありません。コードはレポの一部です。

サブツリーの仕組み:
-
git subtree add
使用して、別のレポをサブディレクトリとして持ち込みます。 - 外部リポジトリの歴史は、プロジェクトの歴史に接ぎ木されています。
- 後で元のリポジトリから更新をプルして、変更を戻すことができます(必要に応じて)。
例:
git subtree add - -prefix = lib/my-dep <repo-url> main - squash
(使用--squash
あらゆるコミットで歴史を膨らまないようにするためにスカッシュ。)
更新する:
Git Subtree Pull - Prefix = lib/my-dep <repo-url> main - squash
サブツリーの長所:
- ユーザーにとってよりシンプル:特別なコマンドは必要ありません。正常に作業をクローニング、引っ張り、プッシュします。
- すべてが1つのリポジトリにあります。CIや新しい開発者向けの追加セットアップはありません。
- コードは自己完結型であり、配布が簡単です。
- 頻繁に変更する予定のないベンダーの依存関係に適しています。
サブツリーの短所:
- あなたのレポはサイズが大きくなります(特にあなたがスカッシュしない場合)。
- 局所的な変更を加えた場合、上流の変更をマージするのは難しい場合があります。
- コードと依存関係の間の明確な分離を失う。
- 使用している依存関係のバージョンを正確に追跡するのは難しい(文書化しない限り)。
Subtreeは、単純さのためにある程度のコントロールを交換します。オーバーヘッドなしで「コードだけ」が必要な場合に最適です。
いつ使用するの?
使用事例 | 推奨されるアプローチ |
---|---|
独立して進化し、積極的に維持される依存関係を追跡する必要があります。 | submodules |
あなたのチームは小さくても新品であり、Gitの複雑さを最小限に抑えたいと考えています。 | ✅サブツリー |
貢献者がクローンを作成し、すぐに作業を開始する必要があります。 | ✅サブツリー |
頻繁に含まれているリポジトリに貢献します。 | ✅サブモジュール(簡単な双方向同期) |
時々更新されたライブラリを埋め込みます。 | ✅サブツリー |
あなたはレポ膨満感を心配していて、きれいな歴史が欲しいです。 | submodules |
結論
- サブモジュールは、正確さと分離を提供しますが、ワークフローの複雑さを追加します。
- Subtreeは、物事をシンプルで自己完結型に保ちますが、プロジェクトの境界を曖昧にします。
きれいなアーキテクチャを大切にし、学習曲線を気にしない場合は、サブモジュールを使用してください。
特に小規模なチームや内部ツールのために、シンプルさと使いやすさを好む場合は、多くの場合、より良い選択です。
基本的に、それは次のとおりです。別のプロジェクトへの参照が必要ですか、それともそのコードだけですか?それに応じてサブモジュールまたはサブツリーを選択します。
以上がGitサブモジュールとGitサブツリーの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

gitリポジトリにサブツリーを追加するには、最初にリモートリポジトリを追加して履歴を取得し、次にGitmergeおよびgitread-treeコマンドを使用してサブディレクトリにマージします。手順は次のとおりです。1。gitremoteadd-fコマンドを使用して、リモートリポジトリを追加します。 2. gitmerge-srecursive-no-commitを実行して、ブランチコンテンツを取得します。 3。GitRead-Tree-Prefix =を使用して、プロジェクトをサブツリーとしてマージするディレクトリを指定します。 4.変更を送信して追加を完了します。 5.更新するときは、最初にgitfetchを繰り返し、マージとステップを繰り返して更新を送信します。この方法により、外部プロジェクトの履歴が完全で保守しやすくなります。

gitmerge-no-ffを使用して、たとえあなたが早送りすることができても、Gitを強制してマージコミットを作成するように強制します。 1. -NO-FFFパラメーターを使用して、ブランチの履歴を保存し、変更の原因を明確にします。 2。この方法は、コードレビューまたは監査中に特に役立ち、GitFlowなどの厳格なブランチ戦略でよく使用されます。 3.この操作は、gitconfig - globalalias.merge-noff '!gitmerge-no-ff'などのエイリアスまたはスクリプトを構成することで自動化できます。

はい、コマンドを使用して新しいgitブランチに切り替えることができます。特定の方法は次のとおりです。1。gitswitch-c:これはよりモダンで明確な方法です。たとえば、gitswitch-cnew-featureはすぐにNew-featureという名前のブランチを作成して切り替えます。 2。Gitcheckout-Bを使用:これは古いが一般的に使用される方法です。たとえば、Gitcheckout-Bnew-Featureは前者と同じ効果を持っています。注:GitswitchはGit2.23で導入され、古いバージョンではGitcheckoutを使用する必要があります。 Gitswitch-Cnewなど、他のブランチに基づいてブランチを指定できます。

tocleanlyremoveagitsubmodule、firstdeinitializeit withgitsubmoduledeinit-fpath/to/submodule、thendeleteitsfilesviarm-rf.git/modu les/path/to/submoduleandgitrm-fpath/to/submodule、およびfinallyremoveredentriesfrom.git/configand.gitmodulesbeforecommitting

rungitreflog - date = localtoviewrecentreceferenceChangESANDLOCATEDELETEDBYITSNAMEORCOMMITHASH.2.IDEDIFYTHECOMMITHASHJUSTBETEBETHE "deletedBranch" message inthereflogoutput.3.3.RecreatetheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTheTherは

gitユーザー名とメールボックスを設定する方法は、gitconfig - globaluser.nameおよびgitconfig - globaluser.emailコマンドを使用して、ID情報をグローバルに構成することです。特定の手順は次のとおりです。1。ユーザー名の設定:gitconfig - globaluser.name "yourname"を実行します。 2。メールボックスを構成します:gitconfig - globaluser.email "your.email@example.com"; 3.設定の確認:gitconfiguser.nameとgitcoを渡します

usegitmergetopReservistoryandcollaborate fely、特にforpublicbrancheslikemainordevelop.usegitrebaseTocreateaclean、linearhistoryはliearhistory whenwhenworcally foresharingchanges.mergecreatesanewcommitthatiesbrancheatheathertogetherを紹介します

リポジトリにプッシュされたが履歴を維持しているコミットを取り消すには、GitRevertを使用して、指定されたコミットの変更を逆転させる新しいコミットを作成します。 1。gitlog-- Onelineを使用して、ターゲットコミットのハッシュ値を見つけます。 2。GitrevertまたはGitreverthead〜2などを実行して、特定のコミットを取り消す。 3.紛争がある場合は、手動で解決し、GitRevertを続行します。 4.提出情報を編集および確認できます。 5。マージされたコミットの場合、-M1パラメーターを追加する必要があります。この方法は、共有支店にとって安全であり、履歴の書き換えによって引き起こされる問題を回避します。
