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@1
是 reflog
中符号 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 log
或 git 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重置(撤消、丢弃)文件变更的主要内容,如果未能解决你的问题,请参考以下文章