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

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

237013 次浏览

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

一个简单的命令已经为我解决了这个问题,如果我假设所有的更改都在AB两个分支中提交:

git checkout A


git checkout --patch B f

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

社区编辑:如果B上的文件fA上还不存在,则省略--patch选项。否则,您将收到“No Change.”消息。

下面是我在这种情况下的做法。这是一个拼凑,但它对我来说很好。

  1. 在工作分支的基础上创建另一个分支。
  2. git pull/git合并修订版(SHA1),其中包含您想要复制的文件。这将合并所有的更改,但我们只使用这个分支来获取一个文件。
  3. 解决任何冲突等调查你的文件。
  4. 检出您的工作分支
  5. 签出合并提交的文件。
  6. 提交它。

我试过修补,但我的情况太糟糕了。简而言之就是这样的

工作分支 实验分支:B(包含文件。txt,其中有我想折叠的变化。)

git checkout A

根据A创建新分支:

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

你应该知道了。提交你的结果。

我的编辑被拒绝了,所以我附上了如何从远程分支处理合并更改在这里。

如果你必须在错误的合并后这样做,你可以这样做:

# 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.

这使用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.

假设B是当前分支:

$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R

注意,这只对本地文件应用更改。之后你需要做出承诺。

下面的命令将 (1)比较文件的正确分支,以掌握 (2)交互式地询问你应用哪些修改。

git checkout --patch master <fn>

我将这样做

git format-patch branch_old..branch_new file

这将为文件生成一个补丁。

在目标branch_old上应用补丁

git am blahblah.patch

您可以签出要合并的文件的旧版本,将其保存在不同的名称下,然后在两个文件上运行合并工具。

如。

git show B:src/common/store.ts > /tmp/store.ts(其中B是分支名称/commit/标签)

meld src/common/store.ts /tmp/store.ts

我发现这个方法简单有用:如何“合并”;来自另一个分支的特定文件

事实证明,我们太努力了。我们的好朋友git checkout是完成这项工作的合适工具。

git checkout source_branch <paths>...

我们可以简单地给git checkout特性分支A的名称和我们想要添加到主分支的特定文件的路径。

为了更好的理解,请阅读全文

git checkout <target_branch>
git checkout <source_branch> <file_path>