远程分支
远程引用是对远程存储库的引用(指针),包括分支、标签等。您可以使用 git ls-remote (remote) 显式获取远程引用的完整列表,或者使用 git remote 获取有关远程分支的更多信息显示(远程)。但是,更常见的做法是利用远程跟踪分支。
远程跟踪分支是对远程分支状态的引用。它们是您无法移动的本地引用本地分支推送到远程,当您执行任何网络通信操作时它们会自动移动。远程跟踪分支就像您上次连接到远程存储库时这些分支状态的书签。
它们以 (remote)/(branch) 的形式命名。例如,如果您想查看上次与 origin 远程存储库通信时 master 分支的状态,您可以查看 origin/master 分支。你和一个同事一起处理一个问题,他们推送了一个 iss53 分支,你可能有自己的本地 iss53 分支;但服务器上的分支将指向 origin/iss53 提交。
这可能有点令人困惑,所以让我们看一个例子。假设您的网络中有一个位于 git.ourcompany.com 的 Git 服务器。如果你从这里克隆,Git 的克隆命令会自动为你命名为 origin,拉取所有数据,创建指向其 master 分支的指针,并在本地命名为 origin/master。 Git 也会给你一个本地的 master 分支,它指向与 origin 的 master 分支相同的地方,所以你有一个基础可以工作。
注意
“ORIGIN”没有特殊含义远程仓库名称“origin”与分支名称“master”相同,在Git中没有特殊含义。同样,“master”是运行 git init 时的默认起始分支名称本地分支推送到远程,只是因为它的广泛使用,而“origin”是运行 git clone 时的默认远程存储库名称。如果你运行 git clone -o booyah,你的默认远程分支名称将是 booyah/master。
图 3-22. 克隆的服务器和本地存储库 及时,其他人将提交推送到 git.ourcompany.com 并更新其 master 分支,您的提交历史将走向不同的方向。也许,只要您不连接到源服务器,您的源/主指针就不会移动。
图 3-23. 本地和远程作业可以分叉。要同步您的作业,请运行 git fetch origin 命令。此命令查找哪个服务器“源”(在本例中为 git.ourcompany.com),从中获取本地不可用的数据,并更新本地数据库,移动源/主指针以指向新的,更新了位置。
图 3-24. git fetch 更新您的远程存储库参考 为了演示具有多个远程存储库和远程分支的情况,我们假设您有另一个内部 Git 服务器仅用于您的 sprint 团队的开发工作。该服务器位于 git.team1.ourcompany.com。您可以通过运行 git remote add 命令向当前项目添加新的远程存储库引用,我们将在 Git 基础知识中详细介绍。将远程存储库 teamone 命名为整个 URL 的简写。
图 3-25. 添加另一个远程仓库 现在,你可以运行 git fetch teamone 来获取远程仓库 teamone 有但本地没有的数据。由于该服务器上的现有数据是源服务器的子集,Git 不会获取数据,但会将远程跟踪分支 teamone/master 设置为指向 teamone 的 master 分支。
图3-26.远程跟踪分支teamone/master
推
当您想要公开共享一个分支时,您需要将其推送到具有写入权限的远程存储库。本地分支不会自动与远程存储库同步 - 您必须明确推送要共享的分支。这样,您可以将不想共享的内容放在私有分支上,并将您需要与他人协作的内容推送到公共分支上。
如果你想和其他人一起在一个名为 serverfix 的分支上工作,你可以像第一个分支一样推送它。运行 git push(远程)(分支):
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
这里简化了一些工作。 Git 自动将 serverfix 分支名称扩展为 refs/heads/serverfix:refs/heads/serverfix,意思是“推送本地 serverfix 分支以更新远程仓库上的 serverfix 分支”。我们将了解更多关于 Git 内部的 refs /heads/ 部分,但你可以先把它放在那里。您也可以运行 git push origin serverfix:serverfix ,它会做同样的事情 - 这相当于它说,“将本地 serverfix 分支推送为远程的 serverfix 分支” 这种格式可用于将本地分支推送到远程名称不同的分支。如果不希望远程仓库上的分支被称为 serverfix,可以运行 git push origin serverfix:awesomebranch 将本地 serverfix 分支推送到远程仓库上的 awesomebranch 分支。
注意
如何避免每次都输入密码 如果你使用 HTTPS URL 推送,Git 服务器会询问用户名和密码。如果服务器允许推送,默认会在终端提示。
如果不想每次推送都输入用户名和密码,可以设置“凭证缓存”。最简单的方法是将其在内存中保存几分钟,只需运行 git config --global credential.helper cache 即可设置。