你不知道的 Git patch 模式
最小化切分 Git patch 模式
前言
如果你不是一个编程新手,在平时工作中对代码进行暂存的时候,你肯定非常的熟练了,现在让我们复习下:
- 单个文件的暂存,可以通过
git add path/xxx
。 - 所有已更改/已删除文件的暂存,不包括新增文件,可以通过
git add -u
。 - 所有已更改、已删除和新增的文件暂存,可以通过
git add -A
或git add -all
或git add .
。
但偶尔你可能还会遇到下面的问题:
-
一不小心,本地代码改的地方过多,开发了新功能也中夹杂着修复了几个 bug,等提交的时候,做 commit 拆分,突然发现需要对同一文件的不同内容做拆分。
-
开发过程中突然有任务插进来,而任务恰好用到了你本地更改某个文件的部分最新更改,这时就不能简单 stash 整个文件了。
以上两个问题,都指向了同一个问题即:如何用 Git 快捷的对文件的不同部分做拆分。
问题我们提出了,接下来就是找方法,而这个方法就是使用 Git 的 patch 模式。
案例文件
为了接下来的演示,我们用 JavaScript 来写个简单的计算器,只有加减乘除的功能,下面给出代码,但是它们的实现逻辑是错误的。
const add = (a, b) => {
// TODO: Implement here
return a - b;
};
// Subtract two numbers
const subtract = (a, b) => {
return a + b;
};
// Multiply two numbers
const multiply = (a, b) => {
return a / b;
};
// Divide two numbers
const divide = (a, b) => {
return a * b;
};
我们对上面代码进行了简单的逻辑修正,接下来拆分提交,通过 git add -p
来做到这一点。
什么是 hunk
加入我修正了加法和除法的逻辑,让它们变的正确。此时在终端运行了 git add -p
, 这时我们的终端状态是这样的。
文件内容和 git diff 命令很像,不同的是最下面蓝色字体的部分。从前到后分为三部分:
-
(1/2)
表示 Git 把当前修改的文件拆分为两个 hunk,你目前处于第一个 hunk。 -
Stage this hunk
解释文字,是否把当前 hunk 存储到暂存中。 -
[y,n,q,a,d,j,J,g,/,e,?]?
当前状态下可用的命令符。
上面我们提到了 hunk,那什么是 hunk 呢,其实 hunk 就是Git 认为文件中一段有意义的一段代码块而已。这里要强调是 Git 认为
,因为 Git 的感觉并不总符合我们的期望,所以当 Git 自动切分的 hunk 不满足我们的需求的时候,我们还需要通过 s
plit 继续手动切分,如果还不行就的 e
dit 出马了,而这也恰恰是 Git patch 最难的一个的难点。
认识 patch 模式下的命令
终端运行了 git add -p
,调出来 hunk 模式,我们可以通过输入 ?
回车,来查看当前环境支持的命令说明:
我们看到 ? - print help
就是打印命令帮助的,上面列举的并不是 patch 模式下得全部命令,而是当前环境 hunk 所支持得命令,就是蓝色方括号里面的 [y,n,q,a,d,j,J,g,/,e,?]
比如这里就没有出现 K、j。
我这里给出一个比较全的表:
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
命令都是一些简单的英文说明就不翻译了,接下来我来演示下 patch 模式的精髓。
命令详解
我录了个视频,参考下。
完