Backport从重命名的文件更改

kan*_*kan 23 git cherry-pick

我有两个分支:主干,生产.我在trunk中发现了一个问题,修复并提交了它,推了它.现在它已经过测试,我需要将更改合并到生产分支中作为热修复.我尝试使用樱桃挑选.但是它不起作用,因为修复程序中的更改文件在某些​​重构期间在先前在主干中重命名,我不想将其投入生产.

我不希望合并所有内容,但只采取此提交.樱桃选择失败了"我们删除"冲突(当然,新文件甚至从未存在于生产分支中).

将更改带入旧文件的正确方法是什么?

jav*_*ett 26

如果:

  • 你期望/希望Git会检测到在trunk上移动或重命名文件,但它没有,并且
  • 您的存储库具有合理数量的文件

...那么你一定要考虑改变你的git配置:

$ git config merge.renameLimit 999999
Run Code Online (Sandbox Code Playgroud)

在合并/ cherry-pick期间,git可能会在找到合适的重命名匹配之前达到默认文件检查限制(我认为它是400或1000或类似的东西).提高此限制可能会导致merge/cherry-pick在搜索重命名的文件时花费更长时间,但它可以帮助避免"我们删除"合并挑战.

这应该可以解决问题,但是如果重命名的文件很小并且分支之间的变化很大,那么您也可以使用该-X rename-threshold设置,例如将其从默认的50%降低-X rename-threshold=25%.

  • 关于其他用户的`rename-threshold`的注释 - 这包括随时间的所有变化.我有一个合并,其中原始重命名改变了文件中的两行,但由于它在*那个点之后被大量修改*,git仍然没有检测文件相似性而没有降低`rename-threshold`. (2认同)

rob*_*nst 14

我会用这个很好的旧补丁:

git show COMMIT_ID -- old/file/name.txt | patch new/file/name.txt
Run Code Online (Sandbox Code Playgroud)

  • 是的,它对我有用。但是,找到一个更好的解决方案会很有趣,特别是在有多个重命名文件的情况下。 (2认同)

use*_*284 6

面对同样的问题,我问一位同事他会怎么做,他的即时回应是:

git checkout production

git mv production-filename trunk-filename && git commit -m "Just fooling git"
git cherry-pick trunk-commit
git mv trunk-filename production-filename && git commit -m "Undo the damage"

# Now squash the 3 commits
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)

对我来说就像一个魅力。

  • 这对我有用。我使用了GUI,但是遵循相同的步骤。我花了一分钟的时间弄清楚它在做什么,所以我列出了这些步骤:1.在目标分支上重命名文件/目录以匹配源分支并提交。2. Cherrypick从源分支到目标分支的更改。3.重命名目标分支上的文件/目录,以恢复它们的原始名称和提交方式。4.将这3次提交压缩为一次提交。 (3认同)