执行git合并时可以排除特定的提交吗?
假设我想从发布分支合并到主分支,并且在发布分支中有一些我不想包含在主分支中的提交。 有没有办法进行合并,以便这些提交中的一个或多个不会合并?
到目前为止,我的策略是做以下事情(主人):
git merge --no-commit release-branch
# Resolve conflicts and apply reverse patch of the commits that I don't want included
git commit # Edit commit message so that it lists the commits that have been reverse-patched
有一个更好的方法吗?
创建一个新的分支,交互地分支分支并放弃你不想要的提交,然后合并它。
你不能在没有重新哈希的情况下从分支中间取出更改,但是当它在后面的合并中看到相同的更改时(例如,摘樱桃和不分),正确的事情会发生。
我在Pro Git书中找到了适合我的解决方案。
假设你想排除文件config.php
。
在分支A上:
在同一个目录下创建一个名为.gitattributes
的文件,这行代码如下: config.php merge=ours
。 这告诉git在合并文件时使用什么策略。 在这种情况下,它始终保持您的版本,即。 您正在合并到的分支上的版本。
添加.gitattributes
文件并提交
在分支B上:重复步骤1-2
现在尝试合并。 你的文件应该保持不变。
如果您有一个支持分支,您可以在其中修复错误并构建新版本。 在掌握你有下一个版本,你也经常建立新版本。
每次构建新版本时,都会更改某个文件的版本,提交该新文件,创建标签并推送。 现在,从支持合并到主文件将始终在包含版本信息的文件中发生冲突。
如果包含版本信息的文件仅包含版本信息,则可以使用fcurella的答案。 但是如果它确实也可能包含可合并信息(pom.xml,gradle.properties,MANIFEST.MF,...),则必须执行一些额外的操作。
让我们使用下面的例子
C---D*---E---F* support
/
A---B---G---H*---I master
其中星星提交仅包含由于在合并期间应忽略的版本更改而导致的更改。
要将支持合并到主版本中,而不会因版本构建而导致合并冲突,可以执行以下任一操作:
多次合并提交
git checkout master
git merge C
git merge D -s ours
git merge E
git merge F -s ours
通过-s ours
论点,我们告诉git只记录合并而不改变工作区。 这相当于svn的--record-only
选项。
以上将导致以下布局
-------------C---D*---E---F* support
/
A---B---G---H*---I---J---K----L---M master
一个合并提交使用樱桃挑选
git checkout master
git merge support -s ours --no-commit
git cherry-pick C E --no-commit
git commit -m 'merged support into master'
首先我们开始一个合并,但只记录我们正在合并的记录,而不改变工作空间并且不进行合并提交。 然后,我们挑选承诺合并,再次没有承诺。 最后我们正在进行合并。
以上将导致以下布局
C---D*---E---F* support
/
A---B---G---H*---I---J master
甚至可以自动进行樱桃采摘。
git checkout master
git merge support -s ours --no-commit
for id in `git log support --reverse --not HEAD --format="%H [%an] %s" |
grep -v "bump version" |
sed "s/(w*)s.*/1/g"`
do
git cherry-pick --no-commit $id
done
git commit -m 'merged support into master'
链接地址: http://www.djcxy.com/p/44831.html
上一篇: Is it possible to exclude specific commits when doing a git merge?
下一篇: What should be in my .gitignore for an Android Studio project?