如何选择性地合并或从Git中的其他分支中选择更改?
我在一个新项目上使用git,该项目有两个平行但目前是实验开发分支:
master
:导入现有的代码库以及一些我一般很确定的mods exp1
:实验分支#1 exp2
:实验分支#2 exp1
和exp2
代表两种完全不同的架构方法。 直到我得到更进一步,我无法知道哪一个(如果有)将工作。 当我在一个分支上取得进展时,我有时会编辑一些对其他分支有用的编辑,并且只想合并这些编辑。
将一个发展部门的选择性变更合并到另一个部门的最佳方式是什么?
我考虑过的方法:
git merge --no-commit
然后手动暂停大量编辑,我不想在分支之间进行共同编辑。
手动将常用文件复制到临时目录中,然后通过git checkout
移动到另一个分支,然后将更多的手动拷贝出temp目录到工作树中。
上述变化。 现在放弃exp
分支并使用另外两个本地存储库进行实验。 这使得手动复制文件变得更直接。
所有这三种方法似乎都很乏味且容易出错。 我希望有更好的方法; 类似于使git-merge
更具选择性的过滤器路径参数。
您使用cherry-pick命令从一个分支中获取单个提交。
如果所需的更改不在单个提交中,则使用此处显示的方法将提交拆分为单独的提交。 粗略地说,你使用git rebase -i
获取原始提交进行编辑,然后git reset HEAD^
选择性还原更改,然后git commit
提交将该位提交为历史记录中的新提交。
在Red Hat杂志中有另一个很好的方法,在这里他们使用git add --patch
或可能的git add --interactive
,如果你想将不同的改变分割成单个文件(search在该分页的页面中)。
将这些变化分开后,您现在可以挑选出您想要的。
我有上面提到的完全相同的问题。 但我在解释答案时发现更清楚。
概要:
检出您要合并的分支的路径,
$ git checkout source_branch -- <paths>...
或有选择地合并黑客
$ git checkout -p source_branch -- <paths>...
或者,使用重置,然后添加选项-p
,
$ git reset <paths>...
$ git add -p <paths>...
最后提交
$ git commit -m "'Merge' these changes"
要有选择地将文件从一个分支合并到另一个分支,请运行
git merge --no-ff --no-commit branchX
其中branchX
是您想要合并到当前分支中的分支。
--no-commit
选项将阶段化由Git合并的文件,而不实际提交它们。 这将使您有机会修改合并文件,然后自行提交。
根据您想要如何合并文件,有四种情况:
1)你想要一个真正的合并。
在这种情况下,你接受合并文件的方式自动合并它们,然后提交它们。
2)有些文件你不想合并。
例如,您想要保留当前分支中的版本并忽略要合并的分支中的版本。
要选择当前分支中的版本,请运行:
git checkout HEAD file1
这将检索的版本file1
在当前分支,并覆盖file1
通过Git的automerged。
3)如果你想在branchX中的版本(而不是真正的合并)。
跑:
git checkout branchX file1
这将检索branchX
的file1
版本并覆盖Git自动合并的file1
。
4)最后一种情况是,如果只想选择file1
特定合并。
在这种情况下,您可以直接编辑已修改的file1
,将其更新为任何您希望file1
的版本变为,然后提交。
如果Git无法自动合并文件,它会将文件报告为“未合并”并生成一个副本,您需要手动解决冲突。
为了进一步解释一个例子,假设你想将branchX
合并到当前分支中:
git merge --no-ff --no-commit branchX
然后运行git status
命令查看修改文件的状态。
例如:
git status
# On branch master
# Changes to be committed:
#
# modified: file1
# modified: file2
# modified: file3
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: file4
#
其中file1
, file2
和file3
是git已成功自动合并的文件。
这意味着所有这三个文件的master
和branchX
中的更改已经组合在一起,没有任何冲突。
您可以通过运行git diff --cached
来检查合并是如何完成的;
git diff --cached file1
git diff --cached file2
git diff --cached file3
如果你发现一些合并不合需要,那么你可以
git commit
如果您不想合并file1
并希望保留当前分支中的版本
跑
git checkout HEAD file1
如果你不想合并file2
并且只想要branchX
的版本
跑
git checkout branchX file2
如果你想file3
自动合并,不要做任何事情。
此时Git已经合并了它。
上面的file4
是Git发生的失败合并。 这意味着两条分支在同一条线上发生了变化。 这是您需要手动解决冲突的地方。 您可以通过直接编辑文件或运行您希望file4
成为的分支中的版本的checkout命令来放弃合并。
最后,不要忘记git commit
。
上一篇: How to selectively merge or pick changes from another branch in Git?