如何跟踪文件但不暂存,以及如何取消暂存但仍跟踪文件?

79

我有两个简明的问题:

  • 如何跟踪文件但不暂存它们?
  • 如何将文件从暂存区中取消暂存而不取消跟踪?

注意: 我知道可以进行初始提交以跟踪文件并从那里开始跟踪我的文件。但是是否可能具体实现我上面所问的内容?

我尝试使用 git add -N <expr>,但它会跟踪该文件并将其添加到提交中:

PS C:\> git add -N fileA
PS C:\> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   fileA
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   README.md
#       modified:   composer.lock
#       modified:   fileA
#

如果我执行 git reset HEAD fileA 或者 git rm --cached fileA ,会取消暂存但同时也取消跟踪该文件。

这个命令 git rm fileA 建议我使用标志 -f 以物理方式删除该文件。

那么,只跟踪而不暂存,或者只取消暂存而不取消跟踪文件是可能的吗?


我只是好奇这样做的目的是什么? - Wakan Tanka
@WakanTanka 未跟踪的文件不会被像 git ls-filesgit clean 这样的工具视为存储库的一部分,但在创建文件和将其包含在提交中之间的某个时刻,您可能希望使用这些工具。 - jayhendren
1
@WakanTanka 或者引用 git add --help 的话说:“这对于显示使用 git diff 的未暂存文件的内容以及使用 git commit -a 提交它们等方面非常有用。” - jayhendren
举个程序的例子,银色搜索器(Ag)只搜索已跟踪的更改,因此非常有用。 - Emobe
另一个原因是我尝试在不同的组中提交更改,以获得更清晰的提交历史记录。我希望在一个地方看到被跟踪但未暂存的内容,以便清晰地了解情况。 - daaronr
3个回答

66

更新(2015年5月)

我尝试使用git add -N <expr>,但它会跟踪文件并将其添加到提交中:

但是,在即将发布的Git 2.5(2015年第二季度)中不再如此。
请参见“使用git add -N后文件未进入提交”。


原始回答(2013年3月)

如何在不取消跟踪文件的情况下取消暂存以提交它们?

这是官方的方法:

git reset HEAD fileA

但由于这是一个新文件,您也需要取消跟踪它(从索引中删除它,没有任何先前的提交引用它)。
开始跟踪文件意味着将其放入索引(阶段)或提交中。
我建议为这些文件创建一个分支,以便在那里添加它们/提交它们。请参见“在GIT上下文中跟踪文件和未跟踪文件是什么?
引用:
  • 已跟踪的文件是上次快照中的文件; 它们可以未修改、已修改或已暂存。
  • 未跟踪的文件是其他所有内容-工作目录中上次快照中不存在且不在暂存区域(索引)中的任何文件。
这意味着对于一个新文件,未暂存的意思就是未跟踪它。

tracked files in git
(来源:Pro Git Book,2.2 Git基础 - 记录对仓库的更改)
(感谢louisfischer在评论中的更新/修复)

另请参阅 "git - 如何通过shell退出代码告诉文件是否被Git跟踪?"。


那么,必须先将新文件暂存(添加到索引中)才能跟踪它吗?你的意思是说不能在不先将新文件添加到索引中的情况下进行跟踪。如果是这样,显然反向操作——取消暂存但保持跟踪——只有在文件已经被跟踪的情况下才能完成。是这样吗? - Jeflopo
@JesúsFlores "取消暂存但保留" 跟踪意味着本地修改不会被删除,但不会被 Git 跟踪。在这些修改之前存在的文件仍然被跟踪,因为它们先前已经提交了。 - VonC
@JesúsFlores 我已经编辑了答案,以澄清被跟踪文件的概念。 - VonC
我看到了一个有趣的帖子,但当我看到文件状态生命周期的图表时,感觉不对劲。经过一些研究,我找到了另一个来自Git文档的图表,似乎更准确 - louisfischer
@louisfischer 谢谢你,说得好。我已经修复了图片,并在答案中引用了你的评论以增加可见性。 - VonC

1
跟踪您的所有文件使用 git add 。提交所有要提交的更改并推送到远程。然后使用 git stash 藏起新文件。您的文件将被跟踪但不会被提交。 因此,在您的示例中,您将从取消暂存文件A开始。然后运行 git add README.md git add composer.lock git commit -m“Committing fun stuff。”。现在我们需要跟踪新文件,而无需对其进行暂存,因此我们只需执行 git add fileA ,然后是 git stash 。当您准备好提交fileA时,可以运行 git stash pop 以提交/推送到远程。

1
你可以简单地做
git add [don't commit files]

然后
git restore --staged [don't comit files]

文件将被跟踪,但不会被暂存以提交

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接