Git-如何有选择地将更改从一个分支应用到另一个分支?

Git-如何有选择地将更改从一个分支应用到另一个分支?,git,github,workflow,git-merge,kdiff3,Git,Github,Workflow,Git Merge,Kdiff3,是否可以使用Git选择性地将更改从一个分支应用到另一个分支 更具体地说,我使用公共dev分支进行GitHub部署,使用私有master分支进行部署。当对一个分支进行更改时,它们需要应用于另一个分支,但某些代码行需要保持不同。在我的例子中,它是一些css类和一个提要 我是Git新手,但我已经做了研究: git-merge--no-commit--no-ff后面可以跟一个git-mergetool来选择发生冲突时需要的内容。问题是,它只适用于Git无法自动合并的冲突,所以在我有机会使用merget

是否可以使用Git选择性地将更改从一个分支应用到另一个分支

更具体地说,我使用公共
dev
分支进行GitHub部署,使用私有
master
分支进行部署。当对一个分支进行更改时,它们需要应用于另一个分支,但某些代码行需要保持不同。在我的例子中,它是一些css类和一个提要

我是Git新手,但我已经做了研究:

  • git-merge--no-commit--no-ff
    后面可以跟一个
    git-mergetool
    来选择发生冲突时需要的内容。问题是,它只适用于Git无法自动合并的冲突,所以在我有机会使用mergetool之前,我想要保持不同的东西会被替换掉

  • git difftool--cached
    很有用,因为它允许我查看差异,但我需要复制我想要保留的内容,并手动将其替换为文本编辑器,因为我不能像使用mergetool那样简单地选择和保存

  • git cherry pick
    似乎将指定的提交应用于另一个提交,但我希望保持不同的内容可能分散到不同的提交中,这些提交可能不仅包括我希望保持不同的内容。除非我做出数以百万计让我发疯的承诺,否则我看不到这一点起作用

同样要明确的是,我不希望一个分支变成另一个分支,合并似乎就是这样我想要两个独立的分支,它们各自有不同之处,并将更改从一个分支应用到另一个分支。


有没有更好的工作流程可以让我通过应用开发和部署版本的更改并保留一些差异来保持它们的开发和部署版本?我不介意使用单独的存储库或不同的工具来解决问题。

我认为没有办法从同一个文件中选择提交的部分。我想说的是,您需要简单地重新考虑您的代码,以便在不同的文件中移动这些部分


顺便说一句,如果您想从提交中获取一些文件,您可以使用cherry pick并结合其他命令,如前所述。

我还了解了修补程序:

要创建修补程序:
git diff dev>master.patch


要应用它:
patch

利用这样一个事实,即创建git分支成本低,并且不需要对工作目录的实际内容产生影响

  • 查看您的源分支
    dev
  • 创建一个临时分支。它将指向与
    dev
    相同的提交:
    checkout-b for_master

    大概,您知道(或者可以很容易地找到)在
    dev
    分支之前的提交是您(部分)想要的更改之前的最后一个。在本例中,假设该提交具有散列
    1457B4
    (“last before”,明白吗?)

  • 将您的
    for_master
    分支重置为该提交:
    git Reset 1457B4
    。(请勿使用
    --hard
    开关!)

    现在,您有了一个工作目录,其中包含
    dev
    中的所有更改,但是从
    for_master
    分支的POV来看,这些更改是未分级和未提交的(而
    dev
    分支仍然指向记录所有更改的提交,因此工作仍然是安全的)

  • 使用交互式暂存(
    git add-p
    和/或
    git add-e
    ),创建一个提交(或多个,如果愿意),其中包含要应用于
    master
    分支的所有更改,并且

    记下上次提交的哈希值(或给它一个标记)。在本例中,我将说它的散列是
    C0DA

  • 签出
    master

  • Cherry pick您刚刚做出的承诺:
    git Cherry pick 1457B4..C0DA

    (请注意,cherry pick范围仅在git版本1.7.2之后可用。否则,您需要单独cherry pick步骤4中所做的所有提交。)

    请注意,当您选择一个范围时,该范围的开始是实际选择的第一个范围之前的提交。)

  • 这个过程与所选答案中提到的使用
    git checkout-p
    相反。它可能有助于在两个分支之间创建
    cherry pick
    --able提交,这两个分支共享一些代码,但也有很多差异(例如,项目的两个主要版本之间),并且您不希望在调用
    git checkout-p
    时花费大量时间忽略不相关的文件


    就个人而言,我发现为同一存储库使用两个不同的工作树目录(一个用于源分支,一个用于目标)并在两个命令shell之间切换非常方便,一个使用源分支目录(工作树),另一个使用目标。但是,如果您不习惯使用git worktree
    功能,这可能不适合您。

    因此,本质上,您有时可能只需要提交的一部分,可能是从单个文件中的一些行到提交中的多个文件中的几个行?合并时,我需要保持几行不同的代码,例如,分支中的白色背景和另一分支中的黑色背景。同一个文件中可能有其他更改,我希望合并,因此文件排除不会解决所有情况。可能重复执行
    git checkout-p branchname
    ,如链接中所述,完成了此操作!这允许我以交互方式从另一个分支获取选择性更改,而无需合并。Cherry pick也可以工作,但只能在每次提交时进行更改。:/显然有一种方法-它可能并不容易。谢谢-投票支持!但是有一点需要注意,因为我的
    git
    是配置的