我犯了一个错误,我不知道如何删除我在存储库中的最新推送。我提取应用程序的最新更新,但它有冲突,我把它推送到存储库。
如何删除我的上次提交?或者如何解决它?
答案 0 :(得分:91)
如果您不与他人合作(或者很乐意让他们感到非常烦恼),那么可以从bitbucket分支中删除提交。
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
在git中,主分支并不特殊 - 它只是一个约定。但是,bitbucket和github以及类似站点通常需要有一个主分支(大概是因为它比编写更多代码来处理存储库没有分支的事件更容易 - 不确定)。所以你需要创建一个新的分支,并将其作为主分支:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
在Bitbucket上,转到存储库设置,将“Main branch”更改为master_temp
(在Github上,更改“Default branch”)。
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
现在去Bitbucket,你应该看到你想要的历史。您现在可以转到设置页面并将主分支更改回master
。
此过程也适用于任何其他历史记录更改(例如git filter-branch
)。您必须确保在新历史记录与旧历史记录分离之前重置为适当的提交。
编辑 :显然你不需要在github上解决所有这些麻烦,因为你可以force-push a reset branch。
下次有人试图从您的存储库中提取时(如果他们已经提取了错误提交),则拉动将失败。他们将在更改的历史记录之前手动重置为提交,然后再次拉动。
git reset HEAD^
git pull
如果他们已经提取了错误的提交,并在其上提交,那么他们将不得不重置,然后git cherry-pick
他们想要创建的好提交,有效地重新提交 - 在没有错误提交的情况下创建整个分支。
如果他们从未提取错误提交,那么整个过程不会影响他们,他们可以正常拉动。
答案 1 :(得分:89)
首先,如果您与同一代码存储库中的其他人一起工作,则不应该删除提交,因为当您在存储库上强制更新时,它将保留本地存储库您的同事处于非法状态(例如,如果他们在您删除的那个之后提交了提交,那些提交将是无效的,因为它们基于现在不存在的提交)。
说,你可以做的是恢复提交。此过程以不同的方式完成(不同的命令),具体取决于您使用的CVS:
在git上:
git revert <commit>
在mercurial上:
hg backout <REV>
修改强> 恢复操作创建一个新的提交,它与恢复的提交相反(例如,如果原始提交添加了一行,则还原提交删除该行),有效地删除了不需要的提交的更改,而不重写存储库历史记录。
答案 2 :(得分:41)
你可以重置为HEAD^
然后强制推送它。
git reset HEAD^
git push -u origin master --force
它会删除你的最后一次提交,并会在删除提交时反映bitbucket,但仍会保留在他们的服务器上。
答案 3 :(得分:3)
我过去遇到过git revert问题(主要是因为我不太确定它是如何工作的。)由于合并问题,我很难恢复...
我的简单解决方案就是这个。
第1步。
git clone <your repos URL> .
你的项目在另一个文件夹中,然后:
第2步。
git reset --hard <the commit you wanna go to>
然后 第3步。
在你的最新(和主要)项目目录(有问题的最后提交的那个)粘贴第2步的文件
第4步。
git commit -m "Fixing the previous messy commit"
第5步。
享受
答案 4 :(得分:1)
这是一种简单的方法,最多需要四个步骤:
0-为要修复存储库的团队提供建议
与团队联系,让他们知道即将发生的变化。
1-删除上一次提交
假设目标分支为master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
在这一点上,如果您一个人工作,您就完成了。
2-修复队友的本地存储库
在队友的身上:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
如果您的队友没有新提交,则此时您已经完成,应该保持同步。
3-恢复丢失的提交
假设一个队友有一个新的未发布的提交,但在此过程中丢失了。
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
请根据需要执行多次提交。
我已经成功地多次使用了这种方法。需要团队合作以确保所有内容都同步。
答案 5 :(得分:0)
提交更改后,将无法删除。因为提交的基本性质不是删除。
你能做什么(简单安全的方法),
互动重建:
1)git rebase -i HEAD~2
#将显示您最近的2次提交
2)你的提交将列出如下,最近将显示在页面底部的LILO(最后一个在Last Out中)
完全删除最后一个提交行
3)按ctrl+X
或ESC:wq
现在您的分支机构将在没有您上次提交的情况下进行更新..
答案 6 :(得分:0)
正如其他人所说,通常您想使用hg backout
或git revert
。但是,有时候您真的想摆脱提交。
首先,您需要转到存储库的设置。单击Strip commits
链接。
输入要销毁的变更集的变更集ID,然后单击Preview strip
。这样一来,您就可以在执行操作之前先了解将要遭受的损害。然后只需单击Confirm
,您的提交将不再是历史记录。确保告诉所有协作者您做了什么,以免他们误将有问题的提交推回去。
答案 7 :(得分:0)
您也可以如Dustin所述为Bitbucket编写命令:
git push -f origin HEAD^:master
注意:除了master之外,您还可以使用任何分支。 并删除它,只需按下Bitbucket。
要删除git中的最后一次提交locally,请使用:
git reset --hard HEAD~1
答案 8 :(得分:0)
就我而言,我的队友提交了错误的代码。所以无论如何我都必须恢复那个提交,所以我试着
<块引用>运行这个命令来恢复提交
git revert [LastCommitID]
此后,更改未反映在存储库中,因此
<块引用>我执行了这个命令
git push --force origin master
并且此命令通过删除最后一次提交来反映更改
答案 9 :(得分:-2)
到目前为止,云bitbucket(我不确定哪个版本)允许从文件系统恢复提交,如下所示(我没有看到如何从Chrome浏览器中的Bitbucket界面恢复)。
- 备份整个目录以保护您无意中提交的更改
- 选择签出目录
- 鼠标右键:togise git menu
-repo-browser(菜单选项&#39;还原&#39;仅撤消未经修改的更改)
- 按下HEAD按钮
- 选择最上面一行(最后一次提交)
- 鼠标右键:通过此提交还原更改
- 在取消文件系统上的更改后,按提交
- 这会通过消息&#39;还原(您之前的消息)更新GIT。这会某某恢复提交&#39;
- 选择&#39;提交并推送&#39;。