如何从一个 git 分支中删除已合并到另一个分支的提交

How to remove commits from one git branch that have been merged into another

我对 git 分支管理有点困惑,需要一些帮助。我知道有几个关于 SO 的问题是相关的,但我不确定这种情况是否完全相同,我不想把事情搞砸。

我们有一个名为 'master' 的分支,它代表了当前正在生产的内容。我们有另一个名为 'development' 的分支,它代表我们测试服务器上的内容,并包含任何当前 development/bug 准备好进行测试的修复。在处理用户故事或错误修复时,我们的开发人员应该为每个 story/fix 创建一个分支。当它准备好测试时,它被合并到开发分支并更新测试服务器。当 story/fix 移至生产环境时,它会合并到 master 分支中。

我们的一位开发人员最近将 8 项更改直接推送到 master 分支。这些更改已从 master 合并到开发分支。

我需要知道的是:

  1. 如何从 master 分支中删除这些提交,以便 master 保留实际生产中的图像。我已经看到许多 SO 帖子提倡 rebase 或 cherry-pick,但我不确定它们是否适用,希望对我的情况提出具体建议。
  2. 考虑到合并到开发分支,这样做是否安全,即将它们从 master 中删除,但是完成后,也将它们从开发分支中删除?我很困惑,因为我看到合并后它们保留了相同的 ID 和父级,所以我不确定从 master 中删除它们会产生什么影响(如果有的话)。

编辑:我还应该提到我已经看到 this post 这可能是我需要的,但再次感谢确认,我仍然不确定如何这会影响到开发分支的合并。

仅供参考,我正在使用乌龟git(但不必)。

感谢任何建议。

最好的做法是使用 git revert c1..c2 还原 8 个提交的范围,其中 c1c2 分别代表您要还原的第一个和最后一个提交。这将撤消这些提交的 effects,而不删除提交本身。这样,您合并到 develop 分支仍然有效。

请注意,使用此方法,您的 master 历史记录中将有 8 更多 次提交,每次回滚一次。相反,如果您只想一次撤消所有 8 个提交,并且自第 8 个之后没有 "legit" 个提交,那么请执行以下操作:

git checkout -b temp-branch <SHA of last good commit>
git reset --soft master
git commit -m "Undoing 8 commits"
git checkout master
git merge temp-branch
git branch -d temp-branch

编辑:将'goof'更改为'good'!