我已经向我的本地分支estimation
做了几次提交,并将它们推送到远程分支estimation
。
现在,我想完全删除最后3次提交。
我尝试了git reset HEAD^
和git reset HEAD --hard
3次但是当我试图推动更改时,它抱怨HEAD的尖端未对齐。
我该怎么办?
修改
历史如下:
commit e572aab4e18
commit e21e7310bc4
commit 4f372a513da
commit 31a4ac607ae
commit a1a6e3f02dd
我想删除前4并返回commit a1a6e3f02dd
并在同一HEAD上创建本地和远程分支。
答案 0 :(得分:5)
如果您已经推送了提交(并且不想在远程存储库中执行强制推送和覆盖数据,那么您可以执行以下操作):
您可以使用git revert
代替git reset
:
$ git revert ~4..HEAD
或者您可以使用git checkout
然后提交更改:
$ git checkout ~3 -- .
$ git commit
git revert
将执行3次单独的还原提交。 git checkout
方法允许您仅在一次提交中还原更改。
在您的情况下,您可以这样做:
$ git reset --hard $REMOTE/$BRANCH
$ git checkout a1a6e3f02dd -- .
$ git commit
答案 1 :(得分:3)
首先:您应该只针对您不共享的分支执行此操作;如果分支被其他人检出,则此过程将使其本地副本与远程同步,并且他们将无法再将提交推送到分支。这可以解决,但它可能是一团糟。
鉴于此,如果我理解正确,你就是这种情况:
xxxxxxx Bad commit #3
yyyyyyy Bad commit #2
zzzzzzz Bad commit #3
wwwwwww This and everything before it are fine
您希望在wwwwwwww
之后删除提交并修复远程分支以匹配。
首先,备份你正在进行手术的分支,这样你就可以恢复它,如果你陷入困境,然后切换回你想要删除提交的分支。
git checkout -b broken-estimation
git checkout estimation
运行git log
以查找要保留的第一个提交的SHA1。拥有该SHA1后,将分支重置为:
git reset --hard kkkkkkk
其中kkkkkk
是您要保留在分支上的第一个提交的SHA1。
再次运行git log
以确保您已获得所需的SHA1作为此分支的提示;它应该是您在git log
输出中看到的第一个提交。如果您没有删除足够的提交,请使用正确的SHA1重做git reset --hard
以删除更多提交。
如果您删除了太多提交,请从您所做的备份中恢复estimation
分支:
git checkout -B estimation broken-estimation
并重做git log
以查找提示所需提交的SHA1,然后git reset --hard kkkkkkk
(kkkkkkk
是您实际想要的SHA1)删除不需要的提交在那次提交之后。
一旦你的分支处于所需的状态,你可以将固定分支推送到远程,取代旧版本:
git push -f the_proper_remote estimation
一旦确定您的维修是正确的,您可以删除分支的备份副本:
git branch -d broken-estimation
答案 2 :(得分:0)
您可以使用三个命令执行此操作:
首先,重写远程分支的历史记录:
git push origin +a1a6e3f02dd:estimation
注意,“+”使它成为“强制推动”。此命令说“强制a1a6e3f02dd为原点/估计分支的顶端。”
一旦完成,你只需要让你的本地“估计”分支与远程分支同步:
git checkout estimation
get reset --hard origin/estimation
你已经完成了!但是要预先警告:“git reset --hard”会爆炸你在该项目中所做的任何未提交的工作。
如果其他人也在使用'估计'分支,并且他们已经将你的4个“坏”提交到他们的分支中,那么将会出现一些协调混乱。但根据我的经验,所有关于“永远不会改写共享分支历史”的警告和警告都被夸大了。应该重申:永远不要重写长期共享分支的历史记录。