我做了三次提交,我试图清理一些代码。无论如何,我设法彻底摧毁了我正在做的事情。我想删除过去的三个提交并返回到特定的提交SHA1。
如何恢复到之前的提交并删除这3次提交的历史记录? (历史删除部分不是什么大问题)。这些提交已经被推送,所以我有点迷失。
谢谢!
答案 0 :(得分:33)
由于你的提交被远程推送,你需要删除它们。我假设你的分支是master
,它被推到了origin
。
您首先需要从master
origin
git push origin :master
(请注意冒号)
然后你需要让master
达到你想要的状态,我假设提交哈希为ABCDE
:
git reset --hard ABCDE
最后,再次推送master
:
git push origin master
就是这样!请注意,如果某人已经从origin
下载了您的更改,则会使他们变得非常困难,导致他们的本地存储不稳定。
答案 1 :(得分:17)
git中的一般想法是你永远不会删除提交。你只是留下他们没有名字。提交既未命名也未被其他命名提交引用,最终会自行消失。
例如,假设你开始于:
$ git checkout my_work_branch
<do some editing>
$ git commit -m "attempt #1, so far so good"
<do more editing>
$ git commit -m "attempt #2, getting a little hazier"
<do more editing>
$ git commit -m "attempt #3, looking bleak now"
此时git log --graph --decorate --pretty=oneline --abbrev-commit
可能会产生类似的内容:
* d97de0e (HEAD, my_work_branch) attempt #3, looking bleak now
* 9a3efe3 attempt #2, getting a little hazier
* 9e80936 attempt #1, so far so good
* a1d6424 here's where you started
你现在拥有的是名为my_work_branch
的分支(你之前给出的名字)“指向”提交d97de0e,后者又指向9a3efe3,指向9e80936,指向a1d6424。 (这也是HEAD指出的特殊名称。)
您可以将HEAD移动到任何旧的git checkout
。但是,事情就是这样:你也可以 将名称my_work_branch
移到指向a1d6424:
$ git reset --hard a1d6424
或
$ git reset --hard HEAD~3 # use at most one of these
如果这样做,您会发现名称my_work_branch
也已被移动:
$ git rev-parse my_work_branch
a1d6424e5afcda475910084720c9aa26e3528618
您添加的提交仍然存在:
$ git log d97de0e
会向你展示它们:
$ git log --graph --decorate --pretty=oneline --abbrev-commit d79de0e
* d97de0e attempt #3, looking bleak now
* 9a3efe3 attempt #2, getting a little hazier
* 9e80936 attempt #1, so far so good
* a1d6424 (HEAD, my_work_branch) here's where you started
只是他们不再有任何名字,如果你做了一些工作,git add
和git commit
,那将是一个名为my_work_branch
的新分支。旧的,有三个额外的提交,现在是一个“垃圾”分支。 (如果你决定尽管你想要它们的凄凉,你只需要在它们大约3个月到期之前给它们一个名字。你必须在上面的例子中找到或记住那个数字,d97de0e,不知何故。)
您不必删除远程分支。您可以在完成上述回放(git push -f
)后使用git reset --hard
。请记住,任何已经取得推动变化的人都会拥有它们,并且会继续拥有它们并且很容易因为它们的存在而感到困惑。你必须提醒任何这样的人要小心你的“被撤销”提交。
答案 2 :(得分:3)
对于任一解决方案,git log
并找到您要返回的提交的哈希值。
什么?自动创建反向补丁以撤消您的更改。提交并推送补丁。您最初的更改仍在git日志中,但是使用此反向修补程序“撤消”了它们。
如何? git revert [hash] && git push
为什么?因为您是一个与其他优秀开发人员一起工作的优秀开发人员,并且不想破坏他们的本地存储库。
为什么不呢?,因为以后很难“合并”您的更改。还原补丁比您的更改“新”,因此比“ git merge”更难重新应用更改。
什么?分支是指向提交的指针。将该指针硬重置为先前的提交,然后强制将该指针推入服务器。您所做的更改(以及其他所有更改)都将从git历史记录中删除。
如何? git reset --hard [hash] && git push -f
为什么?因为您是一个狂野的牛仔/女牛仔,而您所做的更改位于一个功能分支中,所以您希望继续努力以便以后轻松合并。
为什么不?您的重置和推送操作会破坏已经取消更改的队友的任何本地存储库(例如,丢失其提交,必须重新提交工作)。如果您没有推(或他们没有拉),那就没问题了。
答案 3 :(得分:2)
使用git revert
- 您可以恢复为一,二或提交范围
- 它也会删除提交历史记录
1)git revert 175a25
2)git status / git log(确认你已经恢复)
3)git push
答案 4 :(得分:0)
例如,如果要摆脱最后两次提交,可以执行以下操作:
git log -3
commit 7e83c9fa5dc1a1914847bfccfe9d2da14f845070
Author: Jaime Montoya <webmaster@jaimemontoya.com>
Date: Fri Sep 28 05:58:58 2018 -0600
Add new background image to the header of the website.
commit b84b0c38df2f876d1c1f5657e6e452b5689c2d80
Author: Shannon Hall <s.hall@example.net>
Date: Thu Sep 27 21:35:48 2018 -0400
Include code for Google Maps.
commit 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
Author: Jaime Montoya <webmaster@jaimemontoya.com>
Date: Thu Sep 27 18:57:45 2018 -0600
Update links to copyright messages.
在这种情况下,我们试图摆脱这两个提交:7e83c9fa5dc1a1914847bfccfe9d2da13f845070
和b84b0c38df2f876d1c1f5657e6e255b5689c2d80
。我们希望将此作为最近的提交:40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
。我们需要这样做:
git reset --hard 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
这是一种从本地存储库撤消提交的方法。
在完成上述操作之后,您可以使用git push <remote> <branch>
推送到远程存储库。