仅合并 git 中选定的更改

Merging only selected changes in git

我提交了一个文本文件并将其推送到主分支。 我的同事从 master 分支创建了一个单独的分支,并对文件进行了一些更改——他对文本进行了修改。更改是在单个提交和单个文件中进行的。

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

修改是在同一个文件的不同行上进行的:修改了一些行,添加了一些行,在修订版中删除了一些行。 我怎样才能做到这一点?

如果我对 git 的理解正确,将修订分支简单合并到主分支将不会检测到冲突,因为我没有在主分支中进行任何更改。 此外,合并只会应用 branch/commit 中所做的所有更改。但是,我只想应用在线(假设)#20、50、69 所做的更改。我想忽略其他更改,因为我不同意它们。

如何使 git 在所有更改的文件上产生冲突,使我能够 select 如果我想接受更改?我需要一些互动方式。

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

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

How to make git ... enable me to select if I want to accept the change?

git merge --no-commit

会这样做 - 文档说:

... perform the merge but pretend the merge failed and do not autocommit, to give the user a chance to inspect and further tweak the merge result before committing.

这将执行要求的操作。

但是,这可能不是您想要的。结果将是这样的状态:

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

其中 C' 并没有真正包含 C 中的所有更改,但是你不能再次合并它,因为你对 git 撒了谎。可以吗?

这是对我有用的东西;假设您要导入的更改在 testbranch 分支上(并假设您要操作的文件是 README):

  • master 分支开始:

    $ git checkout master
    
  • 使用 --patch 参数 git checkout 引入更改 来自另一个分支:

    $ git checkout --patch testbranch README
    

    这将调出与 git add -p 相同的界面,它将 让您有选择地接受或跳过块。

假设我们谈论的是单个提交,您需要获取已提交的提交,取消提交,然后使用交互式暂存来有选择地选择要接受的更改。因此,首先继续并合并他们的更改。那么...

git reset HEAD^
git add --interactive

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

现在将向您介绍 git 可以找到的每个 "hunk" 更改。键入 "h" 以查看命令列表。 "y" 表示您接受更改,"n" 表示您不接受更改。如果一大块更改太大,您可以尝试使用 "s" 命令将其分成更小的块 - 虽然它只能做这么多。

浏览完所有文件后,您将返回菜单系统。输入 "q" 并按回车键。使用 git status 检查已上演的内容。

现在您可以继续并提交更改,因为您知道只会包含您接受的部分。