放弃已向上游推送的提交

时间:2013-07-16 11:13:57

标签: git git-merge git-rebase git-reset

在一个新的项目中,我们开始直接在主人上提交。我们不小心对主人做了一些糟糕的提交,被推到了中央回购并被整个团队拉下来。

意识到我们的错误,我们在错误提交之前创建了功能分支。我们的团队现在很高兴在这个功能部门工作。

我们现在希望分支包含功能分支中的确切代码,而不重新引入错误提交

我看到已从更高版本的git中删除了merge theirs选项。那么丢弃不良提交的最佳方法是什么,让我们的主人看起来与我们的功能分支完全相同?

  • 合并?
  • 复位?
  • 调整基线?

2 个答案:

答案 0 :(得分:6)

如果你想回到HEAD(前一个),你可以这样做:

git reset --hard HEAD@{1}

注意:工作目录更改将丢失。

您也可以查看[git命令]:http://git-scm.com/book/en/Git-Basics-Undoing-Things

一旦您回到没有错误提交的稳定版本,您就可以将您的功能分支合并到主分支

git checkout master_branch

您将使用上述命令切换到master

git pull origin master

拉主分支

git merge feature_branch

这将使用功能分支更改来更新主服务器。现在两个分支都是一样的。

答案 1 :(得分:2)

有(至少)两种方法可以获得您想要的东西,这可能会导致不同的历史记录。你选择哪个取决于你对git数据结构和管道的舒适程度。

在第一个中,您使用两个父项进行合并提交:当前主服务器和功能分支的提示。此提交的内容与父分支的提示中的内容完全相同。最简单的方法是运行合并(git merge --no-commit),然后在提交结果之前用特征分支(git reset FEATURE_BRANCH)中的内容替换索引的内容。

在第二步中,您将向主服务器添加一个提交,以便在功能分支中手动合并之前撤消所有狡猾的提交。 git revert可以为此提供帮助,或者您可以使用git checkout LAST_GOOD_COMMIT将代码恢复到最后一次良好提交时所处的状态,并将其作为主提示提交。最后,像往常一样合并(或变基)。

我经常发现绘制树的当前结构和我想要的结构是有帮助的,然后确定我需要哪些git操作才能从一个到另一个。请记住处理副本,并且reflog将存储您的所有历史记录:)。