如何将更改合并到单个文件,而不是合并提交?

我有两个分支(A和B),我想合并分支A中的单个文件和分支B中相应的单个文件。

我遇到了同样的问题。 确切地说,我有两个分支AB ,它们在一些文件中具有相同的文件,但是具有不同的编程接口。 现在,文件f的方法在两个分支中的接口差异是独立的,在分支B被改变,但是改变对于两个分支都是重要的。 因此,我只需要将分支B文件f合并到分支A文件f中。

一个简单的命令已经解决了我的问题,如果我假设所有的变化都提交在分支机构AB

 git checkout A git checkout --patch B f 

第一个命令切换到分支A ,进入我想要合并B的文件版本f 。 第二个命令用fHEAD B补丁文件。 你甚至可以接受/丢弃补丁的单个部分。 而不是B你可以在这里指定任何提交,它不一定是HEAD

这是我在这些情况下所做的。 这是一个kludge,但它对我来说工作得很好。

  1. 根据您的工作分支创build另一个分支。
  2. git pull / git合并包含要复制的文件的修订(SHA1)。 因此,这将合并所有的更改,但我们只使用这个分支来抓取一个文件。
  3. 修复任何冲突等调查您的文件。
  4. 结帐你的工作分支
  5. 检出从合并提交的文件。
  6. 承诺。

我尝试了补丁,我的情况太难看了。 总而言之,它看起来像这样:

工作分支:一个实验分支: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 

请注意,这只适用于本地文件的更改。 你需要事后提交。