Gitを使い始めたばかりで、異なるブランチ間で本当に混乱しました。誰も私が次のブランチタイプが何であるかを理解するのに役立ちますか?
それらの違いは何ですか?そして、彼らはお互いにどのように働いていますか?
簡単なデモコードは本当に役立つと思います。
ローカルブランチは、あなた(ローカルユーザー)だけが見ることができるブランチです。ローカルマシンにのみ存在します。
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
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.
ここに長い答えがあります。
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種類のブランチがあります。
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: [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意的に見えるかもしれませんが、スラッシュを使用するタイミングとスペースを使用するタイミングを覚える簡単な方法があります。スラッシュを使用しているときは、自分のマシン上のリモート追跡ブランチを指しますが、スペースを使用しているときは、実際にはネットワーク経由でリモートマシン上のブランチを処理しています。
ローカルブランチ:
作業してコミットを追加できるマシン上のブランチ。これらのブランチはgit branch
でリストできます。
ローカルブランチ(追跡あり):
リモートブランチに対応するように構成された通常のローカルブランチ。これには、リポジトリ名とブランチ名を指定せずにgit pull
およびgit Push
を実行できるなどの利点があります。また、追跡により、git status
は、ブランチがリモートの前または後ろにあるときに通知します。
リモートブランチ:
リモートリポジトリ上のブランチ(通常はGitHubなどのサーバー上)。
リモートトラッキングブランチ:
リモートブランチのローカルコピー。このブランチは決して編集しないでください。その目的は、リモートブランチの現在の状態を追跡することです。リモートトラッキングブランチはgit branch -r
で表示でき、通常はOrigin/master
(リポジトリ名の後にスラッシュ、ブランチ名が続く)のように見えます。 git fetch
を実行すると、リモートトラッキングブランチが更新され、対応するリモートブランチの状態が反映されます。
git branch -avv
は、私のマシンにあるブランチ、リモートにあるブランチ、およびそれぞれの最新のコミットの概要を簡単に表示するのに私の個人的なお気に入りです。 -a
部分は、すべてのブランチを表示することを指定します(リモートおよびローカル)。最後のv
は詳細を表します(最後のコミットハッシュとメッセージを示します)。 2番目のv
は、どのローカルブランチがどのリモートを追跡しているかに関する情報を追加することを指摘してくれた@Flimmに感謝します。