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

Isu*_*uru 342 git merge git-branch

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

lou*_*oup 580

我遇到了同样的问题.确切地说,我有两个分支AB相同的文件,但在某些文件中有不同的编程接口.现在,文件的方法f(独立于两个分支中的接口差异)在分支中被更改B,但是这两个分支的更改很重要.因此,我需要将f分支B文件合并到分支文件fA.

一个简单的命令已经解决了这个问题对我来说,如果我认为所有的改变都在两个分支承诺AB:

git checkout A

git checkout --patch B f
Run Code Online (Sandbox Code Playgroud)

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

社区编辑:如果文件fB不上不存在A呢,则省略--patch选项.否则,你将获得"无变化".信息.

  • @UmairAshraf你应该能够通过删除--patch选项将一个新文件从B添加到A. (19认同)
  • 仅当您要更新文件时才有效.如果我想将分支B中的新文件添加到分支A,该怎么办? (9认同)
  • 嗯......当我尝试这个时,我得到的消息是"没有变化",但显然有变化.好的,我需要在相关文件所在的文件夹中.编辑:这很可能是我在stackoverflow上看到的问题的最喜欢的解决方案:-D (8认同)
  • 只需要补充一点,如果你在文件中有*多个更改(帅)*并且你想要*分阶段*,你可以在交互阶段按'a`,而不是每次都按'y`.或者使用`git checkout B - f`命令. (8认同)
  • 有没有办法非交互式地做到这一点?这两个文件的设置方式使该解决方案不切实际。理想情况下,我想获得一个包含我可以手动编辑的合并冲突标记的文件。 (3认同)
  • 我不得不使用`git checkout --patch B-f`来使它工作。 (2认同)
  • 这对我来说并不是真正的“合并”:它践踏了我在我的分支(此处为 A)中对 'f' 所做的更改。B 是 master,A 是我的功能分支。当我以另一种方式合并时,将 A 合并回 B(主),发生了冲突。当我这样做来同步文件时,我在 A 中所做的更改消失了,并且 git 没有报告冲突。 (2认同)

egg*_*ers 15

这是我在这些情况下所做的.这是一个kludge但它对我来说很好.

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

我尝试修补,我的情况太难看了.简而言之,它看起来像这样:

工作分支:实验分支:B(包含file.txt,其中包含我想要折叠的更改.)

git checkout A
Run Code Online (Sandbox Code Playgroud)

基于A创建新分支:

git checkout -b tempAB
Run Code Online (Sandbox Code Playgroud)

将B合并到tempAB中

git merge B
Run Code Online (Sandbox Code Playgroud)

复制合并的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
Run Code Online (Sandbox Code Playgroud)

结账你的工作分支:

git checkout A
Run Code Online (Sandbox Code Playgroud)

检查你的固定文件:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Run Code Online (Sandbox Code Playgroud)

你应该拥有它.提交你的结果.

  • 因此,我们必须做所有这一切只是为了合并一个文件?复制文件并将其粘贴到另一个分支会不会更容易 (3认同)
  • @Robin可能不会,因为合并会保留文件上的更改,这些更改在分支 A 和 B 之间有所不同。复制文件将覆盖您的工作分支 A 与您想要从 B 引入的内容之间的任何其他差异,其中可能不包含这些条目/编辑。例如,怀疑“A”一开始就以其他方式偏离了“B”。复制会覆盖这些差异。 (2认同)

小智 11

这使用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.
Run Code Online (Sandbox Code Playgroud)


小智 8

你可以使用:

    git merge-file
Run Code Online (Sandbox Code Playgroud)

提示:https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html

  • 我试图仅合并一个文件,但来自另一个分支。我没有看到从另一个分支“git merge-file”合并的选项 (3认同)

Paw*_*och 6

我发现这种方法简单实用:如何“合并”另一个分支中的特定文件

事实证明,我们正在努力。我们的好朋友git checkout是完成这项工作的正确工具。

git checkout source_branch <paths>...

我们可以简单地给git checkout提供功能分支A的名称,以及要添加到主分支的特定文件的路径。

请阅读全文以获得更多理解

  • 这会覆盖文件,但不会合并它们 (13认同)
  • 覆盖,你不在乎?绝对误导,被否决。 (3认同)
  • 我同意它会覆盖。我认为您的意思是在该命令中使用“-p”选项。不幸的是,这会覆盖工作树文件上之前在补丁更改之前从您签出的分支转移的任何部分。 (2认同)

use*_*182 5

下面的命令将 (1) 比较正确分支的文件,到 master (2) 以交互方式询问您要应用哪些修改。

git checkout --patch master

  • 我认为你的意思是``git checkout --patch master &lt;filespec&gt;```。 (2认同)