我已经使用Git大约一年了,觉得它很棒,但我刚刚开始开发这个项目的第二个版本,并为它创建了一个新的分支。我有点纠结于如何最好地处理未来的事情。

我有两个分支,分别称为master10(用于v1)和master20(用于v2)。我一直在master10分支上修复v1中的bug,并开发master20的新东西。每当我做一个错误修复,我合并到v2检查master20和做git合并master10。到目前为止一切顺利。

然而,现在我在v1中做了一个我不想在v2中做的更改,但我想继续合并其他错误修复。我如何告诉Git跳过这个特定的提交(或一系列提交),但我仍然想合并其他错误修复。

我以为我需要的是git rebase,但看了医生,我的头几乎爆炸了。

我想我想要的是一个类似于“git sync”命令的东西,它告诉git两个分支现在是同步的,将来只合并从这个同步点开始的提交。

感谢任何帮助。


当前回答

听起来像是典型的“少不要手”案例。 https://git-scm.com/docs/git-cherry-pick 听起来就是这个意思

其他回答

在这种情况下,您需要让git考虑您跳过的更改比您所做的更改更老,而不是恢复或选择。

So:

合并要跳过的提交之前的最后一次提交。当然,这将在之前合并所有提交。Git合并CCC 合并要跳过的提交。Git合并FFF—不提交 执行任何合并,取消执行所有更改,撤销所有更改。(也许对此有万无一失的命令,但我只是在UI中完成这部分-无论你知道怎么做) 完成空合并git merge—continue 合并提交后,你想跳过一个。Git合并源代码-分支头

在步骤4之后,git会认为你的分支比上次提交的要更新,因为你已经处理过它了(通过选择保留你的版本)。

提交包括祖先。如果不合并先前的提交,就不能合并一次提交。

当然,你可以从中挑选。当你有一个处于维护模式的分支时,这是一个很好的流动。

听起来像是典型的“少不要手”案例。 https://git-scm.com/docs/git-cherry-pick 听起来就是这个意思

你可以用git-cherry pick来表示:

git cherry-pick $(git merge-base HEAD origin/branch)..$(git rev-parse <offending-commit-hash>^)
git cherry-pick <offending-commit-hash>..$(git rev-parse origin/branch)

它会从当前HEAD和origin/branch的最后一次公共提交中选择所有的提交,直到提交被忽略(注意^告诉cherry-pick停止在该提交的父节点)。

第二个命令从< offense -commit-hash>和其余的origin/branch中选取所有内容。

请注意,如果需要跳过提交来合并其他补丁,可能仍然需要进行一些修补(git将停止选择并告诉您解决冲突)。

在master10而不是master20中为你想要的更改创建第三个分支。始终将master10视为您的“master”,它是所有分支中最稳定的分支。所有其他分支都希望始终与之保持同步的分支。