是否有任何方法可以恢复或撤消git pull,以便我的源/repos将进入执行git pull之前的旧状态?我想这样做是因为它合并了一些我不想合并的文件,但只合并了其他剩余的文件。所以,我想把这些文件拿回来,有可能吗?谢谢:)
编辑我要撤消Git合并以进行澄清。在看到一些答案后,我做了这个
1 2 3
| git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name... |
现在,我该怎么办?做git reset --hard可以吗?我不想再搞砸了,你要详细的步骤吗?
- 看起来你的历史只有两件事:克隆和获取。只需重置到克隆:git reset --hard 01b34fa,在这种情况下,您可以执行git reset --hard HEAD^,它重置为头部之前的一个提交。
- --如果要修改工作目录中的文件,则需要进行硬操作。
- @seg.server.fault:如果成功,您可以始终接受答案;)
- Git重置--硬头^
- git reflog将显示用git所做的一切。有人担心,git reset --hard [sha1 of something from reflog]将恢复reflog中所示的所有内容,这些内容有时不是目标,例如,您希望恢复从原始数据中提取的主分支上的合并(发生),并且在合并之后,您已经处理过其他分支。reflog将显示其他分支上的每个变化。但是,git checkout master和git reset --hard [SH1 of commit on master branch just before merge]只会重置当前的主分支,从源位置删除拉合并。
- 摆脱江户的习惯是好的。总是使用git fetch,然后明智地决定下一步要做什么。
- 我加上了最新的答案!
git pull将做两件事:它做一个git fetch和一个git merge合并已经设置好合并到配置中的分支。
因此,您要做的是撤消合并(撤消提取没有多大意义,不应该是必需的)。
为此,您可以尝试使用git reset --hard重置到以前的状态。使用git reflog命令查找前一状态的sha-1,然后将其重置。
警告:git reset --hard删除所有未提交的更改。
- 选择前一个状态的一个很好的方法,不是使用git reflog和复制散列,而是使用像master@{1}这样的快捷方式,它是master、master@{"5 minutes ago"}或master@{14:30}的前一个位置。有关以这种方式指定修订的详细信息,请参阅man git-rev-parse中的"指定修订"部分。
- 在这种情况下,orig_head也应该工作("git reset--hard orig_head")。
- @杰夫罗米:谢谢你给我这个提示,我不知道你会对修订如此冗长。我知道如何选择相对于头部的修改,但当问题提出时,我不知道他想走多远。
- 您应该明确地提到这样一个事实:如果您有未提交的更改,就不应该这样做!
- 干得好:git reset --hard master@{"10 minutes ago"}。
- 当我拉的时候,上面写着Updating d2c90a3..035ac4d。在这里,您还可以使用d2c90a3作为参数进行重置。
- 使用reflog时不需要键入哈希。您还可以使用head@1或reflog中定义的以前的数字。
- 当我输入git reflog时,我看不到任何关于合并的信息。最近的事情是退房,在退房之前,我是在git pull之前做的事情。你能给我一个更好的线索如何找到这个合并的sha-1吗?
- 非常感谢。你刚刚救了我的命
- 谢谢你@jefromi!那真的很有用!
- UPS,只是设法弄坏了我自己的Git存储库,但在这个答案之后将其重置回正常状态:)
- 谢谢您。。。谢谢……谢谢……Git重置——硬主机@"10分钟前"帮助我
- git reset——硬主机@"10分钟前"这是一个很好的命令
与JKP的回答相同,但下面是完整的命令:
1
| git reset --hard a0d3fe6 |
其中a0d3fe6是通过
号
看看你想撤销的地方。
- 例如,为什么我不能只做git reset HEAD --hard?
- @例如,Mikec这种方法可以让你回拉几下。
- 我不能使用左边的身份证,但是git reset --hard HEAD@{n}起作用了
- 您应该建议对JKP的答案进行编辑,而不是在这么多年之后在这里几乎复制它。
- 如果我在git reflog上有这个:dab04ec head@0,aaaaaaa head@1,bbbbbbb head@2。如果我这样做,我会失去0和1的头吗?
- @是的,你将失去0和1的头。
- 我爱你:)
- 你救了我一天。
撤消合并的一种更现代的方法是:
还有更古老的方法:
。
以前答案中描述的旧学校方式(警告:将放弃所有本地更改):
但实际上,值得注意的是,考虑到MERGE_HEAD存在,git merge --abort只相当于git reset --merge。这可以在合并命令的git帮助中读取。
1
| git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. |
。
合并失败后,在没有MERGE_HEAD的情况下,可以用git reset --merge撤消合并失败,但不一定用git merge --abort撤消合并失败,因此它们不仅是同一事物的新旧语法。这就是为什么我发现git reset --merge在日常工作中更有用。
- git merge --abort在合并期间工作,而不是在git pull完成后工作。所以这个答案似乎和这个问题无关。
它起作用了第一次使用:git reflog。
找到你的前一个状态的sha和make(head@1就是一个例子)
1
| git reset --hard HEAD@{1} |
。
如果您有gitk(尝试从git命令行运行"gitk--all"),这很简单。只需运行它,选择要回滚到的提交(右键单击),然后选择"重置主分支到这里"。如果没有未斜接的更改,请选择"硬"选项。
- git自动提交。
- 如果你还没有看到,这是值得一试的。它弹出一个疯狂的图形用户界面。
假设在执行git pull之前,$COMMIT是最后一个提交ID。你要撤销最后一次抽签
埃多克斯1〔15〕
.
奖金:
说到拉,我想分享一个有趣的技巧,
江户十一〔16〕号
上面的命令是我Git生活中最有用的命令,它节省了很多时间。
在将您的新提交推送到服务器之前,请尝试此命令,它将自动同步最新的服务器更改(使用fetch+merge),并将您的提交放在Git日志的顶部。无需担心手动拉/合并。
详情请访问:http://gitolite.com/git-pull--rebase
你可以做git reset --hard ORIG_HEAD。
因为"拉"或"合并"在执行这些操作之前将orig_head设置为当前状态。
这是恢复拉式更改的最简单方法。
1
| git reset --hard 9573e3e0 |
其中9573e3e0是您的承诺ID
如果合并失败(这是希望撤消git pull的最常见原因),那么运行git reset --merge会完全按照预期执行:保留提取的文件,但撤消git pull试图合并的合并。然后,我们可以决定在没有git merge有时产生的混乱的情况下做什么。而且,它不需要一个来找到其他答案中提到的--hard所要求的确切提交ID。