【git系列】git-add 含义用法选项示例详解

【git系列】git-add 含义用法选项示例详解

语法

git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
	  [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--sparse]
	  [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
	  [--chmod=(+|-)x] [--pathspec-from-file=<file> [--pathspec-file-nul]]
	  [--] [<pathspec>…]

概述

git add命令用于将当前工作目录中的文件内容添加到索引(也称为暂存区),以准备进行下一次提交。

它通常会将现有路径下的所有内容作为一个整体添加到索引中,但通过一些选项,也可以只添加部分更改或删除不存在于工作目录中的路径。

索引是工作目录内容的快照,它被视为下一次提交的内容。因此,在对工作目录进行任何更改后,在运行提交命令之前,必须使用add命令将任何新的或已修改的文件添加到索引中。

可以在多次提交之间执行此命令。它只会在运行add命令时添加指定文件的内容;如果您希望将后续更改包含在下一次提交中,则必须再次运行git add来将新内容添加到索引中。

​ 使用git status命令可以获取摘要信息,了解哪些文件的更改已经准备好供下一次提交。

​ 默认情况下,git add命令不会添加被忽略的文件。如果在命令行上显式指定了任何被忽略的文件,git add将会失败,并显示被忽略的文件列表。由Git递归目录或通过通配符展开的被Git忽略的文件将被静默忽略。可以使用-f(force)选项来强制git add命令添加被忽略的文件。

​ 有关向提交添加内容的替代方法,请参阅git-commit[1]。

选项

选项描述
<pathspec>…从中添加内容的文件。可以使用文件通配符(例如*.c)添加所有匹配的文件。还可以给出一个前导目录名(例如dir),以便更新索引以匹配整个目录的当前状态(例如指定dir将记录不仅在工作树中修改的文件dir/file1,添加到工作树中的文件dir/file2,还有从工作树中删除的文件dir/file3)。请注意,旧版本的Git会忽略已删除的文件;如果您只想添加修改或新文件而忽略已删除的文件,请使用–no-all选项。
-n
--dry-run
实际上不添加文件,只是显示它们是否存在和/或将被忽略。
-v
--verbose
显示详细信息。
-f
--force
允许添加被忽略的文件。
--sparse允许更新稀疏检出锥外的索引条目。通常,git add拒绝更新不适合稀疏检出锥内路径的索引条目,因为这些文件可能会在没有警告的情况下从工作树中删除。有关更多详细信息,请参见git-sparse-checkout[1]。
-i
--interactive
以交互方式将工作树中的修改内容添加到索引。可以提供可选的路径参数,以限制操作范围为工作树的子集。有关详细信息,请参见“交互模式”。
-p
--patch
在索引和工作树之间交互选择补丁块,并将它们添加到索引中。这样用户有机会在将修改内容添加到索引之前审查差异。实际上,这相当于运行add --interactive命令,但绕过了初始命令菜单,直接跳转到patch子命令。有关详细信息,请参见“交互模式”。
-e
--edit
在编辑器中打开与索引的diff,并允许用户对其进行编辑。在编辑器关闭后,调整hunk头并将补丁应用到索引中。此选项的目的是选择要应用的补丁行,甚至修改要暂存的行的内容。这比使用交互式hunk选择器更快速和灵活。然而,容易搞混并创建一个不能应用到索引的补丁。请参阅下面的编辑补丁。
-u
--update
只在索引中已经存在与匹配的条目处更新索引。这将删除以及修改索引条目以与工作树匹配,但不添加新文件。如果在使用-u选项时没有给出,则更新整个工作树中的所有已跟踪文件(旧版本的Git限制更新为当前目录及其子目录)。
-A
--all
--no-ignore-removal
不仅在工作树中有与匹配的文件时更新索引,而且在索引已经存在条目时也更新。这将添加、修改和删除索引条目以匹配工作树。如果在使用-A选项时没有给出,则更新整个工作树中的所有文件(旧版本的Git限制更新为当前目录及其子目录)。
--no-all
--ignore-removal
通过添加新文件和在工作树中修改的文件来更新索引,但忽略已从工作树中删除的文件。当不使用时,此选项无效。此选项主要是为了帮助习惯于较旧版本Git的用户,其中“git add …”是“git add --no-all …”的同义词,即忽略已删除的文件。
-N
--intent-to-add
仅记录路径稍后将被添加的事实。将该路径的条目放入索引中,但没有内容。这对于显示此类文件的未暂存内容(使用git diff)并使用git commit -a提交它们非常有用。
--refresh不添加文件,只刷新索引中的stat()信息。
--ignore-errors如果由于错误索引某些文件而无法添加,则不中止操作,而是继续添加其他文件。命令仍将以非零状态退出。可以设置配置变量add.ignoreErrors为true,使其成为默认行为。
--ignore-missing此选项只能与–dry-run一起使用。通过使用此选项,用户可以检查给定的文件是否会被忽略,无论它们是否已经存在于工作树中。
--no-warn-embedded-repo默认情况下,当在没有使用git submodule add创建.gitmodules中的条目的情况下向索引添加嵌入式存储库时,git add将发出警告。此选项将禁止警告(例如,如果您手动对子模块执行操作)。
--renormalize重新应用“clean”过程到所有已跟踪文件,强制再次将它们添加到索引中。这在更改core.autocrlf配置或文本属性后,以纠正以错误的CRLF/LF换行符添加的文件时非常有用。此选项意味着-u。单独的CR字符不变,因此虽然CRLF会清除为LF,但CRCRLF序列仅部分地清除为CRLF。
`–chmod=(+-)x`
--pathspec-from-file=<file>将路径规范传递给而不是命令行参数。如果恰好为-,则使用标准输入。路径规范元素由LF或CR/LF分隔。路径规范元素可以像解释配置变量core.quotePath一样进行引用(请参见git-config[1])。另请参阅–pathspec-file-nul和全局–literal-pathspecs。
--pathspec-file-nul仅与–pathspec-from-file有意义。路径规范元素以NUL字符分隔,并且所有其他字符都被视为字面值(包括换行符和引号)。
--此选项用于将命令行选项与文件列表分开(当文件名可能被误认为是命令行选项时有用)。

示例

以下是一些git add命令的示例:

  1. 添加单个文件:

    $ git add file.txt
    
  2. 添加多个文件:

    $ git add file1.txt file2.txt
    
  3. 添加当前目录及其子目录下的所有文件:

    $ git add .
    
  4. 添加所有已修改和已删除的文件:

    $ git add --all
    
  5. 添加已修改的文件,但不包括新文件和已删除的文件:

    $ git add --update
    
  6. 添加文件补丁:

    $ git add -p
    
  7. 强制添加被忽略的文件:

    $ git add -f ignored.txt
    

请注意,上述示例中的file.txtfile1.txtfile2.txt等均为文件的占位符,请根据实际情况替换为要添加的文件路径。

  1. 将Documentation目录及其子目录下的所有*.txt文件添加到内容中:
$ git add Documentation/\*.txt

注意,在这个示例中,星号*是被引用的;这样命令就可以包括Documentation/目录下子目录中的文件。

  1. 考虑添加所有git-*.sh脚本的内容:
$ git add git-*.sh

因为这个示例允许shell扩展星号(即显式列出文件),所以它不会考虑subdir/git-foo.sh。

交互模式

用途

git add命令的交互模式用于更灵活地选择要添加到暂存区(index)中的文件。交互模式会显示当前工作目录下所有已修改的文件,并提供一组子命令,使您能够选择性地将这些文件添加到暂存区中。

以下是git add交互模式的几个主要用途:

  1. 查看状态:交互模式会显示每个文件的状态变化,包括已修改、新添加和删除等信息。您可以通过查看状态来了解哪些文件需要被添加到暂存区。

  2. 批量选择:交互模式允许您按需选择要添加的文件。您可以根据文件的编号或范围进行选择,还可以使用通配符进行批量选择。这样可以避免手动一个个添加文件。

  3. 部分暂存:如果某个文件有多个修改,您可以选择性地将其部分修改添加到暂存区中。交互模式会以块为单位展示文件的修改,您可以选择是否暂存每个块的更改。

  4. 撤销选择:如果您错误地选择了某个文件或不想将其添加到暂存区,交互模式允许您取消选择并从待添加列表中移除该文件。

  5. 补丁编辑:交互模式还支持编辑补丁。当选择某个文件时,它会显示文件的差异并允许您选择性地将每个补丁添加到暂存区。这对于精细控制文件的修改非常有用。

总之,git add交互模式提供了更多灵活的选项管理要添加到暂存区中的文件和修改,使您能够更好地控制版本库的状态。

如何进入

要进入git add的交互模式,只需在命令中添加-i--interactive选项即可。以下是进入交互模式的示例命令:

git add -i

git add --interactive

执行上述命令后,您将进入交互模式,并看到一个提示符,通常为What now>。从那里开始,您可以根据需要选择要执行的子命令,例如statusupdaterevertadd untrackedpatchdiff等。每个子命令都有自己的用途和选项,您可以根据需要进行选择。

请注意,交互模式是一个与终端进行交互的命令循环,因此您可以根据需要多次执行不同的子命令。要退出交互模式并返回到命令行提示符,请使用quit子命令或按下Ctrl + C组合键。

进入交互模式后,您可以根据需要浏览和修改文件的状态,并根据您的需求选择性地将它们添加到暂存区。这种交互式的方式可以帮助您更好地管理和控制您的版本库中的更改。

显示效果

当命令进入交互模式时,它会显示状态子命令的输出,然后进入交互式命令循环。

命令循环显示可用的子命令列表,并给出提示符"What now> "。通常情况下,当提示符以单个>结尾时,您只能选择给定的选项之一并输入回车,例如:

*** Commands ***
  1: status       2: update       3: revert       4: add untracked
  5: patch        6: diff         7: quit         8: help
What now> 1

您还可以输入s、sta或status,只要选择是唯一的即可。

主命令循环有6个子命令(加上help和quit)。

status

这显示了HEAD和index之间的更改(即如果您执行git commit将提交的内容),以及每个路径的index和工作树文件之间的更改(即您可以在git commit之前使用git add进一步添加到index中)。示例如下:

              staged     unstaged path
     1:       binary      nothing foo.png
     2:     +403/-35        +1/-1 add-interactive.c

它显示foo.png与HEAD之间有差异(但是它是二进制文件,因此无法显示行数),并且索引副本与工作树版本之间没有差异(如果工作树版本也不同,则会显示binary而不是nothing)。另一个文件add-interactive.c,如果将索引中的内容提交,将添加403行和删除35行,但工作树文件还有进一步修改(一个添加和一个删除)。

update

这显示状态信息并发出"Update>>"提示符。当提示符以两个>>结尾时,您可以进行多个选择,用空格或逗号连接。您还可以使用范围。例如,"2-5 7,9"表示从列表中选择2、3、4、5、7、9。如果省略范围中的第二个数字,则选择所有剩余的补丁。例如,"7-"表示从列表中选择7、8、9。您可以使用*选择全部内容。

然后,选择的内容将以*标记,示例如下:

           staged     unstaged path
  1:       binary      nothing foo.png
* 2:     +403/-35        +1/-1 add-interactive.c

要取消选择,请在输入前加上-,示例如下:

Update>> -2

选择后,回答空行以将所选路径的工作树文件内容放入index中。

revert

它与update有非常相似的用户界面,对于选择的路径,已暂存信息将恢复为HEAD版本的信息。还原新路径将使其变为未跟踪状态。

add untracked

它与update和revert有非常相似的用户界面,并允许您将未跟踪的路径添加到index中。

patch

这使您可以从类似选择的状态中选择一个路径。选择路径后,它会呈现index和工作树文件之间的差异,并询问您是否要暂存每个块的更改。您可以选择以下选项之一并输入回车:

y - 暂存此块
n - 不暂存此块
q - 退出;不暂存此块或任何剩余的块
a - 暂存此块及后续所有块
d - 不暂存此块或后续所有块
g - 选择要转到的块
/ - 搜索与给定正则表达式匹配的块
j - 离开此块,查看下一个待定的块
J - 离开此块,查看下一个块
k - 离开此块,查看上一个待定的块
K - 离开此块,查看上一个块
s - 将当前块拆分为较小的块
e - 手动编辑当前块
? - 打印帮助信息

在决定了所有块的命运后,如果选择了任何块,则index将更新为所选的块。

您可以通过将配置变量interactive.singleKey设置为true来省略在此处输入回车。

diff

这使您可以查看将要提交的内容(即HEAD和index之间的差异)。

编辑补丁

调用git add -e或从交互式补丁选择器中选择e将在编辑器中打开一个补丁;编辑器退出后,结果将应用于index。您可以随意对补丁进行任意更改,但请注意,某些更改可能会产生混乱的结果,甚至导致无法应用的补丁。如果您想完全中止操作(即,在index中不添加任何新内容),只需删除补丁的所有行即可。下面的列表描述了在补丁中可能遇到的一些常见情况以及在其上进行的适当编辑操作。

添加的内容

添加的内容由以"+"开头的行表示。您可以通过删除它们来阻止暂存任何添加行。

删除的内容

删除的内容由以"-“开头的行表示。您可以通过将”-"转换为空格来阻止暂存其删除。

修改的内容

修改的内容由"-“行(删除旧内容)后跟”+“行(添加替换内容)表示。您可以通过将”-“行转换为空格,并删除”+"行来阻止暂存修改。请注意,仅修改一对中的一半可能会在index中引入混乱的更改。

还有一些更复杂的操作可以执行。但请注意,因为补丁只应用于index而不是工作树,所以工作树看起来会“撤消”index中的更改。例如,在index中引入一个既不在HEAD也不在工作树中的新行将使该行在提交时暂存,但在工作树中,该行将显示为被还原。

避免使用这些结构,或者要非常小心地使用它们。

未触及的内容

在index和工作树之间没有差异的内容可能显示在以空格开头的上下文行上。您可以通过将空格转换为"-"来将上下文行暂存为删除。结果工作树文件将显示重新添加内容。

修改现有内容

您还可以通过将它们暂存为删除(将" “转换为”-“)并添加一个”+“行以添加新内容来修改上下文行。同样,您可以修改现有添加或修改的”+"行。在所有情况下,新修改将在工作树中显示为被还原。

新内容

您还可以添加补丁中不存在的新内容;只需添加以"+"开头的新行即可。添加将在工作树中显示为被还原。

还有几种操作应完全避免,因为它们将使补丁无法应用:

添加上下文(" “)或删除(”-")行

删除上下文或删除行

修改上下文或删除行的内容

配置

此部分以下内容从git-config[1]文档中选择性地包含。其内容与那里找到的内容相同:

add.ignoreErrors
add.ignore-errors(已弃用)
告诉git add在由于索引错误而无法添加某些文件时继续添加文件。等效于git-add[1]的–ignore-errors选项。add.ignore-errors已被弃用,因为它不符合常规的配置变量命名约定。

add.interactive.useBuiltin
未使用的配置变量。在Git版本v2.25.0至v2.36.0中使用,以启用git-add[1]的内置交互模式,然后在Git版本v2.37.0至v2.39.0中成为默认值。

参考链接

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
请尝试以下步骤来解决`git config --global --add safe.directory`不生效的问题: 1. 确保你已经以管理员身份运行了该命令。在某些操作系统上,需要管理员权限才能修改全局配置。 2. 确认你使用的是正确的命令格式。正确的命令格式是`git config --global --add safe.directory [目录路径`,其中``是你要添加例外的目录的路径。 3. 检查一下你已经执行的`git config --global -l`或者`git config --global --list`命令的输出。确保`safe.directory`已经被正确地添加到全局配置中。 4. 如果之前已经执行了`git config --global --add safe.directory`命令,可以尝试先执行`git config --global --unset-all safe.directory`来移除之前添加的配置,然后再重新执行`git config --global --add safe.directory`命令。 如果以上步骤都没有解决问题,请提供更多详细信息,例如操作系统类型、具体的命令和输出,以便我们更好地帮助你解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [git相关教程 - 详细版(一)](https://blog.csdn.net/m0_37605642/article/details/124531884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值