删除bitbucket中的最后一次提交

cat*_*ine 98 repository bitbucket

我犯了一个错误,我不知道如何删除我在存储库中的最新推送.我提取应用程序的最新更新,但它有冲突,我把它推送到存储库.

如何删除我的上次提交?或者如何解决?

ase*_*max 94

首先,如果您在同一代码存储库中与其他人一起工作,则不应删除提交,因为当您在存储库上强制更新时,它将使您的同事的本地存储库处于非法状态(例如,如果他们在您删除的提交之后进行提交,这些提交将无效,因为它们基于现在不存在的提交).

说,你可以做的是恢复提交.此过程以不同的方式完成(不同的命令),具体取决于您使用的CVS:

git上:

git revert <commit>
Run Code Online (Sandbox Code Playgroud)

mercurial:

hg backout <REV>
Run Code Online (Sandbox Code Playgroud)

编辑: 恢复操作创建一个新的提交,它与恢复的提交相反(例如,如果原始提交添加了一行,还原提交删除了该行),有效地删除了不需要的提交的更改,而不重写存储库历史记录.


nau*_*101 94

如果你与他人合作(或者很乐意让他们感到非常烦恼),那么就可以从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
Run Code Online (Sandbox Code Playgroud)

如果您正在尝试更改主分支

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

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

现在去Bitbucket,你应该看到你想要的历史.您现在可以转到设置页面并将主分支更改回master.

此过程也适用于任何其他历史变更(例如git filter-branch).您必须确保在新历史记录与旧历史记录分离之前重置为适当的提交.

编辑:显然你不需要在github上解决所有麻烦,因为你可以强制推动重置分支.

处理恼火的合作者

下次有人试图从您的存储库中取出时(如果他们已经提取了错误的提交),则拉动将失败.他们将在更改的历史记录之前手动重置为提交,然后再次拉取.

git reset HEAD^
git pull
Run Code Online (Sandbox Code Playgroud)

如果他们已经提取了错误的提交,并在其上提交,那么他们将不得不重置,然后git cherry-pick他们想要创建的好提交,有效地重新创建整个分支而没有错误的提交.

如果他们从未拉过错误提交,那么整个过程不会影响他们,他们可以正常拉动.

  • 作为一个不小心推秘密的人,我非常感谢这个答案的彻底性.谢谢! (2认同)

Shu*_*ker 43

你可以重置HEAD^然后强行推它.

git reset HEAD^
git push -u origin master --force
Run Code Online (Sandbox Code Playgroud)

它将删除您的上次提交,并将反映在bitbucket作为提交删除但仍将保留在其服务器上.

  • 实际上bitbucket支持强制推送只是diff而不是完全删除它标记为已删除的未跟踪提交. (4认同)

rbe*_*nto 11

这是一个简单的方法,最多分为 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
Run Code Online (Sandbox Code Playgroud)

如果您单独工作,此时您就完成了。

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

如果你的队友没有新的提交,那么你就完成了,你应该保持同步。

3 - 恢复丢失的提交

假设一个队友有一个新的和未发布的提交,在这个过程中丢失了。

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>
Run Code Online (Sandbox Code Playgroud)

根据需要对尽可能多的提交执行此操作。

我已经成功地多次使用这种方法。它需要团队的努力来确保一切同步。


Nac*_*hil 6

这个命令对我来说效果很好!

就我而言,我的队友已经提交了错误的代码。所以无论如何我都必须恢复该提交,所以我尝试

运行此命令以恢复提交

git revert [LastCommitID]
Run Code Online (Sandbox Code Playgroud)

此后,更改未反映在存储库中,因此

我执行了这个命令

git push --force origin master
Run Code Online (Sandbox Code Playgroud)

该命令通过删除上次提交来反映更改