仅合并 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
检查已上演的内容。
现在您可以继续并提交更改,因为您知道只会包含您接受的部分。
我提交了一个文本文件并将其推送到主分支。 我的同事从 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
检查已上演的内容。
现在您可以继续并提交更改,因为您知道只会包含您接受的部分。