web-dev-qa-db-ja.com

ローカルブランチ、ローカルトラッキングブランチ、リモートブランチ、リモートトラッキングブランチの違いは何ですか?

Gitを使い始めたばかりで、異なるブランチ間で本当に混乱しました。誰も私が次のブランチタイプが何であるかを理解するのに役立ちますか?

  • 地方支部
  • ローカル追跡ブランチ
  • リモートブランチ
  • リモート追跡ブランチ

それらの違いは何ですか?そして、彼らはお互いにどのように働いていますか?

簡単なデモコードは本当に役立つと思います。

134
eded

ローカルブランチは、あなた(ローカルユーザー)だけが見ることができるブランチです。ローカルマシンにのみ存在します。

git branch myNewBranch        # Create local branch named "myNewBranch"

リモートブランチは、リモートロケーション上のブランチです(ほとんどの場合、Origin)。新しく作成したローカルブランチmyNewBranchOriginにプッシュできます。これで、他のユーザーが追跡できます。

git Push -u Origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "Origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "Origin"

リモートトラッキングブランチは、リモートブランチのローカルコピーです。上記のコマンドを使用してmyNewBranchOriginにプッシュされると、Origin/myNewBranchという名前のリモート追跡ブランチがマシン上に作成されます。このリモート追跡ブランチは、リモートブランチmyNewBranch on Originを追跡します。 git fetchまたはgit pullを使用して、リモートブランチと同期するようにリモートトラッキングブランチを更新できます。

git pull Origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "Origin" into remote tracking
                                 # branch on your machine "Origin/myNewBranch".
                                 # Here "Origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "Origin"

ローカル追跡ブランチは、別のブランチを追跡しているローカルブランチです。これは、他のブランチとの間でコミットをプッシュ/プルできるようにするためです。ほとんどの場合、ローカル追跡ブランチはリモート追跡ブランチを追跡します。 git Push commandオプションと-uオプションを使用して(上記のように)Originにローカルブランチをプッシュすると、ローカルブランチmyNewBranchを設定してリモートトラッキングブランチを追跡しますOrigin/myNewBranch。これは、プッシュ先またはプル元のアップストリームを指定せずにgit Pushおよびgit pullを使用するために必要です。

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "Origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "Origin".
                              # Pulls these new commits from "Origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.
100
SNce

ここに長い答えがあります。

リモコン:

Gitを共同で使用している場合、おそらく他のマシンまたは場所とコミットを同期する必要があります。 Gitの用語では、各マシンまたはロケーションはremoteと呼ばれ、それぞれに1つ以上のブランチがあります。ほとんどの場合、Originという名前のファイルが1つだけあります。すべてのリモートをリストするには、git remoteを実行します。

$ git remote
bitbucket
Origin

git remote -vを実行すると、これらのリモート名がショートカットである場所を確認できます。

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (Push)
Origin [email protected]:Flimm/example.git (fetch)
Origin [email protected]:Flimm/example.git (Push)

各リモートには、git/refs/remotes/の下にディレクトリがあります。

$ ls -F .git/refs/remotes/
bitbucket/ Origin/

マシン上のブランチ:

TLDR:ローカルマシンには、ローカルの非追跡ブランチ、ローカル追跡ブランチ、リモート追跡ブランチの3種類のブランチがあります。リモートマシンには、1種類のブランチがあります。

1.ローカルブランチ

git branchを実行すると、マシン上のすべてのローカルブランチのリストを表示できます。

$ git branch
master
new-feature

各ローカルブランチには、.git/refs/heads/の下にファイルがあります。

$ ls -F .git/refs/heads/
master new-feature

マシンには、非追跡ローカルブランチと追跡ローカルブランチの2種類のローカルブランチがあります。

1.1非追跡ローカルブランチ

非追跡ローカルブランチは、他のブランチに関連付けられていません。 git branch <branchname>を実行して作成します。

1.2。ローカルブランチの追跡

追跡ローカルブランチは、別のブランチ(通常はリモートトラッキングブランチ)に関連付けられています。 git branch --track <branchname> [<start-point>]を実行して作成します。

git branch -vvを使用して、どのブランチがブランチを追跡しているかを表示できます。

$ git branch -vv
master      b31f87c85 [Origin/master] Example commit message
new-feature b760e04ed Another example commit message

このコマンドの出力から、ローカルブランチmasterはリモートトラッキングブランチOrigin/masterを追跡しており、ローカルブランチnew-featureは何も追跡していないことがわかります。

どのブランチがブランチを追跡しているかを確認する別の方法は、.git/configを調べることです。

ローカルブランチの追跡は便利です。使用するアップストリームブランチを指定せずに、git pullおよびgit Pushを実行できます。ブランチが別のブランチを追跡するように設定されていない場合、次のようなエラーが表示されます。

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2.リモート追跡ブランチ(まだマシン上にあります)

git branch -rを実行すると、マシン上のすべてのリモート追跡ブランチのリストを表示できます。

$ git branch -r
bitbucket/master
Origin/master
Origin/new-branch

各リモート追跡ブランチには、.git/refs/<remote>/の下にファイルがあります。

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── Origin/
    ├── master
    └── new-branch

リモートトラッキングブランチは、リモートマシンに含まれているもののローカルキャッシュと考えてください。 git fetchを使用してリモート追跡ブランチを更新できます。git pullは舞台裏で使用します。

リモートトラッキングブランチのすべてのデータは、マシン上のローカル(キャッシュなど)に保存されますが、ローカルブランチと呼ばれることはありません。 (少なくとも、私はそれを呼ばないでしょう!)それは単にリモート追跡ブランチと呼ばれます。

リモートマシン上のブランチ:

git remote show <remote>を実行すると、すべてのリモートブランチ(リモートマシン上のブランチ)を表示できます。

$ git remote show Origin
* remote Origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/Origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git Push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

このgit remoteコマンドは、ネットワーク上のリモートマシンにそのブランチについてクエリします。ローカルマシンのリモートトラッキングブランチは更新されません。そのためにgit fetchまたはgit pullを使用してください。

出力から、「リモートブランチ」という見出しの下を見ると、リモートマシンに存在するすべてのブランチを確認できます(「古い」とマークされた行は無視してください)。

リモートマシンにログインしてファイルシステムでリポジトリを見つけることができた場合、refs/heads/の下にあるすべてのブランチを見ることができます。

カンニングペーパー:

  • 追跡の有無にかかわらず、ローカルブランチを安全に削除するには:

    git branch -d <branchname>
    
  • 追跡の有無にかかわらず、ローカルブランチを強制的に削除するには:

    git branch -D <branchname>
    
  • リモート追跡ブランチを削除するには:

    git branch -rd <remote>/<branchname>
    
  • 新しいローカルの非追跡ブランチを作成するには:

    git branch <branchname> [<start-point>]
    
  • 新しいローカル追跡ブランチを作成するには:(<start-point>が指定され、Origin/foobarのようなリモート追跡ブランチである場合、--trackフラグが自動的に含まれることに注意してください)

    git branch --track <branchname> [<start-point]
    

    例:

    git branch --track hello-kitty Origin/hello-kitty
    
  • リモートマシン上のブランチを削除するには:

    git Push --delete <remote> <branchname>
    
  • 古い、つまり、リモートマシンに対応するブランチが存在しないリモートトラッキングブランチをすべて削除するには、次のようにします。

    git remote Prune <remote>
    

一部のコマンドでは、<remote>/<branch>と他のコマンド<remote> <branch>を使用していることに気づいたかもしれません。例:git branch Origin/hello-kittyおよびgit Push --delete Origin hello-kitty

Arbitrary意的に見えるかもしれませんが、スラッシュを使用するタイミングとスペースを使用するタイミングを覚える簡単な方法があります。スラッシュを使用しているときは、自分のマシン上のリモート追跡ブランチを指しますが、スペースを使用しているときは、実際にはネットワーク経由でリモートマシン上のブランチを処理しています。

169
Flimm

ローカルブランチ:

作業してコミットを追加できるマシン上のブランチ。これらのブランチはgit branchでリストできます。

ローカルブランチ(追跡あり):

リモートブランチに対応するように構成された通常のローカルブランチ。これには、リポジトリ名とブランチ名を指定せずにgit pullおよびgit Pushを実行できるなどの利点があります。また、追跡により、git statusは、ブランチがリモートの前または後ろにあるときに通知します。

リモートブランチ:

リモートリポジトリ上のブランチ(通常はGitHubなどのサーバー上)。

リモートトラッキングブランチ:

リモートブランチのローカルコピー。このブランチは決して編集しないでください。その目的は、リモートブランチの現在の状態を追跡することです。リモートトラッキングブランチはgit branch -rで表示でき、通常はOrigin/master(リポジトリ名の後にスラッシュ、ブランチ名が続く)のように見えます。 git fetchを実行すると、リモートトラッキングブランチが更新され、対応するリモートブランチの状態が反映されます。

git branch -avvは、私のマシンにあるブランチ、リモートにあるブランチ、およびそれぞれの最新のコミットの概要を簡単に表示するのに私の個人的なお気に入りです。 -a部分は、すべてのブランチを表示することを指定します(リモートおよびローカル)。最後のvは詳細を表します(最後のコミットハッシュとメッセージを示します)。 2番目のvは、どのローカルブランチがどのリモートを追跡しているかに関する情報を追加することを指摘してくれた@Flimmに感謝します。

12
Eric Mathison