Git - 恢复合并所做的更改而不破坏最近添加到相同文件的内容
Git - Revert changes made by merge without destroying recent additions to the same files
简介
我在一个开发团队工作,每个人都在不同的分支工作,添加不同的功能。
今天发现一周前合并到我们 develop 分支中的一个特性不再在 develop 中。
我想找到将这个丢失的功能重新引入 develop 的最佳方法。
结构
有两个分支:featureA 和 featureB。这两个都是 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 后,对一些相同的文件进行了更改.
我试过的
- 将功能 A 合并到开发中:
$ git checkout develop && git merge featureA
但是 git 只是告诉我它是“最新的”,因为 featureA 自从最初合并到 develop 后就没有从 develop 中分离出来。
我的解决方案
- checkout 在将 featureA 合并到其中后立即开发
- 获取该合并修改的文件的副本
- 查看最新开发
- 手动检查并读取已删除的更改
问题
我认为有更好的方法可以做到这一点,不需要我手动读取更改。
有没有更好的方法可以合并在 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 等)。
简介
我在一个开发团队工作,每个人都在不同的分支工作,添加不同的功能。
今天发现一周前合并到我们 develop 分支中的一个特性不再在 develop 中。
我想找到将这个丢失的功能重新引入 develop 的最佳方法。
结构
有两个分支:featureA 和 featureB。这两个都是 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 后,对一些相同的文件进行了更改.
我试过的
- 将功能 A 合并到开发中:
$ git checkout develop && git merge featureA
但是 git 只是告诉我它是“最新的”,因为 featureA 自从最初合并到 develop 后就没有从 develop 中分离出来。
我的解决方案
- checkout 在将 featureA 合并到其中后立即开发
- 获取该合并修改的文件的副本
- 查看最新开发
- 手动检查并读取已删除的更改
问题
我认为有更好的方法可以做到这一点,不需要我手动读取更改。
有没有更好的方法可以合并在 featureA 分支中所做的更改 使用开发中这些文件的当前版本?
我一路上发现的东西
您可以 运行 $ git log -p -S '<small>Creator'
.
其他信息
将功能合并到开发中的人与进行更改的人不同。因此,在我们的任务跟踪软件中将分支标记为准备就绪 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 等)。