我刚刚克隆了一个 git 存储库并签出了一个分支。我进行了研究,然后决定删除所有本地更改,因为我想要原始副本。
简而言之,我必须执行以下两个命令来删除我的本地更改
git checkout . git clean -f
我的问题是,
(1)这是摆脱本地更改的正确方法,否则请告诉我正确的方法。
(2) 我们什么时候使用git reset --hard,因为即使没有这个命令我也可以重置
git reset --hard
谢谢
解决方案:主要编辑:03/26: 用 git 特定术语替换了许多模糊的术语 [tracked/untracked/staged/unstaged]
当我们进行本地更改时,可能只有三类文件:
类型 1. 分阶段跟踪文件 类型 2. 未暂存的跟踪文件 类型 3. Unstaged UnTracked 文件又名 UnTracked 文件
类型 1. 分阶段跟踪文件
类型 2. 未暂存的跟踪文件
类型 3. Unstaged UnTracked 文件又名 UnTracked 文件
每个命令的作用:
git checkout .- 仅删除未暂存的跟踪文件 [类型 2]
git checkout .
git clean -f- 仅删除 Unstaged UnTracked 文件 [Type 3]
git clean -f
git reset --hard- 仅删除分阶段跟踪和非分阶段跟踪文件[类型 1,类型 2]
git stash -u- 删除所有更改 [Type 1, Type 2, Type 3]
git stash -u
结论:
很明显,我们可以使用
(1) combination of `git clean -f` and `git reset --hard`
要么
(2) `git stash -u`
以达到预期的结果。
注意:藏匿,因为这个词的意思是“将(某物)安全、秘密地存放在指定的地方。” 这始终可以使用git stash pop. 因此,在上述两个选项之间进行选择是开发人员的电话。
git stash pop
谢谢 Christoph 和 Frederik Schning。
编辑:03/27
我认为值得将“ 当心 ”注意git clean -f
没有回头路了。使用-n或--dry-run预览您将造成的伤害。
-n
--dry-run
如果您还想删除目录,请运行git clean -f -d
git clean -f -d
如果您只想删除被忽略的文件,请运行git clean -f -X
git clean -f -X
如果要删除忽略的文件和未忽略的文件,请运行git clean -f -x
git clean -f -x
编辑:2015 年 5 月 20 日
丢弃此分支上的所有本地提交 [删除本地提交]
为了丢弃该分支上的所有本地提交,使本地分支与该分支的“上游”相同,只需运行git reset --hard @{u}
git reset --hard @{u}
参考:http ://sethrobertson.github.io/GitFixUm/fixup.html
或者git reset --hard origin/master[如果本地分支是master]
git reset --hard origin/master
master
注意:2015 年 6 月 12 日 这 不是 另一个标记为重复的 SO 问题的重复。这个问题解决了如何删除本地 GIT 更改 [删除添加的文件、删除添加到现有文件的更改等以及各种方法;在其他 SO 线程中仅解决如何删除本地提交的位置。如果您添加了一个文件,并且您想单独删除它,那么另一个 SO 线程不会讨论它。因此,这不是另一个的重复]
编辑:2015 年 6 月 23 日
如何恢复已推送到远程存储库的提交?
$ git revert ab12cd15
编辑:2015 年 9 月 1 日
从本地分支和远程分支删除以前的提交
案例:你刚刚对本地分支提交了一个更改,然后立即推送到远程分支,突然意识到,哦不!我不需要这个改变。现在做什么?
git reset --hard HEAD~1 [用于从本地分支中删除该提交]
git reset --hard HEAD~1
git push origin HEAD --force[这两个命令都必须执行。从远程分支删除]
git push origin HEAD --force
分行是什么?它是当前签出的分支。
编辑 09/08/2015 - 删除本地 git merge :
我在master分支上,并将master分支与新工作的分支合并phase2
phase2
$ git status # On branch master $ git merge phase2 $ git status # On branch master # Your branch is ahead of 'origin/master' by 8 commits.
问:如何摆脱这种合并?试过了git reset --hard ,git clean -d -f 两者都不起作用。
git clean -d -f
唯一 有效 的是以下任何一种:
$ git reset --hard origin/master
$ git reset --hard HEAD~8
$ git reset --hard 9a88396f51e2a068bb7 [sha 提交代码 - 这是在所有合并提交发生之前存在的那个]
$ git reset --hard 9a88396f51e2a068bb7
这完全取决于您要撤消/还原的内容。首先阅读Ube 链接中的帖子。但要尝试回答:
硬重置
git reset --hard [HEAD]
完全删除对跟踪文件的所有暂存和未暂存更改。
我发现自己经常使用硬重置,当我喜欢“只是撤消所有事情,就像我从遥控器完成了完全重新克隆一样”。在您的情况下,您只希望您的回购原始,这将起作用。
干净的
git clean [-f]
删除未跟踪的文件。
用于删除临时文件,但保留已跟踪文件的暂存和未暂存更改。大多数时候,我可能最终会制定一个忽略规则,而不是反复清理——例如,对于 C# 项目中的 bin/obj 文件夹,您通常希望将其从存储库中排除以节省空间,或类似的东西。
-f(强制)选项也将删除那些没有被跟踪 并且 被 git 通过 ignore-rule 忽略的文件。在上述情况下,使用忽略规则永远不会跟踪 bin/obj 文件夹,即使这些文件夹被 git 忽略,使用 force-option 也会将它们从文件系统中删除。我偶尔看到了它的用途,例如在编写部署脚本时,并且您想在部署、压缩或其他任何操作之前清理代码。
Git clean 不会触及已经被跟踪的文件。
结帐“点”
在阅读您的帖子之前,我实际上从未见过这种符号。我很难找到这方面的文档(也许有人可以提供帮助),但是从玩了一下,它看起来意味着:
“撤消我的工作树中的所有更改”。
即撤消跟踪文件中未暂存的更改。它显然不会涉及分阶段的更改,只会留下未跟踪的文件。
藏匿
一些答案提到了存储。正如措辞所暗示的那样,当您处于某些事情的中间(尚未准备好提交)时,您可能会使用存储,并且您必须暂时切换分支或以某种方式处理代码的另一个状态,稍后才能返回您的“混乱桌子”。我认为这不适用于您的问题,但这绝对很方便。
总结
一般来说,如果你确信你已经提交并且可能会推送到远程重要更改,如果你只是在玩耍或类似的事情,使用git reset --hard HEAD后跟git clean -f将明确地将你的代码清理到状态,它会在,如果它刚刚被克隆并从分支机构签出。需要强调的是,重置也将删除分阶段但未提交的更改。 它将擦除所有尚未提交 的内容(未跟踪的文件除外,在这种情况下,请使用 clean )。
git reset --hard HEAD
所有其他命令都是为了促进更复杂的场景,其中需要“撤消东西”的粒度:)
我觉得,您的问题 #1 已涵盖,但最后要总结 #2:您从未发现需要使用的原因git reset --hard是您从未上演过任何事情。如果您进行了更改,则既git checkout .不会也git clean -f不会恢复。
希望这涵盖。