在Git中撤销特定文件夹中所做的更改

57

如何取消对特定文件夹所做的更改?

我已修改了来自多个文件夹的文件,例如:

app/code/core/
app/code/local/
app/design/frontend/
我想撤销所有 app/code/core/ 中文件所做的更改,同时保留 app/code/local/app/design/frontend/ 文件中所做的更改。

1
如果您想要,也可以使用以下技巧来隐藏特定目录:https://dev59.com/MG035IYBdhLWcg3wSOGr#13941132 - noisy
5个回答

92
如果您想撤消更改,请执行git checkout app/code/core/

4
我打开了一个文件夹(我想还原其中的所有更改),并输入了 git checkout ./。 - Gopalkrishna Mudaliar
1
它只列出更改,但实际上不会拉取它们,请使用 git checkout -f 强制检出。 - Aziris
10
为什么这个有那么多赞?对于一个充满移动文件/目录的文件夹没有任何作用。 - searchengine27
1
这个不起作用,请更新你的答案。 - Mohamed Mo Kawsara
1
这个答案非常糟糕。在简单的情况下它会做正确的事情,在高级情况下它会做错的事情,但是表面上看起来是工作的。这是因为git是基于文件而不是目录进行推理的,在checkout的情况下,git只会更新存在于被checkout的代码中的文件。因此,您需要首先删除目录中的所有文件。请参见我的下面的答案。 - tenedor
@searchengine27,在Git中撤销已移动的文件夹与撤销文件夹内容的更改是不同的操作。Git将移动视为删除加上添加。您需要删除新文件夹,然后git checkout旧文件夹。 - tenedor

3
  1. 进入你想要删除的文件夹,例如:cd app/code/core/
  2. 运行 git clean -fd

注意:你也可以使用 git clean -fdn 进行干运行,查看这些命令将会删除哪些文件。


2
从git 2.22+版本开始:
要撤销对一个目录的未提交更改:
git checkout --no-overlay -- <directory>

将目录重置为特定提交的状态:

git checkout --no-overlay <commit> -- <directory>

如何通过创建补丁将文件夹恢复到特定的提交


在 git 2.22 之前:
警告:这些方法还会从目录中删除被 git 忽略的文件。
要撤消对目录的未提交更改:
rm -rf <directory>
git checkout -- <directory>

将目录重置为特定提交时的状态:
rm -rf <directory>
git checkout <commit> -- <directory>

注意:单独使用git checkout <directory>是一个糟糕的答案。在简单情况下,它会做正确的事情,在复杂情况下,它会做错误的事情,但表面上看起来是有效的。这是因为git是根据文件而不是目录进行推理的,在checkout的情况下,git只会更新已经存在于被检出代码中的文件。因此,您需要使用--no-overlay标志(2.22+)或者首先删除该目录中的所有文件。

1
我认为这意味着应该从GIT中删除给定目录中的所有文件。 - Human programmer
1
谢谢 @TheHumanCat,我已经根据你的反馈改进了我的回答。 - tenedor

2
如果更改未提交,您可以运行git restore folder-with-changes/*
它也递归地应用于子文件夹。

这个功能很好,但需要与 git clean -fxd folder-with-changes/ 结合使用,以清理新的、之前未提交的文件。 - Martin_W

-5

对我来说,git checkout -f 就解决了问题,git checkout 只是列出更改而不应用它们。


3
请注意,这个操作会撤销整个仓库的所有更改,而不仅仅是单个目录。git checkout 没有起作用的原因是你需要指定一个目录。例如(对于当前目录及其所有子目录):git checkout . - Kevin Meboe

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