Git重置(撤消、丢弃)文件变更

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git重置(撤消、丢弃)文件变更相关的知识,希望对你有一定的参考价值。

参考技术A

在Git中,有以下几种方案可以实现 丢弃文件变更(即:撤消文件更改):

各个方案的详细原理和使用方式如下:

restore 命令主要用于恢复 工作区 和 暂存区 中的文件变更;所以,它是专为丢弃文件变更而设计的命令;

使用方式如下:

语法:

示例:

checkout 命令主要作用是用来签出指定分支的;但也可以用来签出指定的文件,我们可以利用这个特性来实现丢弃文件变更;

将指定的文件签出到指定提交的版本;
语法:

示例:

reset 命令的作用是将 HEAD 重置某个提交,它操作的目标是提交历史;但该命令有个特性是可以将重置的变更(即重置后丢弃的变更)放在 暂存区 或 工作区中,也可以完会丢弃 并 重置暂时区 或 工作区;利用这个特性,我们可以实现丢弃文件变更的效果;

将当前 HEAD 重置到当前 HEAD,即不改变 HEAD 的位置,根据需要选择将 暂存区 或 工作区 重置到 HEAD 的状态;

示例:

如何撤消 git pull?

【中文标题】如何撤消 git pull?【英文标题】:How to undo a git pull? 【发布时间】:2011-08-14 11:59:53 【问题描述】:

由于远程源上不需要的提交,我想撤消我的 git pull,但我不知道我必须重置回哪个版本。

我怎样才能回到在远程源上执行 git pull 之前的状态?

【问题讨论】:

旁注:您可能会发现它对 git fetch upstream 有用,然后快速查看 git diff upstream/branch 以了解您将合并的内容。如果一切顺利,然后继续使用 @987654323 @ 如果任何时髦的 brogrammer 看到你从 GUI 执行 git 命令,你将失去你所有的街头信誉并被扣掉一周的工资,但 GitHub 桌面 b> 和 Atom 具有用于undo 提交和复选框的安全、直接按钮,可以轻松清晰地暂存和取消暂存文件。 GUI 也是人! 【参考方案1】:

git reflog show 应该向您展示 HEAD 的历史。您可以使用它来确定您在pull 之前的位置。然后你可以reset 你的HEAD 提交。

【讨论】:

git reflog show 给出了这个输出:c9e5e4d HEAD@0: pull : 快进 1c86a22 HEAD@1: pull origin master: Fast forward 05c141a HEAD@2: pull : Fast forward我可以安全地将 HEAD 重置为 HEAD@1 sehe 的另一个答案详细说明了如何到达那里。 在灾难性的提交以某种方式将合并提交散布到我的历史记录之后,这非常有用。通过在 reflog 中寻找最后一个已知的好,然后强制推动,将它们排除在外。 如果pull 是第一个操作怎么办?如果pull 位于HEAD@1,并且在此之前没有其他内容,您如何恢复到之前的状态? 重新创建存储库?【参考方案2】:

或者让它比其他答案更明确:

git pull 

哎呀?

git reset --keep HEAD@1

早于 1.7.1 的 git 版本没有--keep。如果你使用这样的版本,你可以使用--hard - 但这是一个危险的操作,因为它会丢失任何本地更改。


To the commenter

ORIG_HEAD 是 HEAD 的先前状态,由可能具有危险行为的命令设置,以便于恢复它们。现在 Git 有 reflog 用处不大:HEAD@1 大致相当于 ORIG_HEAD(HEAD@1 始终是 HEAD 的最后一个值,ORIG_HEAD 是危险操作之前 HEAD 的最后一个值)

【讨论】:

HEAD@1 和 HEAD^ 有什么区别? @hugemeow 这将是一个很好的问题。同时man git-rev-parse 对此进行了描述。 HEAD@1reflog 中符号 HEAD 的前一个值,而 HEAD^ 是当前 HEAD 的(第一个)父修订版。这两者必须是等价的(例如,在变基、硬重置、分支切换等之后)。请阅读链接的文章以获取 reflog。干杯 PowerShell 用户,用反引号转义括号:git reset HEAD@`1` ss64.com/ps/syntax-esc.html 我想你想输入HEAD@`1`,或者就此而言,也可以在 POSIX shell 上使用:'HEAD@1' 我认为它不仅重置了 pull,而且还重置了我的提交 =(【参考方案3】:

找到你想要提交的<SHA#>。您可以在 github 中找到它,或者在命令行输入 git loggit reflog show 然后执行 git reset --hard <SHA#>

【讨论】:

找到提交的内容? 抱歉,我已修复 <SHA#> 这是我必须撤消某事时使用最多的命令【参考方案4】:

这对我有用。

git reset --hard ORIG_HEAD 

撤消合并或拉取:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

查看此内容:HEAD and ORIG_HEAD in Git 了解更多信息。

【讨论】:

【参考方案5】:

来自https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

撤消合并或拉入脏工作树

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

即使 您可能在工作树中进行了本地修改,您可以安全地 当您知道另一个分支中的更改确实发生时,请说 git pull 不与他们重叠。

查看合并结果后,您可能会发现更改 在另一个分支是不令人满意的。运行git reset --hard ORIG_HEAD 会让你回到原来的位置,但它会丢弃 您不想要的本地更改。 git reset --merge 保留 您的本地更改。

另见https://***.com/a/30345382/621690

【讨论】:

谢谢!你拯救了我的一天【参考方案6】:

即使上述解决方案确实有效,这个答案是为你准备的,以防你想逆转时钟而不是撤消 git pull。我的意思是,如果你想以X Mins 的方式获得确切的回购然后运行命令

git reset --hard branchName@"X Minutes ago"

注意:在您实际继续运行此命令之前,请仅在您确定要返回的时间以及我的情况时才尝试此命令。

我目前在一个分支develop,我应该结帐到一个新分支并拉入另一个分支,比如说分支A,但我不小心跑了 退房前git pull origin A

为了撤消这个更改,我尝试了这个命令

git reset --hard develop@"10 Minutes ago"

如果您在 windows cmd 上并获取 error: unknown switch `e

尝试像这样添加引号

git reset --hard 'develop@"10 Minutes ago"'

【讨论】:

【参考方案7】:

重置主分支:

git reset --hard origin/master

【讨论】:

【参考方案8】:

撤消 git pull

git reset --hard HEAD^

将您的本地仓库带回之前的提交状态。 如果由于 git pull 下载了任何新文件,它们将被列为未跟踪文件,您可以使用

  git clean -fd

【讨论】:

以上是关于Git重置(撤消、丢弃)文件变更的主要内容,如果未能解决你的问题,请参考以下文章

如何撤消“git重置”?

如何撤消重置(Git / TortoiseGit)?

在 ACE 编辑器中重置撤消堆栈

如何撤消 git 上的丢弃更改?

如何撤消 git pull?

我可以撤消 GitHub 存储库中重置的提交吗? [复制]