Git - 恢复合并所做的更改而不破坏最近添加到相同文件的内容

Git - Revert changes made by merge without destroying recent additions to the same files

简介

我在一个开发团队工作,每个人都在不同的分支工作,添加不同的功能。

今天发现一周前合并到我们 develop 分支中的一个特性不再在 develop 中。

我想找到将这个丢失的功能重新引入 develop 的最佳方法。

结构

有两个分支:featureAfeatureB。这两个都是 develop.

的分支
Structure of branches:
 - Master
   - Develop
     - featureA
     - featureB
     - ...

featureA - 将 Creator ... 添加到一堆文件中

featureB - 做一些完全不相关的事情

发生了什么

featureA先于featureB完成并合并到develop

featureB 现已完成并将其更改合并到 develop

一个星期过去了,在此期间,对 featureA 修改的文件进行了新更改。

最后,我注意到 featureA 所做的更改不再处于开发阶段。

我搜索提交历史,发现 featureB 合并到 develop 删除了 [= 对项目所做的更改84=]featureA.

目标

我希望 featureA 所做的更改再次包含在 develop 的最新版本中。但是,我不想将文件恢复到之前的状态,因为自从 featureA 合并到 develop 后,对一些相同的文件进行了更改.

我试过的

但是 git 只是告诉我它是“最新的”,因为 featureA 自从最初合并到 develop 后就没有从 develop 中分离出来。

我的解决方案

  1. checkout 在将 featureA 合并到其中后立即开发
  2. 获取该合并修改的文件的副本
  3. 查看最新开发
  4. 手动检查并读取已删除的更改

问题

我认为有更好的方法可以做到这一点,不需要我手动读取更改。

有没有更好的方法可以合并在 featureA 分支中所做的更改 使用开发中这些文件的当前版本?

我一路上发现的东西

您可以 运行 $ git log -p -S '<small>Creator'.

而不是通过 bitbucket 的界面来追踪包含 featureA 所做更改的最后一次提交

其他信息

将功能合并到开发中的人与进行更改的人不同。因此,在我们的任务跟踪软件中将分支标记为准备就绪 merged/tested 之前,开发人员应将开发合并到功能分支中。

这意味着,最有可能的是,featureB 破坏了 featureA 在执行类似以下操作时的更改:$ git fetch && git checkout featureB && git merge develop.

这可能是由于手动处理合并冲突不当,或者因为他们忘记在合并 develop 之前获取最新版本的 develop进入 featureB.

潜在的更好的解决方案

$ git fetch && git checkout -b featureA-readd-changes <featureA>
$ git merge develop ...
$ git push -u origin featureA-readd-changes

然后通过我们的任务软件提交合并到开发的请求。

最后

我希望答案不仅要给出解决方案,还要说明解决方案背后的合理性。我的目标是了解 git 如何更好地工作,以便我将来可以更轻松地处理此类情况。

如果您认为可以帮助防止此类事情在未来发生,请随时提出对我们当前流程的更改建议。

感谢您的宝贵时间。

嗯....当你解释什么删除 branchA 引入的更改时我停止阅读:branchB 的合并。简单的解决方法:挑选所有构成 branchA 的修订,以便 git 它们是 全新的 修订,不会合并到 develop 中,然后 git 重试时不会抱怨合并。找出 branchA 的起始版本(例如,develop 中的版本是第一个“branchA-proper”版本的父版本)。

git checkout that-revision
git cherry-pick HEAD..branchA # reapply all changes introduced by branch A.. assuming it's a straight line
git branch -f branchA # set branchA over here
git checkout develop # or the remote one, whatever suits
git merge branchA # this should work this time

现在,你应该找到合并 branchB 的人,问问他们为什么要从 branchA 中删除更改。冲突?如果是这样的话,他们没有得到妥善解决。请他们阅读这篇关于如何处理冲突的优秀指南(当然是我写的 ;-)):www.ezconflict.com(无货币化、无跟踪、无 cookie 等)。