本地分行,本地跟踪分行,远程分行和远程跟踪分行有什么区别?

我刚开始使用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 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" 

本地跟踪分支是跟踪另一个分支的本地分支。 这样你可以推/拉提交到/从其他分支。 大多数情况下,本地跟踪分支会跟踪远程跟踪分支。 当你用一个-u选项(如上所示)使用git push command将本地分支推送到origin ,可以设置本地分支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. 

这是很长的答案。

遥控器:

如果您正在协作使用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 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 

将远程跟踪分支看作是本地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 fetchgit 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-kittygit push --delete origin hello-kitty

这看起来可能是任意的,但是有一个简单的方法来记住何时使用斜线以及何时使用空格。 当你使用斜线时,你指的是你自己机器上的远程追踪分支,而当你使用一个空间时,实际上是通过networking处理远程机器上的一个分支。

本地分行:

你的机器上的一个分支,你可以工作并添加提交。 你可以用git branch列出这些git branch

本地分支(跟踪):

一个普通的本地分支,configuration为对应一个远程分支。 这样做有如git pullgit push而不必指定存储库和分支名称。 跟踪还会导致git status通知您分支在远程或远程后面。

远程分支:

只需一个远程存储库上的分支 – 通常在服务器上,比如GitHub等

远程追踪分部:

远程分支的本地副本。 这个分支不应该被编辑。 其目的是跟踪远程分支的当前状态。 远程跟踪分支可以使用git branch -r查看,通常看起来像origin/master (回购名称后跟一个斜杠后面跟着分支名称)。 运行git fetch会更新远程跟踪分支以反映相应远程分支的状态。

git branch -avv是我个人最喜欢的,用于显示我的机器上哪些分支,哪些分支在远程,以及每个分支上的最新提交的快速概览。 -a部分指定应显示所有分支(远程和本地)。 最后的v代表冗长(它显示最后一个提交哈希和消息)。 感谢@Flimm指出第二个v增加了关于哪个本地分支跟踪哪个远程的信息。