美文网首页人生几何?基础前端
你不知道的 Git patch 模式

你不知道的 Git patch 模式

作者: CondorHero | 来源:发表于2021-09-05 20:27 被阅读0次
    你不知道的 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 模式

    相关文章

      网友评论

        本文标题:你不知道的 Git patch 模式

        本文链接:https://www.haomeiwen.com/subject/xqslghtx.html