常用选项
选项 | 含义 |
---|---|
-i | 进入交互式暂存模式 |
-p | 进入分块提交模式 |
基础
add 是一个多功能命令,会根据文件所处的状态不同执行不同的操作。
如果文件未跟踪,则该命令会将文件保存到暂存区,同时文件状态更新为 "unmodified"
如果文件已跟踪,但进行了修改,运行该命令会将这些修改保存到暂存区。
add 命令还可以在有冲突时,将文件标记为已解决。
-
基本格式为 git add
: 将文件添加到缓存区中,并不是直接添加到本地库中。 在存储到本地库之前,可以将向 Staging Area(缓存区) 中添加或删除文件。
filename 可以使用通配符指定。如 *.txt 表示操作所有后缀名为 txt 的文件, .(点号) 表示所有的文件。
示例如下:
在当前目录下新建 test3.txt 文件,运行 git status ,可发现新建的 test3.txt 文件位于未跟踪文件列表中。
-
运行
$ git add test3.txt;
将 test3.txt 提交到缓存区,然后再运行 git status ,可发现该文件处于已缓存文件列表中。
修改 test3.txt 文件,然后运行 git status ,可发现该文件处于已修改 ( 即已存入缓存区,但又进行了修改 ) 文件件列表中。如果要暂存这次更新,需要再次运行 git add 命令。
-
先通过 git add 命令将 test3.txt 文件存储到暂存区中,然后修改,再运行 git status。可得如下信息:
$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD
..." to unstage) modified: test3.txt Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: test3.txt 可以发现 test3.txt文件即出现在已暂存状态(第一个 test3.txt ),又出现在未暂存状态(第二个 test3.txt)。
这是因为暂存的只是修改之前的 test3.txt。git add 命令之后又对文件进行了新的操作,而这部分操作并没有通过 git add 保存到暂存区中。
如果现在执行 commit 命令将文件提交到本地仓库,那提交的也是修改之前的版本。修改之后的只有先通过 git add 保存到缓存区后才能被 commit 命令提交到本地仓库。
通配符
.
表示添加当前工作目录中的所有文件(除被忽略的部分)。
如:
$ git add .
*
- * 表示任意字符串。要注意:使用匹配时,一定添加上单引号。
$ git add '*.t'
上述命令表示只添加后缀名为 txt 的文件。
交互式暂存 ( -i 选项 )
将文件的特定部分组合成提交。
当修改一组文件时,可以使用交互式暂存,将其中的一部分进行暂存,然后进行提交。使用这种方式可以确保提交是逻辑上独立的变更集。
-
在暂存时使用
git add -i
:$ git add -i staged unstaged path 1: unchanged +1/-0 aa 2: unchanged +1/-0 bb 3: unchanged +1/-0 i/i.txt 4: unchanged +1/-1 test.html 5: unchanged +1/-0 xxx.xxx *** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now>
可以发现 Git 首先列出了本次修改的文件:
path 下对应的是文件路径。
unstaged 下是本次修改的影响。/ 前面的表示本次修改与暂存区版本相比,一共添加了多少行;/ 后面的表示删除了多少行。
nothing
表示两者没有区别。因此,如果该列不为 nothing,表示该文件处于已修改状态。staged 表示当前暂存区与本地仓库相比影响的行数。
unchanged
表示两者没有区别。因此,该列不为 unchanged,表示该文件处于已暂存状态。
*** Commands *** 下列出的是当前可选的命令。使用时,使用命令的前面的数字或命令的第一个字母。
最下面 What now> 表示的是当前需要进行的的操作,在这里输入上面列出的命令并回车即可。
-
假设输入的命令是 u(即 update)。后继的操作如下:
What now> u staged unstaged path 1: unchanged +1/-0 aa 2: unchanged +1/-0 bb 3: unchanged +1/-0 i/i.txt 4: unchanged +1/-1 test.html 5: unchanged +3/-1 xxx.xxx Update>> 1,4 staged unstaged path * 1: unchanged +1/-0 aa 2: unchanged +1/-0 bb 3: unchanged +1/-0 i/i.txt * 4: unchanged +1/-1 test.html 5: unchanged +3/-1 xxx.xxx Update>> updated 2 paths
输入 u 命令后,Git 会列出所有文件,并在在下方出现 Update>> 行。在该行中输出要进行 u 操作的文件(使用文件前面的数字即可)。选择完文件后回车即可。
选择完文件后,会发现我们选择的文件前面出现了 * ,该标识用来指明当前选择的文件。
在最下面再次出现 Update>> 行。如果此时有遗漏的文件,可以写上对应的编号并回车,则第二次选择的文件也会出现在选择列表中。如果没有遗漏的,直接回车,则表示本次 add 命令已经结束,选择的文件已经添加到暂存区,未选择的文件仍处于修改状态。
文件选择说明
num :表示选中指定编号的文件。
* :表示选择所有文件。要注意:使用 * 后,会直接将所有的文件添加到暂存区。
num1-num2 : 选择编号在 [num1,num2] 区间内的文件。
num- : 表示选择编号在 num 后的文件,含编号为 num 的文件。
有多个选择时,可以将编号使用空格或逗号分隔。
如:
Update>> 1-3 5
staged unstaged path
* 1: unchanged +1/-0 aa
* 2: unchanged +1/-0 bb
* 3: unchanged +1/-0 i/i.txt
4: unchanged +1/-1 test.html
* 5: unchanged +3/-1 xxx.xxx
1-3 表示选择1,2,3 号文件,5 表示选择 5号文件。所以上述命令除了 4 号文件外,所有的文件都被选中。
各命令说明
命令 | 含义 |
---|---|
q | 退出交互式暂存 |
u | 选择文件进行暂存 |
s | 相当于运行 git status |
r | 撤销对指定文件的暂存 |
d | 相当于运行 git diff --staged,即比较暂存区与最近一次提交的差异 |
p | 相当于运行 git add -p,对内容进行分块提交 |
-p
分块暂存,即将文件的一部分暂存,另一部分仍保持已修改状态。
例如,对 aa 文件进行了两处修改,然后运行 git add -p -- aa
,其结果如下:
hufeng@hufengdeMacBook-Pro:~/Desktop/demo$ git add -p -- aa
diff --git a/aa b/aa
index 6df7115..f995d82 100644
--- a/aa
+++ b/aa
@@ -1,3 +1,5 @@
+aaaaaaaa
aaa
aa
aa
+a
Stage this hunk [y,n,q,a,d,/,s,e,?]?
第一次运行时,Git 会把整个修改当前一块(hunk),会询问你是否暂存该块。
同时在命令的最后一行,也列出了常用的选项 —— [y,n,q,a,d,/,s,e,?]。
选项
使用各选项时,直接在上述命令的最后一行输入相应的字母,并回车即可。
选项 | 含义 |
---|---|
? | 输出各字母的含义 |
y | 暂存当前块 |
n | 不暂存当前块 |
s | 将当前块切成更小的块 |
g | 跳到指定块号的块。如 g 1 表示跳到块号为 1 的块 |
J | 跳过当前块,显示下一块 |
j | 跳过当前块,显示下一个未决定是否暂存的块 |
K | 显示当前块的上一块 |
k | 显示当前块的上一个未决定的块 |
a | 暂存当前块以及其后所有未决定的块 |
d | 不暂存当前块以及其后所有未决定的块 |
q | 不暂存当前块以及该文件中所有未决定的块,并直接退出 add 操作 |
在某一块时,无论输入 y 还是 n,都是已经决定了的块。
a,d,q 三个选项只能影响所有未决定的块,对于已经决定的块,不会受影响。
对于 d 与q 的区别,可以参看下面例子。假设当前一共有 4 块。
q 选项使用如下:
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? g 3
@@ -4,3 +4,3 @@
a4
-a5
+a55
a6
Stage this hunk [y,n,q,a,d,/,k,K,j,J,g,e,?]? q
$
可以看出,使用 q 后直接退出 add 操作,也就是说本次 add 命令已经解决。
d 操作如下:
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? g 3
@@ -4,3 +4,3 @@
a4
-a5
+a55
a6
Stage this hunk [y,n,q,a,d,/,k,K,j,J,g,e,?]? d
@@ -1,2 +1,2 @@
-a1
+a11
a2
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?
使用 d 选项后,依旧会问对于剩下的未决定的块该如何处理。