git温故而知新

git describe

因为 tag 在 commit tree 上表示的是一个锚点,Git 有一个指令可以用来显示离你最近的锚点(也就是 tag),而且这个指令叫做 git describe!

当你已经完成了一个 git bisect(一个找寻有 bug 的 commit 的指令),或者是当你使用的是你跑去度假的同事的电脑时, git describe 可以帮助你了解你离最近的 tag 差了多少个 commit。


git describe 的​​使用方式:

git describe <ref>

<ref> 是任何一个可以被 Git 解读成 commit 的位置,如果你没有指定的话,Git 会以你目前所在的位置为准(HEAD)。

指令的输出就像这样:

<tag>_<numCommits>_g<hash>

<tag> 表示的是离 <ref> 最近的 tag, numCommits 是表示这个 tag 离 <ref> 有多少个 commit, <hash> 表示的是你所给定的 <ref> 所表示的 commit 的前七个 id。

任务图片

多分支 rebase

呐,现在我们有很多分支啦!让我们 rebase 这些分支的工作到 master 分支上吧。

但是你的头头找了点麻烦 —— 他们希望得到有序的提交历史,也就是我们最终的结果是 C7’ 在最底部,C6’ 在它上面,以此类推。

假如你搞砸了,没所谓的(虽然我不会告诉你用 reset 可以重新开始)。记得看看我们提供的答案,看你能否使用更少的命令完成任务!

多分支 rebase的任务图片

$ delay 2000
$ show goal
$ git checkout bugFix
$ git rebase master
$ git checkout side
$ git rebase bugFix
$ git checkout another
$ git rebase side
git branch -f master HEAD

选择父提交

和 ~ 修改符一样,^ 修改符之后也可以跟一个(可选的)数字。

这不是用来指定向上返回几代(~ 的作用),^ 后的数字指定跟随合并提交记录的哪一个父提交。还记得一个合并提交有多个父提交吧,所有选择哪条路径不是那么清晰。

Git 默认选择跟随合并提交的”第一个”父提交,使用 ^ 后跟一个数字来改变这一默认行为。

Git Remotes

git clone

一般的,执行git clone 后,会再本地建立两个仓库,origin/master,master 前者称未 远端分支,远端分支不会被改变,当你再远端分支做提交的时候会分离出HEAD

git fetch

可以理解未这个操作相当于SVN的update,当执行git fetch时,相当于把远端仓库的master分支给拷贝过来,来覆盖本地的所有的远端分支

git pull

这个命令相当于先git fetch 将本地的远端分支和远程的分支保持一致,然后将本地的远端分支的工作合并到本地的分支上(git merge)

远端综合练习

目标示意图:

目标示意图

git fakeTeamwork foo 3 --这个命令表示远端的foo分支被提交了三次
git clone
git fakeTeamwork master 2
git fetch
git commit
git pull

远端协同

这几个命令 fetching, rebase/merging, pushing 的工作流很普遍. 后续课程我们会讲解更复杂的工作流, 不过现在我们先尝试下吧.

要完成本节, 你需要完成以下几步:

Clone 你的仓库
模拟一次远程提交(fakeTeamwork)
本地提交一次
用变基提交你的修改 (–rebase)


git pull --rebase #从远端更新并和本地合并
git push --推送到远端

远端协同-多个分支 rebase

本篇有点儿复杂 – 以下是问题核心

这里有三个特性分支 – side1 side2 和 side3
我需要按顺序将这三分支推送到远端.
因为远端已经被更新过了, 所以我们需要先做合并!
–假如让A分支并到master分支上,那么需要在A分支上操作,(只能主动去合并,不能被动)

示意图片


git push --rebase 
#--操纵side1 分支合并到master分支下游
git checkout side1
git rebase C8
#--同理操纵 side2和side3分支合依次合并
git checkout side2
git rebase side1
git checkout side3
git rebase side2
#--推进master分支
git branch -f master HEAD
#推送分支
git push

远端协同-多个分支 merge

目标示意图

把A分支merge到master分支上
git merge feature-A
就是把A分支拉到master分支的下游去,谁操作谁占据主动

$ git checkout side1
$ git merge master
$ git branch -f master HEAD
$ git branch -f side1 C2
$ git checkout side2
$ git merge master
$ git branch -f master HEAD
$ git branch -f side2 HEAD^
$ git checkout side3
$ git merge master
$ git branch -f master HEAD
$ git branch -f side3 HEAD^
$ git checkout master
$ git push

远端跟踪

长话短说, master 和 o/master 的连接关系就是 分支属性”remote tracking” (我们叫远端跟踪好啦). master 被设定为跟踪 o/master – 这就是隐含的合并(merge)/推送(push)目的地.

你可能想知道这个属性是怎么被设定的? 你并没有用命令指定过这个属性呀! 好吧, 当你克隆仓库的时候, 这个属性就存在了.

当你克隆时, Git 会创建跟踪分支(就像 o/master), 对于每个远端分支, 创建一个跟踪远端分支的本地分支 (master), 所以你经常会看到这个的命令输出:

local branch “master” set to track remote branch “o/master”

我能自己指定这个属性吗?

当然可以啦! 你可以让做任意分支跟踪 o/master, 然后分支就会隐含 push 的 destination(o/master) 以及 merge 的 target (o/master). 这意味着你可以在分支 totallyNotMaster 上执行 git push, 将工作推送到远端的 master.

有两种方法设置这个属性, 第一种就是通过远端分支检出一个新的分支, 执行:

git checkout -b totallyNotMaster o/master

这样就创建了一个跟踪 o/master 的 新分支 totallyNotMaster.

方法#2

另一种追踪远端分支的方法就是使用选项 : git branch -u .

git branch -u o/master foo

这样 foo 就会跟踪 o/master 了. 如果你处于 foo 分支, 那么可以省略 foo

git branch -u o/master

Push 参数

好! 既然你知道了远端跟踪分支, 我们可以开始揭开隐藏在 git push/pull/fetch 背后的秘密.

首先看看 git push, 在远端跟踪分支中, 你学到了 Git 会找出要 push 的目的地(通过查看检出的分支, 及分支关联到的跟踪分支). 这是无参数的行为, 不过我们也可以为 push 指定参数:

git push

参数意味什么呢? 我们会深入其中的细节, 先看看例子, 这个命令是:

git push origin master

切到 master 分支, 然后抓取所有的提交, 再将新提交推送到远端的 master 分支!
通过指定 master 为 参数, 我们告诉 Git 提交来自于 master, 要推送到远端的 master. 这种使用方式基本上用于同步两仓库

谨记, 因为我们通过指定参数告诉了 Git 所有的事, Git 就忽略了我们所检出的分支(转而直接使用参数指定的分支作为 source/destination)

目标示意图

使用命令:

git push origin master:foo --将本地master分支的修改提交到远端foo分支上
git push orgin foo:master --将本地foo分支的修改提交到远端的master分支上

fetch

如果我们设定了 : 会发生什么呢?

如果你觉得直接更新本地分支很爽, 那你就用冒号 refspec 吧. 不过, 你不能在检出的分支上干这个事.

这里只有一个特点 – source 是远端的位置, 而 是要放置提交的本地位置, 这真是有趣 – 这也是传送数据的对立方向!

话虽如此, 开发者很少这么做. 我已经介绍了, 概念上 fetch/push 很相似, 只是它们方向相反.

下面这个命令实现了下面的图片的效果:

git fetch origin foo~1:bar

目标图片

小测试,实现下面的效果:

fetch目标图片


$ git fetch origin master^:foo
$ git fetch origin foo:master
$ git checkout foo
$ git merge master

删除远端分支 source

source

如果给 push 传一个空参数会如何呢? 远端会删除分支


fetch

git pull

以下命令在 Git 中是等价的:

git pull origin foo 相当于:

git fetch origin foo; git merge o/foo

还有…

git pull origin bar~1:bugFix 相当于:

git fetch origin bar~1:bugFix; git merge bugFix

看到了? git pull 实际上就是 fetch + merge 的缩写, git pull 在乎的是提交在哪里结束(也就是 git fetch 所确定的 destination)

一起来看个例子吧:

小测试:
示意图

提示:先从远端拉过来bar分支,然后再拉master分支

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贤时间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值