人生几何?基础前端

你不知道的 Git patch 模式

2021-09-05  本文已影响0人  CondorHero
你不知道的 Git patch 模式

最小化切分 Git patch 模式

前言

如果你不是一个编程新手,在平时工作中对代码进行暂存的时候,你肯定非常的熟练了,现在让我们复习下:

  1. 单个文件的暂存,可以通过 git add path/xxx
  2. 所有已更改/已删除文件的暂存,不包括新增文件,可以通过 git add -u
  3. 所有已更改、已删除和新增的文件暂存,可以通过 git add -Agit add -allgit add .

但偶尔你可能还会遇到下面的问题:

  1. 一不小心,本地代码改的地方过多,开发了新功能也中夹杂着修复了几个 bug,等提交的时候,做 commit 拆分,突然发现需要对同一文件的不同内容做拆分。

  2. 开发过程中突然有任务插进来,而任务恰好用到了你本地更改某个文件的部分最新更改,这时就不能简单 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. (1/2) 表示 Git 把当前修改的文件拆分为两个 hunk,你目前处于第一个 hunk。
  2. Stage this hunk 解释文字,是否把当前 hunk 存储到暂存中。
  3. [y,n,q,a,d,j,J,g,/,e,?]? 当前状态下可用的命令符。

上面我们提到了 hunk,那什么是 hunk 呢,其实 hunk 就是Git 认为文件中一段有意义的一段代码块而已。这里要强调是 Git 认为 ,因为 Git 的感觉并不总符合我们的期望,所以当 Git 自动切分的 hunk 不满足我们的需求的时候,我们还需要通过 split 继续手动切分,如果还不行就的 edit 出马了,而这也恰恰是 Git patch 最难的一个的难点。

认识 patch 模式下的命令

终端运行了 git add -p,调出来 hunk 模式,我们可以通过输入 ? 回车,来查看当前环境支持的命令说明:

认识 patch 模式下的命令

我们看到 ? - 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 模式的精髓。

命令详解

我录了个视频,参考下。

你不知道的 Git patch 模式

上一篇下一篇

猜你喜欢

热点阅读