我需要对 develop
进行一些错误修复分支到master
.我想要文件 A
在 develop
中相同和 master
.
通常,我会 git cherry-pick
影响 A
的提交,但其中一些提交也会影响文件 B
和 C
, 其中B
是存在于 master
中的文件但我还不想改变,C
是 master
中尚不存在的文件.
当 future 某个时间发布下一个版本时,develop
将 merge 到master
.如果我git cherry-pick -n
我现在想要的提交,我将不得不取消对 B
的更改,并解决不存在的冲突 C
在提交之前。真正 merge 时来自develop
进入master
发生了,我想要对 B
进行更改和 C
,但我实际上不会得到它们,因为我已经在 cherry-pick
期间搞砸了这些更改,对吧?
我应该怎么做?如果我git checkout <latest_commit_hash> A
,这不会在未来造成严重的 merge 冲突吗?
最佳答案
如果这些分支在未来的任何时间被 merge ,通常避免 git cherry-pick
。
在我看来,如果开发分支是本地的且不公开可见,git rebase
实际上可能会有所帮助。如果其他人看到了您的更改并且这些提交有不同的父项,您将无法避免 merge 。
假设您在开发中的主线之后有 n 次提交,并且您在 n 中有 m1,m2,m3 次要共享的提交主线。
如果你这样做:
git checkout development # go to development branch
git rebase -i mainline # reorder all commits in development
您将获得一个编辑器窗口,其中显示每行一个提交。如果你将 m1,m2,m3 的提交放在行的顶部并选择 edit
(而不是 pick
)git
将按照您的要求对您的提交进行重新排序(顶部提交最旧,底部提交最新),并且它将在每个标记为编辑的提交之前停止。
然后你可以这样做:
git add file1
git commit # commit only file1
git commit -a # commit the rest
git rebase --continue # continue rebasing
然后您可以再次 rebase 以将不需要的提交移到您的更改历史记录中更靠前的位置。如果你对你的日志感到满意(即:你在主线中需要的所有提交都在主线的更改之上,没有别的;因此你可以快速 merge )你从你的开发分支中选择你想要的最远的提交(通过 SHA)并将其 merge 。
git checkout mainline
git log development # assume acf123 is the last commit you want
git merge acf123 # fast forward to the right commit
另见:
关于git - 如何在不破坏 future merge 的情况下部分 git cherry-pick?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30200399/