如何从Git的暂存区域中删除单个文件,但不将其从索引中删除或撤消对文件本身的更改?

时间:2009-10-01 19:24:05

标签: git staging

情况:我有一个Git存储库,其中包含已存在于索引中的文件。我对几个文件进行了更改,打开Git并使用“git add”将这些文件添加到我的临时区域。

问题:如何从暂存区域中删除其中一个文件,但不将其从索引中删除或撤消对文件本身的更改?

19 个答案:

答案 0 :(得分:1730)

如果我正确理解了这个问题,您只需要“撤消”为该文件完成的git add

如果您需要从暂存区域中删除单个文件,请使用

git reset HEAD -- <file>

如果您需要从暂存区域中删除整个目录(文件夹),请使用

git reset HEAD -- <directoryName>

您的修改将被保留。当您运行git status时,该文件将再次显示为已修改但尚未暂存。

有关详细信息,请参阅git reset man page

答案 1 :(得分:145)

git rm --cached FILE

git rm -r --cached CVS */CVS

答案 2 :(得分:84)

git reset <file>

无论您是否有任何先前的提交,都可以使用。

答案 3 :(得分:52)

所以,稍微调整一下Tim Henigan的回答:你需要在文件名之前使用 - 。它看起来像这样:

git reset HEAD -- <file>

答案 4 :(得分:15)

git reset filename.txt

如果您在filename.txt中进行了修改,则表示您错误地将其添加到舞台,并且您希望从暂存中删除该文件,但您不想丢失更改。

答案 5 :(得分:6)

如果您只想删除文件更改的子集,可以使用:

git reset -p

git reset -p <file_name>

此命令基本上与git add -p相反:它只会从暂存区域中删除所选的更改。我发现它在“取消添加”我错误添加的内容时非常有用。

答案 6 :(得分:4)

如果您想删除某个模式后面的文件并且使用的是git rm --cached,那么您也可以使用file-glob模式。

请参阅here

答案 7 :(得分:3)

对于较新版本的Git,有objMgr = Gio::DBus::ObjectManagerServer::create("/my/object/path"); skeleton = Gio::DBus::ObjectSkeleton::create("/my/object/path"); skeleton->add_interface(+++); myObject->register_object(connection, "/my/object/path"); objMgr->set_connection(connection);

当我对Git版本git restore --staged <file>执行git status时,也建议取消登台:

2.26.2.windows.1

({This帖子显示,此时建议使用Changes to be committed: (use "git restore --staged <file>..." to unstage) 的早期版本)

我强烈推荐this帖子,说明git reset HEADgit revertgit restore之间的区别以及git reset的其他参数。

答案 8 :(得分:2)

您需要进入文件目录,然后在终端中输入以下内容

df2$CCGName
#[1] "Barking and Dagenham"         "Bath and North East Somerset" "Brent"                        "Bromley"                     
#[5] "Canterbury and Coastal"       "Bedfordshire"                 "Castle Point and Rochford"    "City and Hackney"            
#[9] "Bassetlaw"                    "Calderdale"

答案 9 :(得分:2)

$mlocate -S | head -1 | cut -d' ' -f2 | tr -d ':' | xargs ls -ltr | cut -d' ' -f6-8 Mar 30 04:28 $ 版本之后,Git引入了order getCustomerOrder(string or_n) { using (foodorderingEntities db = new foodorderingEntities ()) { var result = db.orders.Where(or => or.order_no == or_n).FirstOrDefault(); return result; } } 命令,您可以使用该命令。引用官方文档:

将工作路径中的某些内容恢复到工作树中的指定路径 恢复源。如果跟踪了路径但还原中不存在 源,它将被删除以匹配源。

该命令还可以用于使用以下命令恢复索引中的内容 2.23,或使用git restore恢复工作树和索引。

因此,您可以调用--staged并取消暂存文件,还可以保留所做的更改。请记住,如果未暂存文件,则会丢失对其所做的所有更改。

答案 10 :(得分:2)

当您执行git status时,Git会告诉您如何取消暂停:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

所以git reset HEAD <file>为我工作,改变没有被触及。

答案 11 :(得分:2)

你想:

  • 影响单个文件

  • 从暂存区域中删除文件

  • 不从索引中删除单个文件

  • 不要自行撤消更改

,解决方案是

git reset HEAD file_name.ext

git reset HEAD path/to/file/file_name.ext

答案 12 :(得分:1)

如果您对许多跟踪文件进行了更改,但只想暂存其中一部分,请执行

git add .

并不总是令人满意(或推荐)-因为它会暂存所有跟踪的文件(在某些情况下,您只想保留自己的更改,而不希望暂存到远程存储库中)。

做一堆

也不理想

git add path/to/file1 path/to/file2

如果您有很多嵌套目录(大多数项目中都是这种情况)-会很烦人

那是Git GUI有用的时候(可能只有我使用它的时候)。只需打开Git GUI,它会显示已暂存和未暂存的文件部分。从暂存部分中选择要取消暂存的文件,然后按

  

Ctrl+U(对于Windows)

取消登台。

答案 13 :(得分:0)

我认为您可能对索引的概念感到困惑,例如@CB Bailey commented:

  

暂存区是索引。

您可以简单地将登台目录索引视为同一事物。
因此,我猜想像@Tim Henigan's answer一样:

  

您只是想“撤消”对该文件执行的git add



这是我的答案:

很常见,有两种方法可以撤消阶段操作,正如已经提到的其他答案一样:

git reset HEAD <file>

git rm --cached <file>

但是有什么区别?

假设文件已经过暂存,并且也存在于工作目录中,如果要从暂存目录中删除文件,请使用git rm --cached <file>。 strong>,并将文件保存在工作目录中。但是请注意,此操作不仅会从登台目录中删除文件,还会在登台目录中将文件标记为deleted(如果使用

git status

此操作后,您将看到:

        deleted:    <file>

这是从登台目录中删除文件的记录。如果您不想保留该记录,而只是想撤消文件的前一阶段操作,请改用git reset HEAD <file>


--------答案结束--------

PS:我注意到提到了一些答案:

git checkout -- <file>

此命令适用于文件已被暂存但已在暂存后在工作目录中进行了修改的情况,请使用此操作来还原文件。文件从登台目录中的工作目录中。换句话说,执行此操作后,更改将在您的工作目录中发生,而不是在您的登台目录中发生。

答案 14 :(得分:0)

我的样品:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

您可能会注意到

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)

答案 15 :(得分:-1)

您需要位于文件目录中,然后在终端中输入以下内容

git reset HEAD .

假设您只需要重置一个文件。

答案 16 :(得分:-4)

要一次取消所有内容,请运行此命令

git reset HEAD -- .

答案 17 :(得分:-10)

git checkout -- <file>

完美地从暂存区域中删除文件

答案 18 :(得分:-11)

在我的情况下,我做

git checkout -- FILE