题
如何放弃工作副本中不在索引中的更改?
解决方案
另一种更快的方法是:
git stash save --keep-index --include-untracked
你不需要包括 --include-untracked
如果你不想彻底了解它。
之后,你可以用 git stash drop
如果你愿意的话可以命令。
其他提示
对于当前工作目录中的所有未暂存的文件,请使用:
git checkout -- .
对于特定文件使用:
git checkout -- path/to/file/to/revert
--
在这里删除 论证歧义.
看起来完整的解决方案是:
git clean -df
git checkout -- .
git clean
删除所有未跟踪的文件(警告: :虽然它不会删除 .gitignore 中直接提到的忽略文件, 它可能会删除文件夹中被忽略的文件) 和 git checkout
清除所有未暂存的更改。
这会检查当前目录的当前索引,并丢弃当前目录向下的文件中的所有更改。
git checkout .
或者从索引中检查所有文件,覆盖工作树文件。
git checkout-index -a -f
git clean -df
通过从当前目录开始递归删除不受版本控制的文件来清理工作树。
-d
: :除了未跟踪的文件外,还删除未跟踪的目录
-f
: :力(可能没有必要,具体取决于 clean.requireForce
环境)
跑步 git help clean
查看手册
我最喜欢的是
git checkout -p
这使您可以有选择地恢复块。
也可以看看:
git add -p
由于没有答案表明我使用的确切选项组合,因此如下:
git clean -dfx
git checkout .
这是所使用的在线帮助文本 git clean
选项:
-d
除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由不同的 Git 存储库管理,则默认情况下不会将其删除。使用 -f
如果您确实想删除这样的目录,请选择两次。
-f
如果Git配置变量 clean.requireForce
未设置为 false
, Git clean 将拒绝删除文件或目录,除非给出 -f
, -n
, , 或者 -i
. 。Git 将拒绝删除内的目录 .git
子目录或文件,除非有第二个 -f
给出。
-x
不要使用忽略规则 .gitignore
(每个目录)和 $GIT_DIR/info/exclude
, ,但仍然使用给出的忽略规则 -e
选项。这允许删除所有未跟踪的文件,包括构建产品。这可以使用(可能与 git reset
)创建一个原始工作目录来测试干净的构建。
还, git checkout .
需要在存储库的根目录中完成。
我确实发现这篇文章有助于解释何时使用什么命令: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
有几种不同的情况:
如果您还没有暂存该文件,那么您可以使用
git checkout
. 。签出“更新工作树中的文件以匹配索引中的版本”。如果文件尚未暂存(也称为添加到索引)...该命令实际上会将文件恢复到您上次提交的状态。git checkout -- foo.txt
如果您已暂存该文件,请使用 git reset。重置会更改索引以匹配提交。
git reset -- foo.txt
我怀疑使用 git stash
是一个受欢迎的选择,因为它的危险性要小一些。如果您在使用 git Reset 时不小心吹掉了太多内容,您可以随时返回到它。默认情况下,重置是递归的。
请参阅上面的文章以获取进一步的建议。
最简单的方法是使用以下命令:
该命令用于放弃工作目录中的更改 -
git checkout -- .
https://git-scm.com/docs/git-checkout
在 git 命令中,未跟踪文件的存储是通过使用以下命令来实现的:
git stash -u
如果你只是希望 删除对现有文件的更改, , 使用 checkout
(记录在这里).
git checkout -- .
- 没有指定分支,因此它检查当前分支。
- 双连字符 (
--
) 告诉 Git 接下来的内容应该作为它的第二个参数(路径),您跳过了分支的规范。 - 时期 (
.
) 表示所有路径。
如果你想 删除添加的文件 自上次提交以来,使用 clean
(记录在这里):
git clean -i
- 这
-i
选项启动交互clean
, ,防止误删除。 - 还有一些其他选项可以加快执行速度;请参阅文档。
如果你希望 将更改移动到保存空间以供以后访问, , 使用 stash
(记录在这里):
git stash
- 所有更改都将移至 Git 的 Stash 中,以便以后访问。
- 有一些选项可用于更细致的隐藏;请参阅文档。
如果您对保留未暂存的更改不感兴趣(特别是如果暂存的更改是新文件),我发现这很方便:
git diff | git apply --reverse
当您输入 git status 时,(使用“git checkout -- ...”放弃工作目录中的更改)显示。
例如 git checkout -- .
git checkout -f
man git-checkout
:
-f, --force
切换分支时,即使索引或工作树与 HEAD 不同,也要继续进行。这用于丢弃本地更改。
从索引中检查路径时,不要因未合并的条目而失败;相反,未合并的条目将被忽略。
您可以使用 git stash - 如果出现问题,您仍然可以从存储中恢复。与此处的其他一些答案类似,但此答案还会删除所有未暂存的文件以及所有未暂存的删除:
git add .
git stash
如果您检查一切正常,请将藏品扔掉:
git stash drop
Bilal Maqsood 的回答 git clean
也为我工作,但有了储藏室,我有了更多的控制权 - 如果我不小心做了某事,我仍然可以取回我的更改
更新
我认为还有 1 个更改(不知道为什么这对我以前有用):
git add . -A
代替 git add .
没有 -A
删除的文件不会被暂存
我没有放弃更改,而是将遥控器重置为原点。注意 - 此方法是将您的文件夹完全恢复到存储库的文件夹。
所以我这样做是为了确保当我重置 git 时它们不会坐在那里(稍后 - 排除 Origin/branchname 上的 gitignores)
笔记:如果您想保留尚未跟踪的文件,但不在 GITIGNORE 中,您可能希望跳过此步骤,因为它将擦除远程存储库中未找到的这些未跟踪文件(感谢@XtrmJosh)。
git add --all
然后我
git fetch --all
然后我重置到原点
git reset --hard origin/branchname
这将使它回到一开始。就像重新克隆分支一样,同时将所有 gitignored 文件保留在本地并就位。
根据用户评论更新如下:将 重置为用户所在的当前分支的变体。
git reset --hard @{u}
尝试了上述所有解决方案,但仍然无法删除新的、未暂存的文件。
使用 git clean -f
删除这些新文件 - 不过要小心! 注意强制选项。
简单地说
git stash
它将删除您的所有本地更改。您也可以稍后使用,说
git stash apply
或git储存流行音乐
只需使用:
git stash -u
完毕。简单的。
如果你 真的 关心你的存储堆栈然后你可以跟随 git stash drop
. 。但那时你最好使用(来自 Mariusz Nowak):
git checkout -- .
git clean -df
尽管如此,我还是喜欢 git stash -u
最好的,因为它“丢弃”所有跟踪和未跟踪的更改 一个命令. 。然而 git checkout -- .
只放弃跟踪变化,以及 git clean -df
只丢弃未跟踪的更改...输入这两个命令是 远的 太多工作 :)
即使在以下目录中,这也适用;超出正常的 git 权限。
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
最近发生在我身上
cd path_to_project_folder # take you to your project folder/working directory
git checkout . # removes all unstaged changes in working directory
无论您的存储库处于什么状态,您都可以随时重置为之前的任何提交:
git reset --hard <commit hash>
这将丢弃该提交后所做的所有更改。
删除比 git clean -df 更具体的新文件的另一种方法(它允许您删除一些文件,不一定是全部),是首先将新文件添加到索引中,然后存储,然后删除藏。
当由于某种原因,您无法通过某种普通机制(如 rm)轻松删除所有未跟踪的文件时,此技术非常有用。
在我看来,
git clean -df
应该可以解决问题。按照 关于 git clean 的 Git 文档
git-clean - 从工作树中删除未跟踪的文件
描述
从当前目录开始,通过递归删除不在版本控件的文件来清洁工作树。
通常,仅删除GIT未知的文件,但是如果指定了-X选项,也会删除被忽略的文件。例如,这对于删除所有构建产品可能很有用。
如果有任何可选...给出了参数,只有那些路径受到影响。
选项
-d 除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由其他GIT存储库管理,则默认情况下不会将其删除。如果您真的想删除此类目录,请使用-f选项两次。
-f - force如果git配置变量清洁。不设置为false,则git Clean将拒绝运行,除非给定-f,-n或-i。
如果您正在使用定期同步的存储库的分支(例如拉取请求)与另一个存储库。简短回答:删除 fork 并重新 fork,但是 阅读 github 上的警告.
我遇到了类似的问题,也许不完全相同,我很遗憾地说我的解决方案并不理想,但它最终是有效的。
我经常会收到这样的 git 状态消息(至少涉及 2/4 个文件):
$ git status
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
# modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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: doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
# modified: doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats
敏锐的眼睛会注意到这些文件有双重字符,是一个字母,以防万一。不知何故,我不知道是什么引导我走上这条路(因为我自己没有从上游存储库处理这些文件),我已经切换了这些文件。尝试此页面(和其他页面)上列出的许多解决方案似乎没有帮助。
我能够通过删除我的分叉存储库和所有本地存储库并重新分叉来解决该问题。仅此还不够。上游必须将有问题的文件重命名为新文件名。 只要您没有任何未提交的工作,没有 wiki,也没有与上游存储库不同的问题,您应该没问题。至少可以说,上游可能对你不太满意。至于我的问题,这无疑是一个用户错误,因为我对 git 不太熟悉,但修复起来并不容易,这一事实也表明了 git 的问题。
当您想将藏品转移给其他人时:
# add files
git add .
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff
[编辑] 正如评论的那样,可以命名藏匿处。好吧,如果您想分享您的藏品,请使用这个;)
您可以创建自己的别名,以描述性方式描述如何执行此操作。
我使用下一个别名来放弃更改。
放弃工作树中文件(列表)中的更改
discard = checkout --
然后你可以使用它作为 next 来放弃所有更改:
discard .
或者只是一个文件:
discard filename
否则,如果您想放弃所有更改以及未跟踪的文件,我会混合使用 checkout 和 clean:
清理并丢弃工作树中的更改和未跟踪的文件
cleanout = !git clean -df && git checkout -- .
所以使用很简单,如下:
cleanout
现在可以在下一个 Github 存储库中找到,其中包含很多别名:
如果所有暂存文件均已实际提交,则可以简单地重置分支,例如从 GUI 中点击大约三下鼠标即可: 分支, 重置, 是的!
因此,在实践中,为了恢复不需要的本地更改,我经常做的就是提交所有好的内容,然后重置分支。
如果好的内容是在一次提交中提交的,那么如果您最终希望以不同的方式提交它,则可以使用“修改上次提交”将其恢复为暂存或未暂存状态。
这可能不是您正在寻找的技术解决方案来解决您的问题,但我发现它是一个非常实用的解决方案。它允许您有选择地放弃未暂存的更改,重置您不喜欢的更改并保留您所做的更改。
所以总而言之,我只是做 犯罪, 分支重置, , 和 修改最后一次提交.
如果您遇到子模块并且没有其他解决方案可以尝试:
要检查问题所在(可能是“脏”情况),请使用:
git diff
删除隐藏的
git submodule update
我遇到了一个奇怪的情况,文件总是未暂存,这可以帮助我解决。
git rm .gitattributes
git添加-A
git重置——硬
如果几乎不可能排除文件的修改,您是否考虑过忽略它们?如果这个说法是正确的,并且您在开发过程中不会碰这些文件,那么这个命令可能会很有用:
git update-index --assume-unchanged file_to_ignore