git 提交文件中的部分修改
1. 概述
在 Git 提交一个文件的时候,有时候会在同一个文件中,包含两个不同功能的修改,或者一个功能完成了,而别的部分还没有完善不应该进入代码库,这时候如果使用git add file-name
的话,会将这个文件中的所有更新都提交,达不到上述的需求。针对这种场景,git 提供了更细粒度的提交命令git add -p
,可以分部分提交一个文件中的更新代码块,实测能满足常见的需求。这里简要记录一下如何使用这个命令。
2. 实现命令
2.1 原理解释
git 中用”hunk”来表示一个文件中邻近区域中的代码修改块,比如用git diff
查看修改时,两个@@
符号分割的一个区域就是一个hunk,其中行首是-
,颜色为红色的为删去的行,而行首为+
,颜色为绿色的为增加的行。
需要注意的是,git有一套默认的将文件中所有修改分成不同hunk的机制,但我们也可以将默认机制分的太大的hunk分割为多个小的hunk,这样能更精确地控制提交的粒度。
部分提交文件修改的原理简单来说是将所有的修改分成不同的hunk,通过对每个hunk来进行是否提交的判断,从而完成我们的需求。具体命令下面详细讲述。
2.2 命令详解
git add -p filename
就可以进入交互式的操作界面,所有的操作在该界面完成,其中-p
是patch的缩写。界面如下:
这里会自动载入第一个hunk,显示了修改的代码行,最底下一行显示了这是8个hunk里面的第一个,然后有一些选项让我们选择,这时候输入?
,按会车会显示help信息:
所有命令的含义如下:
1 | y - 将当前的hunk进行提交 |
详细阅读上面的说明,结合实际的操作,就能掌握这个命令的所有用法。
简单来说,使用y
来提交当前hunk,使用n
来忽略当前hunk,如果hunk代码块太大,输入s
会将其分割为小的hunk,在上面继续操作,hunk间上下跳转用vim的快捷键k
和j
,要退出则输入q
。