我已经使用Git大约一年了,觉得它很棒,但我刚刚开始开发这个项目的第二个版本,并为它创建了一个新的分支。我有点纠结于如何最好地处理未来的事情。
我有两个分支,分别称为master10(用于v1)和master20(用于v2)。我一直在master10分支上修复v1中的bug,并开发master20的新东西。每当我做一个错误修复,我合并到v2检查master20和做git合并master10。到目前为止一切顺利。
然而,现在我在v1中做了一个我不想在v2中做的更改,但我想继续合并其他错误修复。我如何告诉Git跳过这个特定的提交(或一系列提交),但我仍然想合并其他错误修复。
我以为我需要的是git rebase,但看了医生,我的头几乎爆炸了。
我想我想要的是一个类似于“git sync”命令的东西,它告诉git两个分支现在是同步的,将来只合并从这个同步点开始的提交。
感谢任何帮助。
你可以用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将停止选择并告诉您解决冲突)。
一种对我的项目的广告,它基本上包装了@araqnid所描述的过程。
它是一种助手,引入以下GIT流程:
每天/每周都会有一个关于从维护分支到开发/主分支的待处理合并的通知
分支维护者检查状态并自己决定是否所有的提交都是必需的,然后要么阻止一些提交,要么让开发人员阻止他们自己。最后,维护部门合并到上游部门。
项目页面上的一句话:
Depending on the workflow it's possible to have maintenance or
customer-specific branches along with the master branch. These
branches are also called LTS branches.
Oftentimes the hot fixes go into the branches where the bug was
reported and then the commit is merged back into the master branch.
General practice is to have all branches perfectly synchronized with
the master, i.e. you want to see a clear delta between a particular
branch and master to understand whether the master contains all
features and bugfixes.
However sometimes you don't want particular commits because they are
customer-specific and shall not be visible by other users. Or your
master branch diverged that much that it requires completely different
approach to fix the issue, or even better, the problem is not anymore
present there.
Also in case of cherry-pick from master into the maintenance branch
the resulting commit shall be blocked in master.
恕我冒犯,最合乎逻辑的做法是合并所有内容,然后使用git revert (commit_you_dont_want)删除它。
例子:
git merge master
git revert 12345678
如果你有多个“to-ignore”提交,或者想编辑回复消息:
git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"
那么你的履历可能是这样的:
| ... Except 123456 and abcdef
|\ Merge branch 'master' into 'your_branch'
如果你的冲突只涉及这些“to-ignore”提交,你可以使用:
git merge master -X ours
所以你的版本会比另一个版本持久。即使没有错误消息,您仍然可能“恢复”那些不想要的提交,因为它们可能有其他不冲突的更改,而您仍然不想要它们。
如果冲突不仅涉及“要忽略的”提交,那么您应该手动解决它们,并且可能必须在恢复期间再次解决它们。