Answers:
首先,如果您正在同一代码存储库上与其他人一起工作,则不应删除提交,因为当您在存储库上强制进行更新时,它将使您同事的本地存储库处于非法状态(例如,如果他们在本地在您删除的提交之后进行提交,则这些提交将无效,因为它们基于现在不存在的提交)。
也就是说,您可以做的是还原提交。根据您使用的CVS,此过程的执行方式有所不同(不同的命令):
在git上:
git revert <commit>
关于水银:
hg backout <REV>
编辑: 还原操作创建一个新的提交,该提交的操作与还原的提交相反(例如,如果原始提交添加了一行,还原提交将删除该行),从而有效地删除了不需要的提交的更改,而无需重写存储库历史记录。
git backout <REV>
?或者:hg backout <REV>
?
如果您不与他人合作(或很乐意引起他人的极大烦恼),则可以从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中,master分支并不特殊-只是一个约定。但是,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上,转到存储库设置,然后将“主分支” master_temp
更改为(在Github上,更改“默认分支”)。
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,您应该会看到所需的历史记录。现在,您可以转到设置页面并将Main分支改回master
。
此过程还将与其他任何历史记录更改(例如git filter-branch
)一起使用。您只需要确保在新的历史记录与旧的历史记录分离之前就重置为适当的提交即可。
编辑:显然,您无需在github上进行所有麻烦工作,因为您可以强制按下reset分支。
下次任何人尝试从您的存储库中提取(如果他们已经提取了错误的提交),则提取将失败。他们将不得不手动更改为更改历史记录之前的提交,然后再次拉出。
git reset HEAD^
git pull
如果他们已经撤消了错误的提交,并在错误的提交之上进行了提交,那么他们将必须重置,然后再git cherry-pick
创建他们想要创建的良好的提交,从而有效地重新创建整个分支而没有错误的提交。
如果他们从未取消过错误的提交,那么整个过程将不会影响他们,并且他们可以像往常一样进行拖动。
您可以重置为HEAD^
然后强制推动它。
git reset HEAD^
git push -u origin master --force
它将删除您的最后一次提交,并在删除提交时反映在bitbucket上,但仍保留在其服务器上。
过去,我在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
请享用
git revert
很简单:它创建一个新的提交,该提交与上一个提交(或多个提交)中的更改相反。它不会删除提交,因此与该问题无关。另外,这里的克隆步骤并不是必需的。
这是多达4个步骤的简单方法:
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>
为此,进行尽可能多的提交。
我已经成功地多次使用了这种方法。需要团队共同努力,以确保一切都同步。
提交更改后,将无法删除。因为提交的基本性质是不删除。
您可以做的事(简单又安全的方法),
交互式变基:
1)git rebase -i HEAD~2
#将显示您最近的2次提交
2)您的提交将显示为,最近的列表将显示在LILO页面的底部(后进后出)
完全删除最后一个提交行
3)用ctrl+X
或保存ESC:wq
现在,您的分支将更新,而无需您上一次提交。