Git重置为上一次提交

Ste*_*ven 35 git

我有三个提交,我试图清理一些代码.无论如何,我设法彻底摧毁了我正在做的事情.我想删除过去的三个提交并返回到特定的提交SHA1.

如何恢复到之前的提交并删除这3次提交的历史记录?(历史删除部分不是什么大问题).这些提交已经被推送,所以我有点失落.

谢谢!

tri*_*iad 54

找到要重置为的提交:

git log
Run Code Online (Sandbox Code Playgroud)

一旦你有哈希:

git reset --hard <hash>
Run Code Online (Sandbox Code Playgroud)

并推到遥控器上:

git push -f <remote> <branch>
Run Code Online (Sandbox Code Playgroud)


Pab*_*dez 36

由于你的提交被远程推送,你需要删除它们.我假设你的分支是master,它被推翻了origin.

您首先需要masterorigin以下位置删除:

git push origin :master (注意冒号)

然后你需要达到master你想要的状态,我假设提交哈希是ABCDE:

git reset --hard ABCDE

最后,master再次推动:

git push origin master

而已!请注意,如果某人已从此处下载了您的更改,origin则会使他们陷入困境,导致本地存储不稳定.

  • 这看起来很有帮助所以我只是试了一下,但是在`git clone git@github.com:dandv/reveal.js.git`和`git push origin:master`:> remote:错误:拒绝删除之后我得到了这个错误当前分支:refs/heads/master来git@github.com:dandv/reveal.js.git![远程拒绝] master(删除当前分支禁止)错误:未能将某些引用推送到'git@github.com:dandv/ reveal.js.git' (6认同)

tor*_*rek 19

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"
Run Code Online (Sandbox Code Playgroud)

此时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
Run Code Online (Sandbox Code Playgroud)

你现在拥有的是名为my_work_branch(你之前给出的名字)的分支"指向"提交d97de0e,后者又指向9a3efe3,指向9e80936,指向a1d6424.(这也是HEAD指向的特殊名称.)

您可以将HEAD移动到其他地方git checkout.但是,这就是:你也可以将名称移动my_work_branch到指向a1d6424:

$ git reset --hard a1d6424
Run Code Online (Sandbox Code Playgroud)

要么

$ git reset --hard HEAD~3  # use at most one of these
Run Code Online (Sandbox Code Playgroud)

如果这样做,您会发现名称my_work_branch也已被移动:

$ git rev-parse my_work_branch
a1d6424e5afcda475910084720c9aa26e3528618
Run Code Online (Sandbox Code Playgroud)

您添加的提交仍然存在:

$ git log d97de0e
Run Code Online (Sandbox Code Playgroud)

会告诉你他们:

$ 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
Run Code Online (Sandbox Code Playgroud)

这只是他们不再有任何名字,如果你做了一些工作,并git addgit commit它,那将是一个名为新的分支my_work_branch.旧的,有三个额外的提交,现在是一个"垃圾"分支.(如果你决定尽管你想要它们的凄凉,你只需要在它们大约3个月后到期之前给它们一个名字.你必须在上面的例子中找到或记住那个数字,d97de0e,不知何故.)


更新:啊,你已经推了它们,你希望它们从远程存储库中消失.

您不必删除远程分支.您可以git push -f在执行git reset --hard上面的倒带()之后使用.请记住,任何已经取得推动变化的人都会拥有它们,并且会继续拥有它们并且很容易因为它们的存在而感到困惑.你必须警告任何这样的人要小心你的"被撤销"提交.


Mic*_*ole 7

好的,这里有两个解决方案。

对于任一解决方案,git log并找到您要返回的提交的哈希值。

1) 通过自动创建补丁来撤销您的更改。

什么? 自动创建反向补丁以撤消您的更改。提交并推送补丁。您的原始更改仍在 git 日志中,但通过此反向补丁它们已“撤消”。

如何? git revert [hash] && git push

为什么? 因为你是一个优秀的开发者,与其他优秀的开发者一起工作,不想破坏他们的本地存储库。

为什么不? 因为以后更难“合并”您的更改。恢复补丁比您的更改“更新”,因此重新应用您的更改比“git merge”更难。

2) 强制推送到之前的提交

什么? 分支是指向提交的指针。将该指针硬重置为先前的提交,然后将该指针强制推送到服务器。您的更改(以及其他任何人)将从 git 历史记录中删除。

如何? git reset --hard [hash] && git push -f

为什么? 因为您是一个狂野的牛仔/女牛仔,并且您的更改位于一个功能分支中,您希望继续工作以便以后轻松合并。

为什么不? 您的重置和推送将弄乱已经拉取您的更改的队友的任何本地存储库(例如丢失他们的提交,不得不重新提交工作)。如果你没有推(或者他们没有拉),那不是问题。