git - 还原提交如何也是 merge 提交?

标签 git github git-merge atlassian-sourcetree git-revert

最近在工作中,我们在使用 git(和私有(private) github 存储库)进行版本控制的项目中丢失了一些代码。

我使用 git bisect 找到了罪魁祸首的提交,我真的很惊讶地发现它看起来像一个恢复提交,但也有两个像 merge 提交这样的 parent :

commit b5f97311eea2905baf8a96fddec22321d952f05c
Merge: 8cc7371 131d463
Author: Bob <bob@othercompany.com>
Date:   Fri May 22 19:42:25 2015 +0200

    Revert "ISB-CPW-3627 - Mise en place du calage des filtres DS1/DS2/DS3/DS4"

    This reverts commit 8cc7371e7133b68db95ac8e9aeb730d7889a1166.

此问题已通过从祖先提交创建新分支并在该新分支上应用一些补丁来解决。

所以我不需要帮助来解决这个问题,我只是想了解恢复提交如何也可以是 merge 提交,发生了什么,以及如何重现这种奇怪的行为。

我试着像这样重现它:

  • 8cc7371 创建一个新分支
  • git 还原 8cc7371

它按预期创建了具有单个父级 (8cc7371) 的还原提交。

罪魁祸首提交作者使用 Atlassian SourceTree 而不是 native 命令行界面,因此我也尝试使用 SourceTree 中的还原功能并得到与上述相同的结果(单亲)。

b5f9731 上运行一些 git 命令后,我注意到 git diffgit show 没有报告相同的文件集:

$ git diff b5f9731..8cc7371 --name-only
=> 2 files :
   application/sites/frontend/views/scripts/Layout/Foobar/PointsDeVente/index.tpl
   public/media/design/frontend/css/main-dev.css
$ git show --oneline --name-only  b5f9731
=> 1 file :
   public/media/design/frontend/css/main-dev.css

SourceTreeGithub正在显示 2 个文件。

您可以在此处找到图表的样子:graph.html ,以及一些 git 命令的结果:misc.html .

谁能解释一下 b5f9731 发生了什么?

最佳答案

我想到了什么:

git revert ...
# new commit abcdef
git merge ...
# new commit fedcba
git rebase -i HEAD~2

pick abcdef - the original revert commit
squash fedcba - the merge commit

消息取自abcdef

这一切都会产生新的 b5f9731。它有两个来自 merge 提交的父项和来自还原提交的消息。

关于git - 还原提交如何也是 merge 提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30819564/

相关文章:

git - 有谁知道用于 windows 的 git bash 程序用于其 shell 的是什么?

git - 如何从 git 中较新的提交中删除标签?

git - 在 git 中中止 merge - 最佳实践

git - 如何修复由于删除分支中的文件而导致的 merge 冲突?

git - 如何写symfony2有效

git - 如何使 Drupal 与 GitHub 存储库保持同步?

git - 如何在本地快速 pull pull 请求

由于移动文件导致 git merge 冲突

git - CocoaPods 无法从 GitHub 安装,出现 "No such file or directory"错误

git - 在 git 中强制推送个人分支是否安全?