首页 > 解决方案 > Git 拉取请求没有更改,但 git diff 显示更改

问题描述

我的分支有问题

介绍

我的项目有 3 个分支:Dev、Main 和 Staging

Dev分支上我们添加新功能,在Main分支上我们修复错误,在Staging上我们部署用于测试。

当主分支上的错误 PullRequest 完成时,我们会创建一个 PullRequest Main -> Dev** 以保持最新的Dev分支。当开发一个新特性时,一个 PullRequest 在Dev分支上完成。

当我们想要部署所有新功能时,我们创建一个 PullRequest Dev -> Main,然后是一个 PullRequest Main -> Staging。最后我们部署Staging分支的内容

问题

当我手动比较我的分支DevMain时,我发现存在差异:在Dev分支中,一些文件出现在一个文件夹中,但在之前的Main分支上的提交中,它被移动到了另一个文件夹。

当我制作时git diff Main..Dev,我发现与上面有相同的差异。

通常,此时,这两个分支必须处于相同的状态。所以我做了一个 PullRequest Main -> Dev给分支Dev正确的状态(状态):但它说我的 PullRequest 没有变化。

问题

如何正确地将我的Main分支的当前状态提供给Dev分支?

谢谢

标签: gitazure-devops

解决方案


可能发生了什么

正如@matt 在评论中所说,这可能是先前合并的结果,其中冲突可能已在不移动文件的情况下得到解决。现在,当你再次合并时,Git 认为它已经处理了重命名,因此它不必处理它。您可以通过查看自上次合并点以来的提交历史记录来证实这一理论:重命名是在那之前还是之后?

如何合并Main并强制Dev采取的状态Main

如果此时您想丢弃 的当前状态Dev并使其与 的状态完全相同Main,并且您想使用合并操作,我会使用该ours策略。我不确定您是否可以通过 PR 做到这一点,您可能必须在您的 PC 上完成并推送,我希望您的工作流程允许这样做!

不幸的是,你不能直接做git merge -s theirs Mainfrom Dev,那太简单了。您必须git merge -s ours DevMain创建您想要的合并提交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

我不认为您可以选择回到之前的合并并正确重做,但如果可以的话,这可能是最干净的选择。


推荐阅读