如何将更改合并到单个文件,而不是合并提交?
我有两个分支(A和B),我想合并分支A中的单个文件和分支B中相应的单个文件。
我遇到了同样的问题。 确切地说,我有两个分支A
和B
,它们在一些文件中具有相同的文件,但是具有不同的编程接口。 现在,文件f
的方法在两个分支中的接口差异是独立的,在分支B
被改变,但是改变对于两个分支都是重要的。 因此,我只需要将分支B
文件f
合并到分支A
文件f
中。
一个简单的命令已经解决了我的问题,如果我假设所有的变化都提交在分支机构A
和B
:
git checkout A git checkout --patch B f
第一个命令切换到分支A
,进入我想要合并B
的文件版本f
。 第二个命令用f
的HEAD
B
补丁文件。 你甚至可以接受/丢弃补丁的单个部分。 而不是B
你可以在这里指定任何提交,它不一定是HEAD
。
这是我在这些情况下所做的。 这是一个kludge,但它对我来说工作得很好。
- 根据您的工作分支创build另一个分支。
- git pull / git合并包含要复制的文件的修订(SHA1)。 因此,这将合并所有的更改,但我们只使用这个分支来抓取一个文件。
- 修复任何冲突等调查您的文件。
- 结帐你的工作分支
- 检出从合并提交的文件。
- 承诺。
我尝试了补丁,我的情况太难看了。 总而言之,它看起来像这样:
工作分支:一个实验分支:B(包含file.txt有我想折叠的变化)
git checkout A
根据A创build新的分支:
git checkout -b tempAB
将B合并到tempAB中
git merge B
复制合并的sha1哈希值:
git log commit 8dad944210dfb901695975886737dc35614fa94e Merge: ea3aec1 0f76e61 Author: matthewe <matthewe@matthewe.com> Date: Wed Oct 3 15:13:24 2012 -0700 Merge branch 'B' into tempAB
检出你的工作分支:
git checkout A
检出您的固定文件:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
在那里你应该拥有它。 提交你的结果。
你可以使用:
git merge-file
提示: https : //www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
这使用git的内部difftool。 也许有一点工作要做,但直截了当。
#First checkout the branch you want to merge into git checkout <branch_to_merge_into> #Then checkout the file from the branch you want to merge from git checkout <branch_to_merge_from> -- <file> #Then you have to unstage that file to be able to use difftool git reset HEAD <file> #Now use difftool to chose which lines to keep. Click on the mergebutton in difftool git difftool #Save the file in difftool and you should be done.
下面的命令将(1)比较正确的分支的文件,与主(2)交互地询问你应该应用哪些修改。
混帐签出 – 补丁大师
我的编辑被拒绝,所以我附上了如何处理来自远程分支的合并更改。
如果你在不正确的合并后必须这样做,你可以这样做:
# If you did a git pull and it broke something, do this first # Find the one before the merge, copy the SHA1 git reflog git reset --hard <sha1> # Get remote updates but DONT auto merge it git fetch github # Checkout to your mainline so your branch is correct. git checkout develop # Make a new branch where you'll be applying matches git checkout -b manual-merge-github-develop # Apply your patches git checkout --patch github/develop path/to/file ... # Merge changes back in git checkout develop git merge manual-merge-github-develop # optionally add --no-ff # You'll probably have to git push -f # make sure you know what you're doing.
假设B是当前分支:
$ git diff A <file-path> > patch.tmp $ git apply patch.tmp -R
请注意,这只适用于本地文件的更改。 你需要事后提交。