git学习——远程分支

远程分支

远程分支(remote branch)是对远程仓库状态的索引。它们是一些无法移动的本地分支;只有在进行 Git 的网络活动时才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。

我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支。比如我们想看看上次同 origin 仓库通讯时 master的样子,就应该查看 origin/master 分支。如果你和同伴一起修复某个问题,但他们先推送了一个 iss53 分支到远程仓库,虽然你可能也有一个本地的 iss53 分支,但指向服务器上最新更新的却应该是 origin/iss53 分支。

可能有点乱,我们不妨举例说明。假设你们团队有个地址为 git.ourcompany.com 的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为 origin,并下载其中所有的数据,建立一个指向它的 master 分支的指针,在本地命名为 origin/master,但你无法在本地更改其数据。接着,Git 建立一个属于你自己的本地master 分支,始于 origin 上 master 分支相同的位置,你可以就此开始工作(见图 3-22):

要是你在本地 master 分支做了会儿事情,与此同时,其他人向 git.ourcompany.com 推送了内容,更新了上面的 master 分支,那么你的提交历史会开始朝不同的方向发展。不过只要你不和服务器通讯,你的origin/master 指针不会移动(见图 3-23)。

可以运行 git fetch origin 来进行同步。该命令首先找到 origin 是哪个服务器(本例为git.ourcompany.com),从上面获取你尚未拥有的数据,更新你本地的数据库,然后把 origin/master 的指针移到它最新的位置(见图 3-24)。

为了演示拥有多个远程分支(不同的远程服务器)的项目是个什么样,我们假设你还有另一个仅供你的敏捷开发小组使用的内部服务器 git.team1.ourcompany.com。可以用第二章中提到的 git remote add 命令把它加为当前项目的远程分支之一。我们把它命名为 teamone,表示那一整串 Git 地址(见图 3-25)。

现在你可以用 git fetch teamone 来获取小组服务器上你还没有的数据了。由于当前该服务器上的内容是你origin 服务器上的子集,Git 不会下载任何数据,而只是简单地创建一个名为 teamone/master 的分支来指向teamone 服务器上 master 所指向的更新 31b8e(见图 3-26)。

推送

要想和其他人分享某个分支,你需要把它推送到一个你拥有写权限的远程仓库。你的本地分支不会被自动同步到你引入的远程分支中,除非你明确执行推送操作。换句话说,对于无意分享的,你尽可以保留为私人分支,而只推送那些协同工作的特性分支。

如果你有个叫 serverfix 的分支需要和他人一起开发,可以运行 git push (远程仓库名) (分支名)

<code class="calibre9">$ git push origin serverfix
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.74 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new branch]      serverfix -> serverfix
</code>

这其实有点像条捷径。Git 自动把 serverfix 分支名扩展为refs/heads/serverfix:refs/heads/serverfix,意为“取出我的 serverfix 本地分支,推送它来更新远程仓库的 serverfix 分支”。我们将在第九章进一步介绍 refs/heads/ 部分的细节,不过一般使用的时候都可以省略它。也可以运行 git push origin serverfix:serferfix 来实现相同的效果,它的意思是“提取我的 serverfix 并更新到远程仓库的 serverfix”。通过此语法,你可以把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作 awesomebranch,可以用 git push origin serverfix:awesomebranch 来推送数据。

接下来,当你的协作者再次从服务器上获取数据时,他们将得到一个新的远程分支 origin/serverfix

<code class="calibre9">$ git fetch origin
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 15 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (15/15), done.
From git@github.com:schacon/simplegit
 * [new branch]      serverfix    -> origin/serverfix
</code>

值得注意的是,在 fetch 操作抓来新的远程分支之后,你仍然无法在本地编辑该远程仓库。换句话说,在本例中,你不会有一个新的 serverfix 分支,有的只是一个你无法移动的 origin/serverfix 指针。

如果要把该内容合并到当前分支,可以运行 git merge origin/serverfix。如果想要一份自己的 serverfix来开发,可以在远程分支的基础上分化出一个新的分支来:

<code class="calibre9">$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
</code>

这会切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致,你可以在里面继续开发了。

跟踪分支

从远程分支检出的本地分支,称为跟踪分支(tracking branch)。跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。反过来,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。

在克隆仓库时,Git 通常会自动创建一个 master 分支来跟踪 origin/master。这正是 git push 和 git pull一开始就能正常工作的原因。当然,你可以随心所欲地设定为其它跟踪分支,比如 origin 上除了 master 之外的其它分支。刚才我们已经看到了这样的一个例子:git checkout -b [分支名] [远程名]/[分支名]。如果你有 1.6.2 以上版本的 Git,还可以用 --track 选项简化:

<code class="calibre9">$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
</code>

要为本地分支设定不同于远程分支的名字,只需在前个版本的命令里换个名字:

<code class="calibre9">$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
</code>

现在你的本地分支 sf 会自动向 origin/serverfix 推送和抓取数据了。

删除远程分支

如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]。如果想在服务器上删除serverfix 分支,运行下面的命令:

<code class="calibre9">$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
 - [deleted]         serverfix
</code>

咚!服务器上的分支没了。你最好特别留心这一页,因为你一定会用到那个命令,而且你很可能会忘掉它的语法。有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]

### 如何在 Git 中一次性推送多个提交到远程分支 当希望将本地的多个提交一次性推送到远程分支时,可以按照如下方法操作: 对于已经存在的项目,在准备推送之前应先确保所有的更改都已经进行了提交。这可以通过`git status`来确认是否有未跟踪或者被修改但尚未添加至暂存区的内容。 一旦所有变更都被妥善管理并提交,则可以直接执行推送命令。如果当前工作是在默认主分支上进行的话,那么只需要运行简单的推送指令即可[^1]: ```bash git push -u origin master ``` 此命令会将本地 `master` 分支上的所有新提交一并发送给名为 `origin` 的远程仓库中的对应分支。这里的 `-u` 参数用于设置上游追踪关系,使得未来能够更方便地拉取更新或再次推送而无需每次都指明源和目的分支。 如果是针对其他非默认分支(比如开发分支),则应当明确指出要推送的目标分支名称。例如,假设有一个叫做 `featureX` 的特性分支包含了几个连续的小改动,现在打算把这些累积起来的一系列提交一起上传到服务器端同名的远端分支上去,就可以这样做[^4]: ```bash git push origin featureX ``` 值得注意的是,上述过程假定这些待推送的提交已经在本地形成了线性的历史记录;如果有复杂的合并情况或者其他特殊情况存在,可能还需要额外考虑如何处理冲突等问题。 另外一种场景下,假如开发者在一个特定的时间点做了很多次独立但是关联紧密的小型改进,并且每次都有单独做了一次提交,之后又觉得应该把它们作为一个整体发布出去——这时也可以通过调整提交顺序或是压缩多次提交成一个更大规模的整体提交后再行推送,不过这就涉及到更加高级的操作如交互式 rebase 或 squash 提交等功能了[^3]。 #### 推送多条不同分支下的提交到同一远程分支 若需将来自不同本地分支的若干个提交集中推送给同一个远程分支,通常的做法是创建一个新的临时分支专门用来接收那些选定的历史记录片段,然后再统一向外部共享。具体来说就是利用 `cherry-pick` 命令挑选出感兴趣的单个提交事件加入到这个汇总用的工作副本里去,最后再实施常规意义上的推送动作。 ```bash # 创建并切换到新的临时分支 git checkout -b temp-aggregate-branch --track origin/target_remote_branch # 将各个所需的具体提交逐一应用到这里面 git cherry-pick <commit-hash> # 完毕后推送整个序列到指定位置 git push origin temp-aggregate-branch:target_remote_branch # 清理不再需要的辅助分支 git branch -d temp-aggregate-branch ``` 这里需要注意替换 `<commit-hash>` 为实际想要包含的那个提交对象的身份标识符字符串,以及相应地填写好目标远程分支的名字作为 `target_remote_branch` 部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值