git - Git 拉取请求没有更改,但 git diff 显示更改
问题描述
我的分支有问题
介绍
我的项目有 3 个分支:Dev、Main 和 Staging
在Dev分支上我们添加新功能,在Main分支上我们修复错误,在Staging上我们部署用于测试。
当主分支上的错误 PullRequest 完成时,我们会创建一个 PullRequest Main -> Dev** 以保持最新的Dev分支。当开发一个新特性时,一个 PullRequest 在Dev分支上完成。
当我们想要部署所有新功能时,我们创建一个 PullRequest Dev -> Main,然后是一个 PullRequest Main -> Staging。最后我们部署Staging分支的内容
问题
当我手动比较我的分支Dev和Main时,我发现存在差异:在Dev分支中,一些文件出现在一个文件夹中,但在之前的Main分支上的提交中,它被移动到了另一个文件夹。
当我制作时git diff Main..Dev
,我发现与上面有相同的差异。
通常,此时,这两个分支必须处于相同的状态。所以我做了一个 PullRequest Main -> Dev给分支Dev正确的状态(主状态):但它说我的 PullRequest 没有变化。
问题
如何正确地将我的Main分支的当前状态提供给Dev分支?
谢谢
解决方案
可能发生了什么
正如@matt 在评论中所说,这可能是先前合并的结果,其中冲突可能已在不移动文件的情况下得到解决。现在,当你再次合并时,Git 认为它已经处理了重命名,因此它不必处理它。您可以通过查看自上次合并点以来的提交历史记录来证实这一理论:重命名是在那之前还是之后?
如何合并Main
并强制Dev
采取的状态Main
如果此时您想丢弃 的当前状态Dev
并使其与 的状态完全相同Main
,并且您想使用合并操作,我会使用该ours
策略。我不确定您是否可以通过 PR 做到这一点,您可能必须在您的 PC 上完成并推送,我希望您的工作流程允许这样做!
不幸的是,你不能直接做git merge -s theirs Main
from Dev
,那太简单了。您必须git merge -s ours Dev
从Main
创建您想要的合并提交Dev
:
git checkout Main
git merge -s ours Dev # this "merges" Dev in but ignores all its changes
# don't push this!
git checkout Dev
git merge Main # this should be a fast-forward merge
# now you can push Dev
完成后,您可以通过将其Main
恢复到原来的位置来清理沙箱,因为该合并旨在Dev
:
git checkout Main
git reset --hard origin/Main
如果我想要重命名Main
,但又不想丢失其他更改Dev
怎么办?
在这种情况下,我认为您将需要做一些手动工作。如果重命名确实在上一次合并之前,并且将这些提交带入历史记录的合并在没有应用重命名的情况下被解决,则您需要在分支Dev
上再次重新创建重命名,可能是手动的。Dev
我不认为您可以选择回到之前的合并并正确重做,但如果可以的话,这可能是最干净的选择。
推荐阅读
- regex - 我可以将 Regextract 与 IF 一起使用,所以如果我不想找到的文本,公式会搜索另一个术语?
- php-7 - 如何在 ubuntu 18.04 上运行的 php7 中安装 gearman 扩展
- css - 如何使css表的头部变粘
- python - 加入两个爱国数据框pyspark
- directx - D3D11 纹理上的 Direct2D 绘制不混合
- spring-boot - 码头:如何在springboot中修改嵌入式码头服务器启动配置?
- ubuntu - 如何在 Ubuntu 16.4 上更新 VS Code?
- spring - Spring 嵌套的 ConfigurationProperties 和 Kotlin
- asp.net-core - 从 Web API 中的内部方法完成请求执行
- sql-server - 执行动态 SQL 查询以过滤数据