在我的公司中,我们的git工作流量是这样的,我们从 master
创建了一个 feature branch
,在该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
之前恢复为提交,并希望将我的分支与该开发人员在test
中的更改合并。不过,它似乎删除了他们的工作。谁能向我解释为什么会发生这种情况?
来自git帮助:
git -reverver-还原一些现有的consits
-m parent-number,-mainline parent-number
通常您无法恢复合并,因为您不知道合并的哪一侧应视为主线。此选项指定了主线的父号码(从1开始(,并允许恢复相对于指定父的更改。
恢复合并提交声明,您永远都不希望合并带来的树更改。结果,后来的合并只会引入不是先前恢复合并的祖先所引入的树木变化。这可能是您想要的也可能不是您想要的。
我们在文档中看到的恢复合并的提交可能不是直接的。
由于这个原因,很难告诉您为什么这不知道您的历史树。
但是,当这种情况发生时,我通常不会使用git-revert
进行合并。
相反,我使用以下简单方法,这些方法也可能适合您:
首先与您的团队成员进行交流,您将要解决问题,并且一旦完成后,他们应该同步。
转到您的feature
分支,然后将其重置为不良合并之前的提交:
$ git reset --hard hash_of_commit_prior_to_bad_merge
$ git push -f
您的分支已清理。现在,转到test
分支并进行相同的操作,首先在合并之前重置并推动更新遥控器。
此时两个分支都干净。
现在,您可以通过更新分支并正常遵循过程重新开始。
让人们知道它是固定的。
这种方法很干净,只要您在发生后立即进行操作,并且您的团队允许您强迫推动。
当您使用feature
和test
分支时,我不明白为什么不允许它。
即使您稍后再这样做并从test
中删除其他人的提交,您可以在完成后再次合并。
如果这只是一个单一的提交,git revert
尽管会创建一个新的提交,但要合并提交,摆脱它绝对比振兴更简单,更有效,更容易出错。
我希望这会有所帮助。
我想失踪的提交不是太多。然后在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
它将恢复您所做的所有故障过程。但是,如果提交太多,那将是一段时间浪费灾难。