如何选择性地合并或从Git中的其他分支中选择更改?

我在一个新项目上使用git,该项目有两个平行但目前是实验开发分支:

  • master :导入现有的代码库以及一些我一般很确定的mods
  • exp1 :实验分支#1
  • exp2 :实验分支#2
  • exp1exp2代表两种完全不同的架构方法。 直到我得到更进一步,我无法知道哪一个(如果有)将工作。 当我在一个分支上取得进展时,我有时会编辑一些对其他分支有用的编辑,并且只想合并这些编辑。

    将一个发展部门的选择性变更合并到另一个部门的最佳方式是什么?

    我考虑过的方法:

  • git merge --no-commit然后手动暂停大量编辑,我不想在分支之间进行共同编辑。

  • 手动将常用文件复制到临时目录中,然后通过git checkout移动到另一个分支,然后将更多的手动拷贝出temp目录到工作树中。

  • 上述变化。 现在放弃exp分支并使用另外两个本地存储库进行实验。 这使得手动复制文件变得更直接。

  • 所有这三种方法似乎都很乏味且容易出错。 我希望有更好的方法; 类似于使git-merge更具选择性的过滤器路径参数。


    您使用cherry-pick命令从一个分支中获取单个提交。

    如果所需的更改不在单个提交中,则使用此处显示的方法将提交拆分为单独的提交。 粗略地说,你使用git rebase -i获取原始提交进行编辑,然后git reset HEAD^选择性还原更改,然后git commit提交将该位提交为历史记录中的新提交。

    在Red Hat杂志中有另一个很好的方法,在这里他们使用git add --patch或可能的git add --interactive ,如果你想将不同的改变分割成单个文件(search在该分页的页面中)。

    将这些变化分开后,您现在可以挑选出您想要的。


    我有上面提到的完全相同的问题。 但我在解释答案时发现更清楚。

    概要:

  • 检出您要合并的分支的路径,

    $ git checkout source_branch -- <paths>...
    
  • 或有选择地合并黑客

    $ git checkout -p source_branch -- <paths>...
    

    或者,使用重置,然后添加选项-p

    $ git reset <paths>...
    $ git add -p <paths>...
    
  • 最后提交

    $ git commit -m "'Merge' these changes"
    

  • 要有选择地将文件从一个分支合并到另一个分支,请运行

    git merge --no-ff --no-commit branchX
    

    其中branchX是您想要合并到当前分支中的分支。

    --no-commit选项将阶段化由Git合并的文件,而不实际提交它们。 这将使您有机会修改合并文件,然后自行提交。

    根据您想要如何合并文件,有四种情况:

    1)你想要一个真正的合并。

    在这种情况下,你接受合并文件的方式自动合并它们,然后提交它们。

    2)有些文件你不想合并。

    例如,您想要保留当前分支中的版本并忽略要合并的分支中的版本。

    要选择当前分支中的版本,请运行:

    git checkout HEAD file1
    

    这将检索的版本file1在当前分支,并覆盖file1通过Git的automerged。

    3)如果你想在branchX中的版本(而不是真正的合并)。

    跑:

    git checkout branchX file1
    

    这将检索branchXfile1版本并覆盖Git自动合并的file1

    4)最后一种情况是,如果只想选择file1特定合并。

    在这种情况下,您可以直接编辑已修改的file1 ,将其更新为任何您希望file1的版本变为,然后提交。

    如果Git无法自动合并文件,它会将文件报告为“未合并”并生成一个副本,您需要手动解决冲突。



    为了进一步解释一个例子,假设你想将branchX合并到当前分支中:

    git merge --no-ff --no-commit branchX
    

    然后运行git status命令查看修改文件的状态。

    例如:

    git status
    
    # On branch master
    # Changes to be committed:
    #
    #       modified:   file1
    #       modified:   file2
    #       modified:   file3
    # Unmerged paths:
    #   (use "git add/rm <file>..." as appropriate to mark resolution)
    #
    #       both modified:      file4
    #
    

    其中file1file2file3是git已成功自动合并的文件。

    这意味着所有这三个文件的masterbranchX中的更改已经组合在一起,没有任何冲突。

    您可以通过运行git diff --cached来检查合并是如何完成的;

    git diff --cached file1
    git diff --cached file2
    git diff --cached file3
    

    如果你发现一些合并不合需要,那么你可以

  • 直接编辑文件
  • 保存
  • git commit
  • 如果您不想合并file1并希望保留当前分支中的版本

    git checkout HEAD file1
    

    如果你不想合并file2并且只想要branchX的版本

    git checkout branchX file2
    

    如果你想file3自动合并,不要做任何事情。

    此时Git已经合并了它。


    上面的file4是Git发生的失败合并。 这意味着两条分支在同一条线上发生了变化。 这是您需要手动解决冲突的地方。 您可以通过直接编辑文件或运行您希望file4成为的分支中的版本的checkout命令来放弃合并。


    最后,不要忘记git commit

    链接地址: http://www.djcxy.com/p/7827.html

    上一篇: How to selectively merge or pick changes from another branch in Git?

    下一篇: ours does not remove files from unmerged files list