git常用命令-进阶

概述

以下内容基于 Learn Git Branching 这个网站编写。

https://learngitbranching.js.org/?locale=zh_CN

rebase 变基

参考:

git rebase详解(图解+最简单示例,一次就懂)

https://blog.csdn.net/weixin_42310154/article/details/119004977

git rebase master

(1)说明

除了git merge之外,还有第二种合并分支的方法是 git rebase

Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

(2)案例

准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)

我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。

 # 用 git rebase 实现此目标
 git rebase main 

在这里插入图片描述

现在 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebasemain 分支上的 C3 的副本。

现在唯一的问题就是 main 还没有更新,下面咱们就来更新它吧……

现在我们切换到了 main 上。把它 rebasebugFix 分支上……

 git rebase bugFix 

好了!由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已。

分离HEAD

(1)说明

我们首先看一下 “HEAD”。 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。

HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。

HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。

(2)案例

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:

HEAD -> main -> C1

HEAD 指向 mainmain 指向 C1

 git checkout C1 

在这里插入图片描述

现在变成了

HEAD -> C1

相对引用

# 将HEAD指向master的上一次提交
git checkout master^

# 将HEAD指向master的上2次的提交
git checkout master^^

# 将HEAD指向master的上一次提交
git checkout master~
# 将HEAD指向master的上3次提交
git checkout master~3

(1)说明

通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有可视化提交树供你参考,所以你就不得不用 git log 来查看提交记录的哈希值。

并且哈希值在真实的 Git 世界中也会更长(注:基于 SHA-1,共 40 位)。例如提交记录的哈希值可能是fed2da64c0efc5293610bdd892f82a58e8cbc5d8

比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入fed2 而不是上面的一长串字符。

综上所述,Git 引入了相对引用。这个就很厉害了!

使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。

相对引用非常给力,这里我介绍两个简单的用法:

  • 使用 ^ 向上移动 1 个提交记录
  • 使用 ~<num> 向上移动多个提交记录,如 ~3

(2)案例

首先看看操作符 (^)。把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。

所以 main^ 相当于“main 的父节点”。

main^^main 的第二个父节点

现在咱们切换到 main 的父节点

 git checkout main^ 

在这里插入图片描述

搞定。这种方式是不是比输入哈希值方便多了?!

强制修改分支位置

# 将master指向HEAD上3次提交
git branch -f master HEAD~3

# 将master指向 c6 提交
git branch -f master c6

(1)说明

你现在是相对引用的专家了,现在用它来做点实际事情。

我使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:

git branch -f main HEAD~3

上面的命令会将 main 分支强制指向 HEAD 的第 3 级父提交。

(2)案例

 git branch -f main HEAD~3 

在这里插入图片描述

这就对了! 相对引用为我们提供了一种简洁的引用提交记录 C1 的方式, 而 -f 则容许我们将分支强制移动到那个位置。

撤销变更

git reset HEAD~
git reset c6
git revert HEAD~
git revert c6

(1)说明

在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。

主要有两种方法用来撤销变更 —— 一是 git reset,还有就是 git revert。接下来咱们逐个进行讲解。

(2)案例1(git reset)

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

让我们来看看演示:

在这里插入图片描述

漂亮! Git 把 main 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。

(注:在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)

(3)案例2(Git Revert)

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!

为了撤销更改并分享给别人,我们需要使用 git revert。来看演示:

 git revert HEAD 

在这里插入图片描述

奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

revert 之后就可以把你的更改推送到远程仓库与别人分享啦。

整理提交记录(cherry-pick)

将c2提交和c4提交合并到当前分支上
git cherry-pick c2 c4

git rebase -i HEAD~4

(1)说明

本系列的第一个命令是 git cherry-pick, 命令形式为:

git cherry-pick <提交号>...

如果你想将一些提交复制到当前所在的位置(HEAD)下面的话, Cherry-pick 是最直接的方式了。我个人非常喜欢 cherry-pick,因为它特别简单。

(1)案例

这里有一个仓库, 我们想将 side 分支上的工作复制到 main 分支,你立刻想到了之前学过的 rebase 了吧?但是咱们还是看看 cherry-pick 有什么本领吧。

 git cherry-pick C2 C4 

在这里插入图片描述

这就是了!我们只需要提交记录 C2C4,所以 Git 就将被它们抓过来放到当前分支下了。 就是这么简单!

整理提交记录(rebase -i)

当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。

但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了。

(1)说明

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

(2)案例

在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。 考虑到课程的初衷,我弄了一个对话框来模拟这些操作。

当 rebase UI界面打开时, 你能做3件事:

  • 调整提交记录的顺序(通过鼠标拖放来完成)
  • 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
  • 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。

当你点击下面的按钮时,会出现一个交互对话框。对提交记录做个排序(当然你也可以删除某些提交),点击确定看结果

在这里插入图片描述

Git 严格按照你在对话框中指定的方式进行了复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值