git - 如何在不破坏 future merge 的情况下部分 git cherry-pick?

标签 git

我需要对 develop 进行一些错误修复分支到master .我想要文件 Adevelop 中相同和 master .

通常,我会 git cherry-pick影响 A 的提交,但其中一些提交也会影响文件 BC , 其中B是存在于 master 中的文件但我还不想改变,Cmaster 中尚不存在的文件.

当 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/

相关文章:

git - 在虚拟机中开发时如何管理代码库(vagrant)

Git - 无法推送到 gitlab 项目 - "unable to update URL base from redirection"

git - 使用 git filter branch 重写历史时保留 git 注释

swift - Steam 部署 -> 错误 : Repository not found

java - 如何将 gradle 多项目存储库作为 git 子模块包含在另一个 gradle 项目中

git - 如何检查是否从 .bashrc 安装了 Git

linux - 为什么在 Windows > 8 上使用 CR LF 保存文件?

windows - 在 Windows 服务器上自行托管远程 git 存储库

git - 如何使用带密码的 SSH key 使用 GitPython 克隆 git 存储库

git 推送错误 : HTTP request failed: The requested URL returned 504