web-dev-qa-db-ja.com

git checkout --track Origin / branchとgit checkout -b branch Origin / branchの違い

リモートブランチを切り替えて追跡するこれら2つのコマンドの違いを知っている人はいますか?

git checkout -b branch Origin/branch
git checkout --track Origin/branch

どちらもリモートブランチを追跡しているので、Originのブランチに変更をプッシュできると思いますか?

実用的な違いはありますか??

ありがとう!

169
yorch

2つのコマンドの効果は同じです( それを指摘してくれたRobert Siemerの回答に感謝します )。

実用的な違いは、異なる名前のローカルブランチを使用する場合です

  • git checkout -b mybranch Origin/abranchmybranchを作成し、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は:

  • branchOrigin/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/branchgit 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にgit statusgit branch -vの2つのブランチ間の関係を表示するように伝えます。
  • git pull引数なしで、新しいブランチがチェックアウトされたときに上流からプルするよう指示します

詳細については、「 既存のgitブランチでリモートブランチを追跡するにはどうすればよいですか? 」を参照してください。

233
VonC

違いはまったくありません!

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 statusgit Pushgit merge、したがってgit pullの参照ポイントとして使用されます(そのように構成されている場合(デフォルトまたはほぼデフォルト)。

例えば。 git statusは、アップストリームが設定されている場合、どれだけ上流または下流にいるかを示します。

git Pushは、デフォルトで現在のブランチを上流にプッシュするように構成されています2 git 2.0以降。

1 ...そして、「Origin」が「branch」を持つ唯一のリモートである場合
2 デフォルト(「シンプル」という名前)alsoは、両方のブランチ名が等しくなるように強制します

26
Robert Siemer

は、これらのコマンドが同じ効果をもたらすことを示しているようです。

単純なケースは、先ほど見た例で、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)を追加するだけで、準備が整います。

5
Pat