add

常用选项

选项 含义
-i 进入交互式暂存模式
-p 进入分块提交模式

基础

add 是一个多功能命令,会根据文件所处的状态不同执行不同的操作。

  • 如果文件未跟踪,则该命令会将文件保存到暂存区,同时文件状态更新为 "unmodified"

  • 如果文件已跟踪,但进行了修改,运行该命令会将这些修改保存到暂存区

  • add 命令还可以在有冲突时,将文件标记为已解决

  • 基本格式为 git add : 将文件添加到缓存区中,并不是直接添加到本地库中。

    • 在存储到本地库之前,可以将向 Staging Area(缓存区) 中添加或删除文件。

    • filename 可以使用通配符指定。如 *.txt 表示操作所有后缀名为 txt 的文件, .(点号) 表示所有的文件

示例如下:

  1. 在当前目录下新建 test3.txt 文件,运行 git status ,可发现新建的 test3.txt 文件位于未跟踪文件列表中。

  2. 运行

    $ git add test3.txt;
    

    将 test3.txt 提交到缓存区,然后再运行 git status ,可发现该文件处于已缓存文件列表中。

  3. 修改 test3.txt 文件,然后运行 git status ,可发现该文件处于已修改 ( 即已存入缓存区,但又进行了修改 ) 文件件列表中。如果要暂存这次更新,需要再次运行 git add 命令。

  4. 先通过 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 .

*

  1. * 表示任意字符串。要注意:使用匹配时,一定添加上单引号
$ git add '*.t'

上述命令表示只添加后缀名为 txt 的文件。


交互式暂存 ( -i 选项 )

将文件的特定部分组合成提交。

当修改一组文件时,可以使用交互式暂存,将其中的一部分进行暂存,然后进行提交。使用这种方式可以确保提交是逻辑上独立的变更集。

  1. 在暂存时使用 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> 表示的是当前需要进行的的操作,在这里输入上面列出的命令并回车即可。

  2. 假设输入的命令是 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 命令已经结束,选择的文件已经添加到暂存区,未选择的文件仍处于修改状态。

文件选择说明

  1. num :表示选中指定编号的文件。

  2. * :表示选择所有文件。要注意:使用 * 后,会直接将所有的文件添加到暂存区。

  3. num1-num2 : 选择编号在 [num1,num2] 区间内的文件。

  4. num- : 表示选择编号在 num 后的文件,含编号为 num 的文件。

  5. 有多个选择时,可以将编号使用空格或逗号分隔

如:

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 操作
  1. 在某一块时,无论输入 y 还是 n,都是已经决定了的块。

  2. 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 选项后,依旧会问对于剩下的未决定的块该如何处理。

你可能感兴趣的:(add)