本地分支,本地跟踪分支,远程分支和远程跟踪分支之间有什么区别?


158

我刚开始使用Git,却在不同分支之间感到非常困惑。谁能帮我找出以下分支类型是什么?

  • 地方分行
  • 本地跟踪分支
  • 偏远分支
  • 远程跟踪分支

它们之间有什么区别?以及它们如何相互配合?

我想,快速演示代码将非常有帮助。

Answers:


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是你的机器上创建的。这种远程跟踪分支追踪远程分支myNewBranchorigin。您可以使用或更新远程跟踪分支,使其与远程分支同步。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

2
@mskw否,本地跟踪分支和本地(非跟踪)分支的关联有所不同。本地分支未与任何分支关联。它只是孤立地存在于本地计算机上的一个分支。本地跟踪分支与远程跟踪分支关联。因此,您可以相互推/拉提交。
SNce

196

这是很长的答案。

遥控器:

如果您正在协同使用Git,则可能需要将提交与其他计算机或位置同步。在Git的术语中,每台机器或位置都称为remote,并且每台机器或位置可能都有一个或多个分支。通常,您只有一个名为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:在本地计算机上,您具有三种类型的分支:本地非跟踪分支,本地跟踪分支和远程跟踪分支。在远程计算机上,您只有一种类型的分支。

1.当地分支机构

您可以通过运行git branch以下命令查看计算机上所有本地分支的列表:

$ git branch
master
new-feature

每个本地分支在.git/refs/heads/以下位置都有一个文件:

$ ls -F .git/refs/heads/
master new-feature

您的计算机上有两种本地分支:非跟踪本地分支和跟踪本地分支。

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正在跟踪remote-tracking分支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 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 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-kittygit push --delete origin hello-kitty

似乎是任意的,但是有一种简单的方法可以记住何时使用斜杠以及何时使用空格。当使用斜杠时,是指自己计算机上的远程跟踪分支,而当使用空格时,实际上是在通过网络处理远程计算机上的分支。


我会用一个cmd创建分支并转到该分支,如下所示: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“论最终立场冗长(它显示了最后一次提交的散列和消息)。感谢@Flimm指出第二个v添加了有关哪个本地分支正在跟踪哪个远程的信息。


1
我不了解本地跟踪和远程跟踪分支之间的区别-前者对应于来源,而后者对应于远程机器。但那不是同一回事吗?不仅仅是通常在github上的仓库吗?
akantoword

1
@akantoword我更新了答案以尝试澄清一下。基本上,远程跟踪分支仅仅是一个不适合在工作远程分支的本地副本与跟踪当地分行是在工作。
埃里克·西森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.