仅合并git中的选定更改

时间:2016-03-29 16:16:37

标签: git git-merge tortoisegit

我有一个文本文件已提交并推送到主分支。 我的同事从主分支机构做了一个单独的分支,并对文件进行了一些更改 - 他对文本进行了修改。更改在单个提交和单个文件中进行。

现在,我想将他的一些更改合并到主分支中的原始文件。但!我不想接受所有的一切,只是一些改变。

对同一文件的各行进行了更改:更改了一些行,添加了一些行,修订版中删除了一些行。 我怎样才能做到这一点?

如果我正确理解git,简单地将版本分支合并到master将不会检测到冲突,因为我在master分支中没有进行任何更改。 此外,合并将仅应用分支/提交中所做的所有更改。但是,我想只应用在线更改(让我们说#20,50,69)。我想忽略其他更改,因为我不同意它们。

如何让git在所有已更改的文件上出现冲突,以便我选择是否要接受更改?我需要一些互动的方式。

例如,在MS Word中,可以跟踪更改。然后,可以接受每个更改(采用新版本并删除旧版本)或拒绝(保留旧版本并丢弃更改)。然后,不再突出显示更改。

我在MS Windows 10上使用TortoiseGit应用程序,在git版本1.9.5.msysgit.1上运行。因此,如果有使用客户端的方式我会更喜欢它。

3 个答案:

答案 0 :(得分:3)

这对我有用;假设您要导入的更改位于testbranch分支上(假设您要操作的文件为README):

  • master分支开始:

    $ git checkout master
    
  • 使用--patch git checkout参数进行更改 从另一个分支:

    $ git checkout --patch testbranch README
    

    这将显示与git add -p相同的界面 让你有选择地接受或跳过块。

答案 1 :(得分:1)

假设正在讨论单个提交,您需要接受已提交的提交,取消提交,然后使用交互式分段有选择地选择接受哪些更改。所以首先继续并合并他们的变化。然后...

git reset HEAD^
git add --interactive

这将引导您进入菜单系统。键入“5”然后按Enter键,这将打开修补过程。已更改的文件将显示在编号列表中。输入您要考虑接受的号码。因此,假设有5个文件,您需要1,2,3和5.您可以键入逗号分隔或执行1-3,5。键入要输入的文件编号后,输入。界面让您有机会仔细检查是否要添加任何其他文件。输入任何其他数字。当您准备好开始检查更改时,请将该行留空并按Enter键。

现在它将引导您完成git可以找到的每个“大块”变化。键入“h”以查看命令列表。 “y”表示您接受更改,“n”表示您不接受更改。如果一大块变化太大,你可以尝试使用“s”命令将其分解成更小的深度 - 但它只能做很多事情。

完成所有文件后,您将返回菜单系统。输入“q”然后按Enter键。使用git status检查已上演的内容。

现在您可以继续进行更改并知道只包含您接受的部分。

答案 2 :(得分:0)

  

如何制作git ...让我选择是否要接受更改?

git merge --no-commit

会这样做 - 文档说:

  

...执行合并但假装合并失败并且不自动提交,让用户有机会在提交之前检查并进一步调整合并结果。

会做什么要求。

然而,它可能不是你想要的。结果将是这种状态:

  B        <sharg
 / \
A---B'--C' <master
 \     /
  C --/    <coworker

其中C'并未真正包含C中的所有更改,但您无法再次合并它,因为您撒谎了git。那可以吗?