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


208

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

git checkout -b branch origin/branch
git checkout --track origin/branch

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

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

ありがとう!

回答:


280

2つのコマンドには同じ効果があります(指摘するためのRobert Siemerの回答のおかげです)。

名前のローカルブランチ使用した場合の実用的な違いが来る異なっを

  • git checkout -b mybranch origin/abranch作成mybranchして追跡しますorigin/abranch
  • git checkout --track origin/abranch' abranch' のみが作成され、別の名前のブランチは作成されません。

(つまり、ローカルのブランチがまだ存在しない場合、Sebastian Grafによってコメントされたように。存在する 場合、必要になります)
git checkout -B abranch origin/abranch


注:Git 2.23(2019年第3四半期)では、新しいコマンドgit switchを使用します。

git switch -c <branch> --track <remote>/<branch>

ブランチが複数のリモートに存在し、そのうちの1つがcheckout.defaultRemote構成変数によって名前が付けられている場合、<branch>すべてのリモート間で一意でなくても、曖昧さをなくすためにそのブランチを使用します。
たとえばcheckout.defaultRemote=origin<branch>あいまいであるが「元の」リモートに存在する場合、常にそこからリモートブランチをチェックアウトするように設定します。

ここで、「-c」は新しい「-b」です。


まず、いくつかの背景:追跡とは、ローカルブランチのアップストリームがリモートブランチに設定されていることを意味します。

# 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ます。

ローカルブランチがリモート追跡ブランチから開始されると、Gitbranch.<name>.remotebranch.<name>.mergegit pullはリモート追跡ブランチから適切にマージされるようにブランチ(特に構成エントリ)をセットアップします
この動作は、グローバルbranch.autosetupmerge構成フラグを使用して変更できます。その設定は--trackおよび--no-trackオプションを使用してオーバーライドでき、後でgit branchを使用して変更できます--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に伝える 2つの枝の間の関係を示しているgit statusgit branch -v
  • 引数なしで指示git pull する新しいブランチがチェックアウトされたときに、上流からプルするします。

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


1
@VonC私はあなたがたまたま追加情報として言及した小さな詳細を探していました。私の場合、いくつかのブランチで許可されているのにgit pull、リモートブランチからのプルを要求するブランチがあったのはなぜかと気になりました。初めて、ピアが作成したリモートブランチをチェックアウトしている場合、gitはbranch.<BNAME>.remote=origin続行してローカルのgitconfigに追加します。その後、発行することができますgit pull。しかし、あなたがブランチを作成しているのであればgit checkout -b BNAME、git-もちろん-は知りません。したがって、リモートを指定する必要があります。
batilc 16

@batilc「初めて、ピアが作成したリモートブランチをチェックアウトしている場合」はい、git-scm.com / docs / git-checkoutを読んで、私は見ます: " If <branch>が見つかりませんが、<remote>名前が一致する1つのリモート(これを呼び出す)に追跡ブランチが存在します。$ git checkout -b <branch> --track <remote>/<branch>"
VonC

@VonC私はこれのためのより良い構成を見つけました。セットアップbranch.autoSetupMergealways私たちが話しているか簡単に実行します。この設定のデフォルトはtrueです。つまり、リモートブランチをチェックアウトするときにのみ追跡が実行されます。trueローカルに作成されたブランチの追跡を設定しません。
batilc 16

@batilc同意する。明示的にトラッキングを設定することを好むため、常に使用することはありませんが、あなたの場合、それは正しい設定であるはずです。
VonC、2016

1
「gitブランチ--set-upstream-toブランチアップストリーム/ブランチ」は正しい構文ではありません。「gitブランチ--set-upstream-toアップストリーム/ブランチブランチ」
maharvey67

33

全然違いはありません!

1) git checkout -b branch origin/branch

no --trackとnoがある--no-track場合--trackは、デフォルトとして想定されます。デフォルトはの設定で変更できますbranch.autosetupmerge

実際には、1)はのように動作しgit checkout -b branch --track origin/branchます。

2) git checkout --track origin/branch

「便宜上」は含意--trackせず、への引数は「分岐」であると推測されます。推測は、構成変数によって駆動されます。-b-b-bremote.origin.fetch

実際には、2)はのように動作しgit checkout -b branch --track origin/branchます。

ご覧のとおり、違いはありません。

しかし、それはさらに良くなります:

3) git checkout branch

またgit checkout -b branch --track origin/branch、「branch」がまだ存在せず、「origin / branch」が1の場合も同等です。


3つのコマンドはすべて、「branch」の「upstream」を「origin / branch」に設定します(または失敗します)。

上流の基準点として使用される引数以下git statusgit pushgit merge従ってgit pull(デフォルトまたはほぼデフォルトである(そのように設定されている場合))。

たとえばgit status、上流が設定されている場合、上流または下流の距離を示します。

git pushデフォルトで、現在の分岐上流にプッシュするように構成されている2 gitの2.0から。

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


5

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

単純なケースは、先ほど見た例で、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)するだけで、すぐに利用できます。


-1

このコマンドでは新しいブランチを作成できません

git checkout --track origin/branch

ステージングされていない変更がある場合。

次に例を示します。

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

ただし、git checkout -b次のコマンドを使用すると、ステージングされていない変更を含む新しいブランチを簡単に作成できます。

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

質問の両方のコマンドは、既存のリモートブランチ(origin/branch)を追跡するためのものであることに注意してください
ヨーチ

@Greenあなたがするテストはのorigin/new-branch代わりにorigin/branchです。あなたはそれを知っていますか?
Robert Siemer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.