小编典典

删除本地 Git 更改的各种方法

all

我刚刚克隆了一个 git 存储库并签出了一个分支。我进行了研究,然后决定删除所有本地更改,因为我想要原始副本。

简而言之,我必须执行以下两个命令来删除我的本地更改

git checkout .

git clean -f

我的问题是,

(1)这是摆脱本地更改的正确方法,否则请告诉我正确的方法。

(2) 我们什么时候使用git reset --hard,因为即使没有这个命令我也可以重置

谢谢

解决方案:主要编辑:03/26: 用 git 特定术语替换了许多模糊的术语
[tracked/untracked/staged/unstaged]

当我们进行本地更改时,可能只有三类文件:

类型 1. 分阶段跟踪文件

类型 2. 未暂存的跟踪文件

类型 3. Unstaged UnTracked 文件又名 UnTracked 文件

  • 暂存 - 那些被移动到暂存区/添加到索引
  • 跟踪 - 修改的文件
  • 未跟踪 - 新文件。始终未上演。如果上演,这意味着他们被跟踪。

每个命令的作用:

  1. git checkout .- 仅删除未暂存的跟踪文件 [类型 2]

  2. git clean -f- 仅删除 Unstaged UnTracked 文件 [Type 3]

  3. git reset --hard- 仅删除分阶段跟踪和非分阶段跟踪文件[类型 1,类型 2]

  4. git stash -u- 删除所有更改 [Type 1, Type 2, Type 3]

结论:

很明显,我们可以使用

(1) combination of `git clean -f` and `git reset --hard`

要么

(2) `git stash -u`

以达到预期的结果。

注意:藏匿,因为这个词的意思是“将(某物)安全、秘密地存放在指定的地方。” 这始终可以使用git stash pop.
因此,在上述两个选项之间进行选择是开发人员的电话。

谢谢 Christoph 和 Frederik Schning。

编辑:03/27

我认为值得将“ 当心 ”注意git clean -f

git clean -f

没有回头路了。使用-n--dry-run预览您将造成的伤害。

如果您还想删除目录,请运行git clean -f -d

如果您只想删除被忽略的文件,请运行git clean -f -X

如果要删除忽略的文件和未忽略的文件,请运行git clean -f -x

编辑:2015 年 5 月 20 日

丢弃此分支上的所有本地提交 [删除本地提交]

为了丢弃该分支上的所有本地提交,使本地分支与该分支的“上游”相同,只需运行git reset --hard @{u}

参考:http
://sethrobertson.github.io/GitFixUm/fixup.html

或者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 push origin HEAD --force[这两个命令都必须执行。从远程分支删除]

分行是什么?它是当前签出的分支。

编辑 09/08/2015 - 删除本地 git merge

我在master分支上,并将master分支与新工作的分支合并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 --hardgit clean -d -f 两者都不起作用。

唯一 有效 的是以下任何一种:

$ git reset --hard origin/master

要么

$ git reset --hard HEAD~8

要么

$ git reset --hard 9a88396f51e2a068bb7 [sha 提交代码 - 这是在所有合并提交发生之前存在的那个]


阅读 99

收藏
2022-03-03

共1个答案

小编典典

这完全取决于您要撤消/还原的内容。首先阅读Ube
链接中的帖子
。但要尝试回答:

硬重置

git reset --hard [HEAD]

完全删除对跟踪文件的所有暂存和未暂存更改。

我发现自己经常使用硬重置,当我喜欢“只是撤消所有事情,就像我从遥控器完成了完全重新克隆一样”。在您的情况下,您只希望您的回购原始,这将起作用。

干净的

git clean [-f]

删除未跟踪的文件。

用于删除临时文件,但保留已跟踪文件的暂存和未暂存更改。大多数时候,我可能最终会制定一个忽略规则,而不是反复清理——例如,对于 C# 项目中的 bin/obj
文件夹,您通常希望将其从存储库中排除以节省空间,或类似的东西。

-f(强制)选项也将删除那些没有被跟踪 并且 被 git 通过 ignore-rule 忽略的文件。在上述情况下,使用忽略规则永远不会跟踪 bin/obj 文件夹,即使这些文件夹被 git 忽略,使用 force-option 也会将它们从文件系统中删除。我偶尔看到了它的用途,例如在编写部署脚本时,并且您想在部署、压缩或其他任何操作之前清理代码。

Git clean 不会触及已经被跟踪的文件。

结帐“点”

git checkout .

在阅读您的帖子之前,我实际上从未见过这种符号。我很难找到这方面的文档(也许有人可以提供帮助),但是从玩了一下,它看起来意味着:

“撤消我的工作树中的所有更改”。

即撤消跟踪文件中未暂存的更改。它显然不会涉及分阶段的更改,只会留下未跟踪的文件。

藏匿

一些答案提到了存储。正如措辞所暗示的那样,当您处于某些事情的中间(尚未准备好提交)时,您可能会使用存储,并且您必须暂时切换分支或以某种方式处理代码的另一个状态,稍后才能返回您的“混乱桌子”。我认为这不适用于您的问题,但这绝对很方便。

总结

一般来说,如果你确信你已经提交并且可能会推送到远程重要更改,如果你只是在玩耍或类似的事情,使用git reset --hard HEAD后跟git clean -f将明确地将你的代码清理到状态,它会在,如果它刚刚被克隆并从分支机构签出。需要强调的是,重置也将删除分阶段但未提交的更改。
它将擦除所有尚未提交 的内容(未跟踪的文件除外,在这种情况下,请使用 clean )。

所有其他命令都是为了促进更复杂的场景,其中需要“撤消东西”的粒度:)

我觉得,您的问题 #1 已涵盖,但最后要总结 #2:您从未发现需要使用的原因git reset --hard是您从未上演过任何事情。如果您进行了更改,则既git checkout .不会也git clean -f不会恢复。

希望这涵盖。

2022-03-03