关于git:本地分支、本地跟踪分支、远程分支和远程跟踪分支有什么区别?

What are the differences between local branch, local tracking branch, remote branch and remote tracking branch?

我刚开始使用git,我对不同的分支感到非常困惑。有人能帮我弄清楚下面的分支类型是什么吗?

  • 当地分支机构
  • 本地跟踪分支
  • 远程分支
  • 远程跟踪分支

他们之间有什么区别?他们是如何合作的?

我想,一个快速的演示代码会非常有用。


答案很长。好的。遥控器:

如果您正在协作使用Git,则可能需要将提交与其他计算机或位置同步。用git的术语来说,每台机器或位置都被称为远程,并且每台机器或位置可以有一个或多个分支。通常情况下,您只需要一个,名为origin。要列出所有远程设备,请运行git remote:好的。

1
2
3
$ git remote
bitbucket
origin

您可以通过运行git remote -v来查看这些远程名称是哪些位置的快捷方式:好的。

1
2
3
4
5
$ 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/下都有一个目录:好的。

1
2
$ ls -F .git/refs/remotes/
bitbucket/ origin/

机器上的分支:

TLDR:在本地机器上,有三种类型的分支:本地非跟踪分支、本地跟踪分支和远程跟踪分支。在远程机器上,您只有一种类型的分支。好的。1。当地分支机构

运行git branch可以查看计算机上所有本地分支的列表:好的。

1
2
3
$ git branch
master
new-feature

每个本地分支机构在.git/refs/heads/下都有一个文件:好的。

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

您的计算机上有两种类型的本地分支:非跟踪本地分支和跟踪本地分支。好的。1.1非跟踪本地分支机构

非跟踪本地分支不与任何其他分支关联。通过运行git branch 创建一个。好的。1.2。跟踪本地分支

跟踪本地分支与另一个分支相关联,通常是远程跟踪分支。通过运行git branch --track []创建一个。好的。

您可以使用git branch -vv查看哪个本地分支正在跟踪分支:好的。

1
2
3
$ 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,而不指定要使用哪个上游分支。如果分支没有设置为跟踪另一个分支,则会出现如下错误:好的。

1
2
3
4
5
6
7
8
9
10
11
$ 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可以查看机器上所有远程跟踪分支的列表:好的。

1
2
3
4
$ git branch -r
bitbucket/master
origin/master
origin/new-branch

每个远程跟踪分支在.git/refs//下都有一个文件:好的。

1
2
3
4
5
6
7
$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│&nbsp;&nbsp; └── master
└── origin/
    ├── master
    └── new-branch

将远程跟踪分支视为远程计算机所包含内容的本地缓存。您可以使用git fetch更新远程跟踪分支,git pull在后台使用。好的。

即使远程跟踪分支的所有数据都存储在本地计算机上(如缓存),它仍然从未被称为本地分支。(至少,我不会这么叫它!)这就是所谓的远程跟踪分支。好的。远程计算机上的分支:

通过运行git remote show 可以查看所有远程分支(即远程机器上的分支):好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ 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 fetchgit pull进行更新。好的。

从输出中,通过查看标题"远程分支"(忽略标记为"过时"的行),可以看到远程计算机上存在的所有分支。好的。

如果您可以登录到远程机器并在文件系统中找到存储库,您可以查看它在refs/heads/下的所有分支。好的。备忘单:

  • 要安全删除本地分支,无论是跟踪还是非跟踪:好的。

    1
    git branch -d <branchname>
  • 要强制删除本地分支,无论是跟踪还是非跟踪:好的。

    1
    git branch -d <branchname>
  • 要删除远程跟踪分支:好的。

    1
    git branch -rd <remote>/<branchname>
  • 要创建新的本地非跟踪分支,请执行以下操作:好的。

    1
    git branch <branchname> [<start-point>]
  • 创建一个新的本地跟踪分支:(注意,如果指定了,并且是一个远程跟踪分支,如origin/foobar,则会自动包含--track标志)好的。

    1
    git branch --track <branchname> [<start-point]

    例子:好的。

    1
    git branch --track hello-kitty origin/hello-kitty
  • 要删除远程计算机上的分支,请执行以下操作:好的。

    1
    git push --delete <remote> <branchname>
  • 要删除所有过时的远程跟踪分支,即远程计算机上不再存在相应分支的位置,请执行以下操作:好的。

    1
    git remote prune <remote>

您可能已经注意到,在某些命令中,您使用/和其他命令 。示例:git branch origin/hello-kittygit push --delete origin hello-kitty。好的。

它可能看起来很武断,但有一个简单的方法可以记住何时使用斜线,何时使用空格。当您使用斜线时,您指的是您自己机器上的远程跟踪分支,而当您使用空格时,实际上是通过网络处理远程机器上的分支。好的。好啊。


本地分支是只有您(本地用户)才能看到的分支。它只存在于您的本地计算机上。

1
git branch myNewBranch        # Create local branch named"myNewBranch"

远程分支是远程位置上的分支(在大多数情况下为origin)。您可以将新创建的本地分支myNewBranch推到origin。现在其他用户可以跟踪它。

1
2
3
4
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的远程跟踪分支。此远程跟踪分支跟踪origin上的远程分支myNewBranch。您可以使用git fetchgit pull更新远程跟踪分支,使其与远程分支同步。

1
2
3
4
5
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,而不需要指定上游来推动或拉动。

1
2
3
4
5
6
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 branch列出这些分支。

本地分支(带跟踪):

配置为对应于远程分支的普通本地分支。这与git pullgit push的功能类似,无需指定存储库和分支名称。跟踪还会使git status在您的分支机构位于远程服务器的前面或后面时通知您。

远程分支:

只是远程存储库上的一个分支,通常位于Github等服务器上。

远程跟踪分支:

远程分支的本地副本。不应编辑此分支。它的目的是跟踪远程分支的当前状态。远程跟踪分支可以用git branch -r查看,通常看起来像origin/master(repo名称后跟斜线和分支名称)。运行git fetch将更新远程跟踪分支,以反映相应远程分支的状态。

git branch -avv是我个人的最爱,它可以快速显示我的机器上的哪些分支,哪些分支在远程,以及每个分支中最新的提交。-a部分规定应显示所有分支(远程和本地)。末尾的v代表verbose(它显示最后一个提交哈希和消息)。感谢@flimm指出第二个v添加了关于哪个本地分支跟踪哪个远程的信息。