本地分行,本地跟踪分行,远程分行和远程跟踪分行有什么区别?
我刚开始使用Git,我在不同的分支之间感到困惑。 任何人都可以帮助我弄清楚以下分支types是什么?
- 当地分行
- 本地跟踪分支
- 远程分支
- 远程跟踪分支
他们有什么区别? 而他们又是如何相互合作的呢?
一个快速的演示代码将是真正有用的,我猜。
本地分支是只有你(本地用户)才能看到的分支。 它只存在于你的本地机器上。
git branch myNewBranch # Create local branch named "myNewBranch"
远程分支是远程位置的分支(大多数情况下是origin
)。 您可以将新创build的本地分支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
,将在您的机器上创build一个名为origin/myNewBranch
的远程跟踪分支。 这个远程追踪分支在origin
追踪远程分支myNewBranch
。 您可以使用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"
本地跟踪分支是跟踪另一个分支的本地分支。 这样你可以推/拉提交到/从其他分支。 大多数情况下,本地跟踪分支会跟踪远程跟踪分支。 当你用一个-u
选项(如上所示)使用git push command
将本地分支推送到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的术语中,每个机器或位置可以有一个或多个分支。 大多数情况下,你只能有一个,命名的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:在您的本地机器上,您有三种types的分支:本地非跟踪分支,本地跟踪分支和远程跟踪分支。 在远程机器上,你只有一种types的分支。
1.当地分支机构
您可以通过运行git branch
来查看机器上所有本地分支的列表:
$ git branch master new-feature
每个本地分支在.git/refs/heads/
下有一个文件:
$ ls -F .git/refs/heads/ master new-feature
您的机器上有两种types的本地分支机构:非跟踪本地分支机构和跟踪本地分支机构。
1.1非跟踪本地分支机构
非跟踪本地分支不与任何其他分支相关联。 你通过运行git branch <branchname>
创build一个。
1.2。 跟踪当地分行
跟踪本地分支与另一个分支相关联,通常是远程跟踪分支。 你可以通过运行git branch --track <branchname> [<start-point>]
创build一个。
你可以使用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
将远程跟踪分支看作是本地caching,以确定远程计算机的内容。 你可以使用git fetch
来更新你的远程跟踪分支,这是git pull
在幕后使用的。
即使远程跟踪分支的所有数据都存储在本地机器上(如caching),它仍然不会被称为本地分支。 (至less,我不会这么称呼它!)它只是被称为远程跟踪分支。
远程机器上的分支机构:
您可以通过运行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
命令通过networking查询远程机器的分支。 它不会更新本地机器上的远程跟踪分支,请使用git fetch
或git pull
。
从输出中,通过查看标题“远程分支”(忽略标记为“陈旧”的行),可以看到远程计算机上存在的所有分支。
如果您可以login到远程机器并在文件系统中find存储库,那么可以查看refs/heads/
下的所有分支。
备忘单:
-
要删除本地分支,无论是跟踪还是非跟踪,都安全:
git branch -d <branchname>
-
要删除本地分支,无论是跟踪还是非跟踪,强制:
git branch -D <branchname>
-
要删除远程跟踪分支:
git branch -rd <remote>/<branchname>
-
要创build一个新的本地非跟踪分支:
git branch <branchname> [<start-point>]
-
要创build一个新的本地跟踪分支:(注意,如果
<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
。
这看起来可能是任意的,但是有一个简单的方法来记住何时使用斜线以及何时使用空格。 当你使用斜线时,你指的是你自己机器上的远程追踪分支,而当你使用一个空间时,实际上是通过networking处理远程机器上的一个分支。
本地分行:
你的机器上的一个分支,你可以工作并添加提交。 你可以用git branch
列出这些git branch
。
本地分支(跟踪):
一个普通的本地分支,configuration为对应一个远程分支。 这样做有如git pull
和git push
而不必指定存储库和分支名称。 跟踪还会导致git status
通知您分支在远程或远程后面。
远程分支:
只需一个远程存储库上的分支 – 通常在服务器上,比如GitHub等
远程追踪分部:
远程分支的本地副本。 这个分支不应该被编辑。 其目的是跟踪远程分支的当前状态。 远程跟踪分支可以使用git branch -r
查看,通常看起来像origin/master
(回购名称后跟一个斜杠后面跟着分支名称)。 运行git fetch
会更新远程跟踪分支以反映相应远程分支的状态。
git branch -avv
是我个人最喜欢的,用于显示我的机器上哪些分支,哪些分支在远程,以及每个分支上的最新提交的快速概览。 -a
部分指定应显示所有分支(远程和本地)。 最后的v
代表冗长(它显示最后一个提交哈希和消息)。 感谢@Flimm指出第二个v
增加了关于哪个本地分支跟踪哪个远程的信息。