我有一个文本文件已提交并推送到主分支。 我的同事从主分支机构做了一个单独的分支,并对文件进行了一些更改 - 他对文本进行了修改。更改在单个提交和单个文件中进行。
现在,我想将他的一些更改合并到主分支中的原始文件。但!我不想接受所有的一切,只是一些改变。
对同一文件的各行进行了更改:更改了一些行,添加了一些行,修订版中删除了一些行。 我怎样才能做到这一点?
如果我正确理解git,简单地将版本分支合并到master将不会检测到冲突,因为我在master分支中没有进行任何更改。 此外,合并将仅应用分支/提交中所做的所有更改。但是,我想只应用在线更改(让我们说#20,50,69)。我想忽略其他更改,因为我不同意它们。
如何让git在所有已更改的文件上出现冲突,以便我选择是否要接受更改?我需要一些互动的方式。
例如,在MS Word中,可以跟踪更改。然后,可以接受每个更改(采用新版本并删除旧版本)或拒绝(保留旧版本并丢弃更改)。然后,不再突出显示更改。
我在MS Windows 10上使用TortoiseGit应用程序,在git版本1.9.5.msysgit.1上运行。因此,如果有使用客户端的方式我会更喜欢它。
答案 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。那可以吗?