我是 Git 的新手,假设我一次创建了 10 个文件,然后将这 10 个文件添加到舞台区域,然后提交它们。
然后我创建了另一个文件(第 11 个文件),因为这个文件名很长,我不想像 git 命令那样键入 git 命令
git add lllllllllllllongname.txt
相反,我输入了:
git add .
git 是否还会在内部将首次创建的这 10 个文件重新添加到暂存区域? 因为我检查了 Git 文档,它没有说add
命令只会将未跟踪的文件或修改的文件添加到暂存区域?
这里重要的是暂存区域已经包含您的所有文件。
如果您的存储库不是太大,请尝试运行:
git ls-files --stage
如果您的存储库有很多文件,这将产生大量的输出。 这仍然只是一个看起来的情况,所以没关系,但你可能希望通过寻呼机管道输出——git ls-files
不是日常使用的 Git 命令,所以它不会像git log
和git diff
那样自我分页。
即使在新的结帐时,您也会看到git status
说:
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
您的暂存区域包含大量文件! 重要的是,现在暂存区域中的内容与其他两个区域中的内容相同。
请记住,Git 有时每个跟踪文件都有三个副本。 假设您的跟踪文件之一名为README.md
。 它在你的工作树中,在那里你可以看到它并处理它。 但是它有三个副本!
有
HEAD:README.md
,这是当前提交中冻结的已提交文件。 使用git show HEAD:README.md
查看它。然后是您的暂存区域中的
README.md
。 使用git show :README.md
查看它。 该文件的副本采用冻结格式,就像当前提交中的格式一样,但与当前提交中的副本不同,您可以通过将其批量替换为工作树中的副本来更改它。最后,还有
README.md
,您可以查看和使用。 您不需要任何特殊命令来显示它,因为它只是一个普通文件。
当你运行git commit
时,Git 会获取文件暂存区副本中的任何内容,并将其冻结到你所做的新提交中。 因此,如果您更改了README.md
的工作树副本,但尚未接触暂存副本,则下一个git commit
将使用旧的、未更改的暂存副本。 如果希望它使用新的,请运行git add
从工作树复制到暂存区域。这会将更新的README.md
压缩为冻结格式,准备提交。 它实际上还没有提交,它只是准备好了。
如果重新添加未更改的文件,Git 将看到更新的冻结格式文件仍与原始冻结格式文件相同,已在HEAD
提交中,并且已在暂存区域中。 是否将未更新的文件复制到暂存区域中未更新、仍然相同、仍准备就绪的文件中并不重要。
实际上,暂存区域是您建议的下一个提交。 它开始匹配您当前的提交。 如果您重新添加文件,那是无害的:要么它们没有变化,所以它们仍然匹配您当前的提交,要么它们被更改了,但您希望它们在建议的下一次提交中被更改。
您唯一不想git add
某个特定文件的情况是在工作树中更改该文件时,但您希望:
- 使其在暂存区域中保持不变,或
- 将其完全保留或取出,以便下次提交时不会缺少它。
如果文件README.md
在当前提交中,并且您将其从暂存区域中取出,这样它就不会在下一次提交中,那么无论如何,在 Git 看来,您只需删除README.md
。 您是否删除了工作树中的README.md
并不重要。 工作树不是给Git的,而是给你的。 在工作树中,您可以查看和处理文件。 Git 使用暂存区域副本进行下一次提交,并使用已提交的副本(每次提交中都有一个副本)用于提交的副本。
使用git add .
时,git只将有更改的文件添加到暂存区域。
如果在初始暂存之后编辑或添加了新文件,则在下一阶段将仅添加这些更改。 提交在这方面没有区别,但它使取消暂存更加困难。
If you create 10 files first (1.txt,2.txt...…,10.txt) then commit all as below
git add .
git commit "commit message"
git status
如果您执行git status
那么它对您来说是可见的,没有什么可提交的。
然后,当您创建下一个文件(即 11.txt)时,现在如果您执行git status
那么您将只看到您最近创建的一个文件,因此再次按照上面的 3 命令进行操作,然后您意识到只为提交添加一个文件,即 11.txt
git add .
git status
git commit "commit message"
git status
pathspec的git add
文档描述了 git 在添加目录时的行为。
git add
[options…] [<pathspec>…]
<路径规范>...路径规范>
。也是一个前导目录名称(例如 可以给出添加
dir/file1
和dir/file2
dir
来更新索引以匹配整个目录的当前状态(例如,指定dir
不仅会记录在工作树中修改dir/file1
的文件,dir/file2
添加到工作树中的文件,还可以记录dir/file3
从工作树中删除的文件)。请注意,旧版本的 Git 曾经忽略已删除的文件;如果要添加修改的文件或新文件,但忽略已删除的文件,请使用--no-all
[或--ignore-removal
] 选项。
在您的情况下,假设是最新版本的 git,git add .
将在当前目录子树中暂存更改,这些更改是
- 新文件
- 修改的文件
- 已删除的文件
对于已暂存的更改,这些文件不会显示为已修改,因为工作树中的内容将与索引或暂存区域中的内容相同。
默认情况下,对暂存已删除文件的更改随版本 2.0.0 一起提供。
git add <path>
和现在的git add -A <path>
一样,所以git add dir/
会注意到您从目录中删除的路径,并且 记录删除。 在旧版本的 Git 中,git add <path>
使用 以忽略移除操作。 你可以说git add --ignore-removal <path>
如果您确实需要,请仅在PATH中添加或修改的路径。