我有三个提交,我试图清理一些代码.无论如何,我设法彻底摧毁了我正在做的事情.我想删除过去的三个提交并返回到特定的提交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
.
您首先需要master
从origin
以下位置删除:
git push origin :master
(注意冒号)
然后你需要达到master
你想要的状态,我假设提交哈希是ABCDE
:
git reset --hard ABCDE
最后,master
再次推动:
git push origin master
而已!请注意,如果某人已从此处下载了您的更改,origin
则会使他们陷入困境,导致本地存储不稳定.
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 add
和git commit
它,那将是一个名为新的分支my_work_branch
.旧的,有三个额外的提交,现在是一个"垃圾"分支.(如果你决定尽管你想要它们的凄凉,你只需要在它们大约3个月后到期之前给它们一个名字.你必须在上面的例子中找到或记住那个数字,d97de0e,不知何故.)
您不必删除远程分支.您可以git push -f
在执行git reset --hard
上面的倒带()之后使用.请记住,任何已经取得推动变化的人都会拥有它们,并且会继续拥有它们并且很容易因为它们的存在而感到困惑.你必须警告任何这样的人要小心你的"被撤销"提交.
对于任一解决方案,git log
并找到您要返回的提交的哈希值。
什么? 自动创建反向补丁以撤消您的更改。提交并推送补丁。您的原始更改仍在 git 日志中,但通过此反向补丁它们已“撤消”。
如何? git revert [hash] && git push
为什么? 因为你是一个优秀的开发者,与其他优秀的开发者一起工作,不想破坏他们的本地存储库。
为什么不? 因为以后更难“合并”您的更改。恢复补丁比您的更改“更新”,因此重新应用您的更改比“git merge”更难。
什么? 分支是指向提交的指针。将该指针硬重置为先前的提交,然后将该指针强制推送到服务器。您的更改(以及其他任何人)将从 git 历史记录中删除。
如何? git reset --hard [hash] && git push -f
为什么? 因为您是一个狂野的牛仔/女牛仔,并且您的更改位于一个功能分支中,您希望继续工作以便以后轻松合并。
为什么不? 您的重置和推送将弄乱已经拉取您的更改的队友的任何本地存储库(例如丢失他们的提交,不得不重新提交工作)。如果你没有推(或者他们没有拉),那不是问题。
归档时间: |
|
查看次数: |
61961 次 |
最近记录: |