在我的公司中,我们的git工作流程是这样的,我们从feature branch
创建一个master
,然后在feature branch
上进行开发,直到完成为止。然后,我们创建一个PR以合并到master
,然后将该feature branch
合并到test
。合并到test
会将应用程序部署到测试服务器。测试完成并获得批准后,开发人员将审查PR并将其合并到master
,后者进而将应用程序部署到暂存环境。
我正在开发一个功能分支,并意外地将test
合并到feature branch
中(而不是将master
合并到feature branch
中),所以当我创建PR时,它既有我所做的所有更改,也有合并到test
但不在master
中的其他开发人员的更改。我还原了合并:git revert -m 1 <commit before merge hash>
,然后将该分支合并到test
中。之后,我从一个非常生气的开发人员处收到一条消息,说我删除了他们的工作(他们的工作在test
中)。我想了解为什么会发生这种情况,我想恢复到仅在我的分支中合并之前提交,创建PR,然后合并到test
,希望将我的分支与开发人员在{{1}中所做的更改合并}。它似乎已删除了他们的工作。谁能向我解释为什么会这样?
答案 0 :(得分:2)
从git帮助中:
git-revert-还原一些现有的提交
-m父编号,--mainline父编号
通常,您无法还原合并,因为您不知道合并的哪一侧应被视为主线。此选项指定主线的父级编号(从1开始),并允许还原以相对于指定的父级撤消更改。
还原合并提交声明您将永远不希望合并带来的树更改。结果,以后的合并将仅引入由不是先前还原的合并的祖先的提交引入的树更改。这可能是您想要的,也可能不是。
正如我们在文档中所看到的,还原合并提交可能不是直接的。
由于这个原因,很难在不知道您的历史树的情况下告诉您这是为什么。
但是,当发生这种情况时,我通常不使用git-revert
进行合并提交。
相反,我使用以下简单方法也可能对您有用:
首先与您的团队成员交流一下发生的情况以及您将要解决的问题,完成后他们应该进行同步。
转到您的feature
分支并将其重置为错误合并之前的提交:
$ git reset --hard hash_of_commit_prior_to_bad_merge
$ git push -f
您的分支已清理。现在转到test
分支并执行相同的操作,首先在合并之前重置并强行推送以更新遥控器。
这时两个分支都是干净的。
现在,您可以通过更新分支并正常执行流程来重新开始。
让人们知道它是固定的。
只要您在事发后立即这样做,并且您的团队允许您强行推入,这种方法就很干净,并且效果很好。
在使用feature
和test
分支时,我不明白为什么不允许这样做。
即使您稍后再执行此操作,并从test
中删除其他人的提交,也可以在完成后简单地将它们重新合并。
如果只是一次提交,git revert
可以创建新的提交,但是对于合并提交,摆脱它肯定比还原更简单,更有效且更不易出错。
我希望这会有所帮助。
答案 1 :(得分:0)
我想丢失的提交不会太多。 然后下面的2条命令会有所帮助。
1)在分支上,先前丢失的提交以前存在,
$ git reflog | grep -i "key-word-of-the-commit"
从上方获取commit-id-missed
最好先检查提交内容,然后再进行2)
$ git show commit-id-missed
2)在您要合并此提交的目标分支上,
$ git cherry-pick commit-id-missed
它将恢复您所做的所有故障过程。但是,如果提交过多,那将是一次浪费时间的灾难。