回答:
ローカルブランチはあなただけ(ローカルユーザ)が見ることができるブランチです。ローカルマシンにのみ存在します。
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 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"
地元の追跡ブランチはあるローカルブランチ別のブランチを追跡しています。これは、他のブランチとの間でコミットをプッシュ/プルできるようにするためです。ほとんどの場合、ローカル追跡ブランチはリモート追跡ブランチを追跡します。ローカルブランチをプッシュして(上記のように)オプションをorigin
使用git push command
する-u
場合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.
これが長い答えです。
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種類のブランチしかありません。
を実行すると、マシン上のすべてのローカルブランチのリストを表示できますgit branch
。
$ git branch
master
new-feature
各ローカルブランチには、下にファイルがあります.git/refs/heads/
。
$ ls -F .git/refs/heads/
master new-feature
マシン上のローカルブランチには、非追跡ローカルブランチと追跡ローカルブランチの2種類があります。
非追跡ローカルブランチは、他のブランチに関連付けられていません。を実行して作成しますgit branch <branchname>
。
ローカルブランチの追跡は、別のブランチ(通常はリモート追跡ブランチ)に関連付けられています。を実行して作成します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>
を実行すると、マシン上のすべてのリモート追跡ブランチのリストを表示できます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: 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 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
。
任意のように見えるかもしれませんが、スラッシュを使用する場合とスペースを使用する場合を覚えておく簡単な方法があります。スラッシュを使用しているときは、自分のマシンのリモートトラッキングブランチを指していますが、スペースを使用しているときは、実際にはネットワークを介してリモートマシンのブランチを処理しています。
ローカル支店:
マシンで作業し、コミットを追加できるブランチ。これらのブランチはで一覧表示できますgit branch
。
ローカルブランチ(追跡あり):
リモートブランチに対応するように構成された通常のローカルブランチ。これはへの能力のようなbenfitsありgit pull
とgit push
リポジトリと支店名を指定する必要はありませんが。追跡はまたgit status
、ブランチがリモートの前または後ろにあることを通知します。
リモートブランチ:
リモートリポジトリ上のブランチ(通常はGitHubなどのサーバー上)。
リモート追跡ブランチ:
リモートブランチのローカルコピー。このブランチは編集しないでください。その目的は、リモートブランチの現在の状態を追跡することです。リモート追跡ブランチは、で表示できgit branch -r
、通常は次のようになりますorigin/master
(リポジトリ名、スラッシュ、ブランチ名の順)。実行git fetch
すると、対応するリモートブランチの状態を反映するようにリモートトラッキングブランチが更新されます。
git branch -avv
私のお気に入りは、自分のマシンにあるブランチ、リモートにあるブランチ、およびそれぞれの最新のコミットの概要をすばやく表示することです。-a
すべてのブランチが示されるべき部分を指定します(リモートとローカル)。v
冗長用のエンドスタンド上の(それが最後にハッシュやコミットメッセージを示します)。2番目v
がどのリモートブランチを追跡しているローカルブランチに関する情報を追加することを指摘してくれた@Flimmに感謝します。