我正在尝试将本地分支合并到主分支而不让Git进行自动注册。我想“亲自挑选”我想要合并为主人的东西。
当我使用Git的difftool命令时,我能够区分并选择我想要添加到主分支中的内容。但是当我合并时,我会失去我之前选择的东西,因为Git会做一个automerge。我可以在合并之前将更改提交到master中,但这样做似乎不自然。
Git的mergetool仅在合并发生冲突时才可用。但是如果Git做了automerge,那么通常没有冲突,所以我无法运行mergetool命令。
更新
我开始认为我想要完成的是不好的做法,或者这是不可能的。也就是说,合并一个主题分支,只让它合并我需要的差异。此外,还有这一点反映在历史上。无论如何,我在试验Git时发布了一个问题。
答案 0 :(得分:74)
您试图绕过Git参与合并过程并手动选择要合并的每个修改文件的每一行。这与git cherry-pick
不同。 git merge --no-commit
等都不会有帮助。你需要做:
$ git checkout master
$ git difftool -t kdiff3 local-branch HEAD
在KDiff3
窗口中,左侧(A
)是您的本地分支,右侧(B
)是您的< em>当前分支(主)。
从菜单中选择Merge | Merge Current File
(或按下带有相同标题的彩色菱形图标)。
然后,您将看到每个文件的差异和冲突(如果有)。您可以选择左侧或右侧(A
或B
)或两者,和/或手动调整合并文件。
另一方面,有些事情告诉我你的工作流程存在一些更大的问题。
答案 1 :(得分:17)
git merge --no-commit --no-ff <local-branch>
做到了。
执行时,local-branch
的更改已应用,但尚未暂存。
然后,您可以查看要应用的更改 - 如果您想要全部使用它们 - 请将它们应用于
git commit -a
否则,选择要采用的文件,使用git add
进行暂存,最后使用git commit
进行提交。然后使用git checkout -- filename
恢复不需要的文件。
答案 2 :(得分:5)
如果您不信任自动合并,我可以看到您可能希望这样做,因为文件中不同位置的两次编辑(在不同分支上完成)可能不会导致自动合并引发冲突但可能实际上并没有一起工作。
您可能希望查看使用自定义合并驱动程序。本页介绍了如何进行此操作。
另一种方法是在执行合并之前首先找到分支之间不同的文件,然后将文件签出到相应的分支中,以确保获得包含其中一个或另一个的干净合并和功能代码。两次编辑。
git diff --name-only <branch1> <branch2>
git checkout <branch1> -- <paths>
答案 3 :(得分:0)
将以下内容添加到〜/ .gitconfig
[difftool "fugitive"]
cmd = vimdiff $LOCAL $MERGED $REMOTE
trustExitCode = false
keepBackup = false
现在使用“逃犯”进行三向差异
$ git checkout master
$ git difftool -t fugitive somebranch HEAD
关于$ LOCAL,$ MERGED,$ REMOTE的注释:
$ LOCAL您要合并的分支上的文件;显示给您的合并过程未触及
$ MERGED部分合并的文件,有冲突;这是合并过程中涉及的唯一文件,实际上,它从未在合并中显示给您
$ REMOTE您要合并的分支上的文件;显示给您的合并过程未触及
答案 4 :(得分:-1)
我认为您希望挑选个别更改:
git checkout master
git log --reverse --oneline topic ^master
然后为您希望在主分支中进行的每次提交调用git cherry-pick
。
如果应保留主题分支中的其余更改,您可能还想在新主服务器之上重新定义此分支:
git rebase master topic