I have two branches: trunk, production. I have found a problem in trunk, made fix and committed it, pushed it. Now it was tested and I need do merge changes into the production branch as a hot-fix. I try to use the cherry-pick. However it doesn't work because a changed file(s) in the fix was renamed in the trunk earlier during some refactoring which I don't want bring into production.
I don't want merge everything, but take only this commit. The cherry pick fails with "deleted by us" conflict (of course, the new file never even existed in the production branch).
What is the correct way to bring the changes into the old file?
This is kind of tricky. For example, you could create a patch from a diff and apply it to the old file. But in the future to prevent these problems, I'd recommend to do fixes on the production branch and test it there first, then merge from production into trunk.
I'd use good old patch for this:
Faced with the same problem, I asked a colleague what he would do, and his instant response was:
Worked like a charm for me.
I made a shell script that tries to do a cherry-pick while guessing file moves (it doesn't work if you renamed the file itself, only if you moved it to another folder): However: currently it will fail if the commit adds new files or if it itself rename files.
I experience the same problem and have tried to find a solution.
I solved by using a sequence of rebases. I've done no further tests than these so use at own risk!
If your're interested have a look at it on github:
https://github.com/fraschfn/cherry-pick
If:
... then you should definitely consider changing your git config like this:
It is possible that during a merge/cherry-pick, git is hitting the default file check-limit (I think it's 400 or 1000 or something like that) before it is able to locate the suitable rename match. Upping this limit may cause merge/cherry-pick to take longer while it searches for your renamed file, but it can help avoid "deleted by us" merge-challenges.
That should do the trick, but if your renamed file was small and the changes between branches is significant, you might also play with the
-X rename-threshold
setting, e.g. lowering it from the default 50% with-X rename-threshold=25%
.