Git 还原删除了另一位开发者的作品。为什么?

Git Revert deleted another developer's work. Why?

在我的公司,我们的 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,希望将我的分支与该开发人员在 [=16= 中的更改合并].它似乎已经删除了他们的工作。谁能向我解释为什么会这样?

来自 git 帮助:

git-revert - Revert some existing commits

-m parent-number, --mainline parent-number

Usually you cannot revert a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of the mainline and allows revert to reverse the change relative to the specified parent.

Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.

正如我们在文档中看到的那样,恢复合并提交可能不是 straight-forward。

因此,在不了解您的历史树的情况下,很难告诉您为什么会发生这种情况。

但是当这种情况发生时,我通常不会使用git-revert进行合并提交。

相反,我使用了以下可能也适用于您的简单方法:

首先与您的团队成员沟通发生了什么以及您将如何修复它,他们应该在您完成后进行同步。

转到您的 feature 分支并将其重置为错误合并之前的提交:

$ git reset --hard hash_of_commit_prior_to_bad_merge
$ git push -f

您的分支已清理完毕。现在转到 test 分支并执行相同的操作,首先在合并之前重置并强制推送以更新远程。

此时两个分支都是干净的。

现在您可以通过更新您的分支并正常执行您的流程来重新开始。

让人们知道它已修复。

只要您在事件发生后立即执行并且您的团队允许您强制推送,这种方法就很干净并且可以正常工作。

当您使用 featuretest 分支时,我不明白为什么不允许这样做。

即使您稍后执行此操作并从 test 中删除其他人的提交,您也可以在完成后简单地将它们重新合并。

如果它只是一个单一的提交,git revert 会很好,虽然它创建了一个新的提交但是对于合并提交,摆脱它肯定比 error-prone 更简单,更有效并且更少恢复。

希望对您有所帮助。

我想丢失的提交不是太多。 然后下面的 2 个命令会有所帮助。

1) 在分支上遗漏的提交以前存在,

$ git reflog | grep -i "key-word-of-the-commit"

从上面得到commit-id-missed

最好先检查commit内容再去2)

$ git show commit-id-missed

2) 在要合并此提交的目标分支上,

$ git cherry-pick commit-id-missed

它将恢复您所做的所有错误过程。但是,如果提交太多,那将是一场浪费时间的灾难。