【问题标题】:Merging only selected changes in git仅合并 git 中选定的更改
【发布时间】:2016-03-29 16:16:37
【问题描述】:

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

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

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

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

如何使 git 对所有更改的文件产生冲突,以使我能够选择是否要接受更改?我需要一些交互方式。

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

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

【问题讨论】:

标签: git git-merge tortoisegit


【解决方案1】:

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

  • master 分支开始:

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

    $ git checkout --patch testbranch README
    

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

【讨论】:

    【解决方案2】:

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

    git merge --no-commit
    

    会这样做 - 文档说:

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

    它将按照要求进行。

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

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

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

    【讨论】:

    • 恐怕这意味着合并后需要进行大量手动更正和编辑。如果我想保留我的版本或同事,我更喜欢一种交互式决定每个更改的方法。重要的是更改是在同一个文件的行上进行的,而不是在不同的文件上。
    • 一旦您有未提交的更改,您可以使用git add -p 提示您保留每个大块的哪个版本(以及必要的行),或使用您喜欢的(可能是图形的)合并工具.
    • 实际上,这种方法确实做到了我所需要的。我已经将同事分支合并到我的没有提交 (--no-commit) 并使用 diff 与以前的版本。我得到了可以编辑当前工作树的更改。我根据需要进行了更改,然后提交并推送。非常感谢您的建议。
    【解决方案3】:

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

    git reset HEAD^
    git add --interactive
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 2011-09-29
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多