リモートブランチを切り替えて追跡するこれら2つのコマンドの違いを知っている人はいますか?
git checkout -b branch Origin/branch
git checkout --track Origin/branch
どちらもリモートブランチを追跡しているので、Originのブランチに変更をプッシュできると思いますか?
実用的な違いはありますか??
ありがとう!
2つのコマンドの効果は同じです( それを指摘してくれたRobert Siemerの回答に感謝します )。
実用的な違いは、異なる名前のローカルブランチを使用する場合です:
git checkout -b mybranch Origin/abranch
はmybranch
を作成し、Origin/abranch
を追跡しますgit checkout --track Origin/abranch
は、異なる名前のブランチではなく、 'abranch
'のみを作成します。(つまり、 コメント通りSebastian Graf によって、ローカルブランチがnotがすでに存在していた場合。
もしそうなら、あなたはgit checkout -B abranch Origin/abranch
が必要でしょう)
まず、背景:Trackingは、ローカルブランチのアップストリームがリモートブランチに設定されていることを意味します。
# git config branch.<branch-name>.remote Origin
# git config branch.<branch-name>.merge refs/heads/branch
git checkout -b branch Origin/branch
は:
branch
をOrigin/branch
によって参照されるポイントに作成/リセットします。branch
を作成し( git branch
を使用)、リモートトラッキングブランチOrigin/branch
を追跡します。ローカルブランチがリモートトラッキングブランチから開始されると、Gitは
branch.<name>.remote
が適切になるようにブランチ(特にbranch.<name>.merge
およびgit pull
構成エントリ)をセットアップしますリモート追跡ブランチからマージします。
この動作は、グローバルbranch.autosetupmerge
構成フラグを介して変更できます。この設定は、--track
および--no-track
オプションを使用してオーバーライドでき、後でgitブランチ--set-upstream-to
を使用して変更できます。
そして、git checkout --track Origin/branch
は git branch --set-upstream-to
)と同じことをします:
# or, since 1.7.0
git branch --set-upstream upstream/branch branch
# or, since 1.8.0 (October 2012)
git branch --set-upstream-to upstream/branch branch
# the short version remains the same:
git branch -u upstream/branch branch
また、「branch
」のアップストリームを設定します。
(注:git1.8.0はgit branch --set-upstream
を廃止し、git branch -u|--set-upstream-to
に置き換えます: git1.8.0-rc1 Announce を参照)
ローカルブランチにアップストリームブランチを登録すると:
git status
とgit branch -v
の2つのブランチ間の関係を表示するように伝えます。git pull
引数なしで、新しいブランチがチェックアウトされたときに上流からプルするよう指示します。詳細については、「 既存のgitブランチでリモートブランチを追跡するにはどうすればよいですか? 」を参照してください。
違いはまったくありません!
1)git checkout -b branch Origin/branch
--track
および--no-track
がない場合、--track
がデフォルトとして想定されます。デフォルトは、branch.autosetupmerge
の設定で変更できます。
実際には、1)git checkout -b branch --track Origin/branch
のように動作します。
2)git checkout --track Origin/branch
「便宜上」、--track
なしの-b
は-b
を意味し、-b
への引数は「ブランチ」であると推測されます。推測は、構成変数remote.Origin.fetch
によって駆動されます。
実際には、2)git checkout -b branch --track Origin/branch
のように動作します。
ご覧のとおり:違いはありません。
しかし、それはさらに良くなります:
3)git checkout branch
「ブランチ」がまだ存在しないが「オリジン/ブランチ」が存在する場合、git checkout -b branch --track Origin/branch
と同等です1。
3つのコマンドはすべて、「ブランチ」の「アップストリーム」を「オリジン/ブランチ」に設定します(または失敗します)。
アップストリームは、引数なしのgit status
、git Push
、git merge
、したがってgit pull
の参照ポイントとして使用されます(そのように構成されている場合(デフォルトまたはほぼデフォルト)。
例えば。 git status
は、アップストリームが設定されている場合、どれだけ上流または下流にいるかを示します。
git Push
は、デフォルトで現在のブランチを上流にプッシュするように構成されています2 git 2.0以降。
1 ...そして、「Origin」が「branch」を持つ唯一のリモートである場合
2 デフォルト(「シンプル」という名前)alsoは、両方のブランチ名が等しくなるように強制します
本 は、これらのコマンドが同じ効果をもたらすことを示しているようです。
単純なケースは、先ほど見た例で、git checkout -b [branch] [remotename]/[branch]を実行しています。 Gitバージョン1.6.2以降を使用している場合は、-trackの短縮形も使用できます。
$ git checkout --track Origin/serverfix
Branch serverfix set up to track remote branch serverfix from Origin.
Switched to a new branch 'serverfix'
リモートブランチとは異なる名前でローカルブランチをセットアップするには、異なるローカルブランチ名で最初のバージョンを簡単に使用できます。
$ git checkout -b sf Origin/serverfix
これは、bashまたはoh-my-zshのgit補完でOrigin/serverfix
の名前を取得できる場合に特に便利です。--track
(または-t
)を追加するだけで、準備が整います。