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


158

私はGitを使い始めたばかりで、異なるブランチ間で本当に混乱しました。誰かが次のブランチタイプを理解するのを手伝ってくれる?

  • 地元の支店
  • ローカル追跡ブランチ
  • リモートブランチ
  • リモート追跡ブランチ

それらの違いは何ですか?そして、彼らはどのように互いに協力し合うのですか?

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

回答:


123

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

git branch myNewBranch        # Create local branch named "myNewBranch"

リモートブランチは、(ほとんどの場合、遠隔地の支店ですorigin)。新しく作成したローカルブランチmyNewBranchをにプッシュできoriginます。これで、他のユーザーが追跡できます。

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"

リモート追跡ブランチは、リモートブランチのローカルコピーです。ときmyNewBranchにプッシュされたorigin上記のコマンドを使用して、名前のリモート追跡ブランチは、origin/myNewBranchお使いのマシン上に作成されます。このリモートトラッキングブランチは、のリモートブランチmyNewBranchを追跡しoriginます。またはを使用して、リモートトラッキングブランチリモートブランチと同期するように更新できます。git fetchgit 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"

地元の追跡ブランチはあるローカルブランチ別のブランチを追跡しています。これは、他のブランチとの間でコミットをプッシュ/プルできるようにするためです。ほとんどの場合、ローカル追跡ブランチはリモート追跡ブランチを追跡します。ローカルブランチをプッシュして(上記のように)オプションをorigin使用git push commandする-u場合myNewBranch、リモートトラッキングブランチを追跡するようにローカルブランチを設定しますorigin/myNewBranch。これは、使用に必要とされているgit pushgit 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.

ローカル追跡ブランチ定義の場合、それをリモートにプッシュした後のローカルブランチと同じではありませんか?
mskw 2017

2
@mskwいいえ、ローカル追跡ブランチとローカル(非追跡)ブランチは関連付けが異なります。ローカルブランチはどのブランチとも関連付けられていません。これは、ローカルマシンに分離して存在する単なるブランチです。ローカル追跡ブランチは、リモート追跡ブランチに関連付けられています。したがって、相互にコミットをプッシュ/プルできます。
SNce 2017

196

これが長い答えです。

リモコン:

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

$ git remote
bitbucket
origin

これらのリモート名がショートカットである場所を確認するには、次のコマンドを実行しgit remote -vます。

$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com: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 pullgit 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 fetchgit pull使用してリモート追跡ブランチを更新できます。

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

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

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

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:Flimm/example.git
  Push  URL: git@github.com: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 fetchgit 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

任意のように見えるかもしれませんが、スラッシュを使用する場合とスペースを使用する場合を覚えておく簡単な方法があります。スラッシュを使用しているときは、自分のマシンのリモートトラッキングブランチを指していますが、スペースを使用しているときは、実際にはネットワークを介してリモートマシンのブランチを処理しています。


私はブランチを作成し、1つのコマンドでブランチに移動するために使用します:git checkout -b mynewbranch
Zeta

スペースとスラッシュの違いの最後のポイントが気に入りました!
aderchox

12

ローカル支店:

マシンで作業し、コミットを追加できるブランチ。これらのブランチはで一覧表示できますgit branch

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

リモートブランチに対応するように構成された通常のローカルブランチ。これはへの能力のようなbenfitsありgit pullgit pushリポジトリと支店名を指定する必要はありませんが。追跡はまたgit status、ブランチがリモートの前または後ろにあることを通知します。

リモートブランチ:

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

リモート追跡ブランチ:

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

git branch -avv私のお気に入りは、自分のマシンにあるブランチ、リモートにあるブランチ、およびそれぞれの最新のコミットの概要をすばやく表示することです。-aすべてのブランチが示されるべき部分を指定します(リモートとローカル)。v冗長用のエンドスタンド上の(それが最後にハッシュやコミットメッセージを示します)。2番目vがどのリモートブランチを追跡しているローカルブランチに関する情報を追加することを指摘してくれた@Flimmに感謝します。


1
ローカルトラッキングブランチとリモートトラッキングブランチの違いがわかりません。前者はオリジンに対応し、後者はリモートマシンに対応しています。でも同じじゃないの?それは通常githubにあるレポだけではないですか?
akantoword 2016年

1
@akantoword少し明確にするために答えを更新しました。基本的にはリモート追跡ブランチは、単純に作業するためのものではありませんリモートブランチのローカルコピーで追跡とローカルブランチで作業のためである。。
エリック・マシソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.