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

tou*_*anb 13 git workflow github git-merge kdiff3

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

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

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

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

  • git difftool --cached 是有用的,因为它可以让我看到差异,但我需要复制我想要保留的内容并手动用文本编辑器替换它,因为我不能简单地选择和保存,就像我可以使用mergetool.

  • git cherry-pick似乎将指定的提交应用于另一个,但我希望保持不同的可能会分散到不同的提交,这些提交可能不仅包括我想要保持不同的内容.我不能看到这个工作,除非我做了数百万的提交会让我发疯.

另外要明确的是,我不希望一个分支成为另一个分支,合并的情况似乎如此.我想要两个独立的分支,各自的差异,并将变化从一个分支应用到另一个分支.

是否有更好的工作流程可以让我通过应用他们的更改并保持一些差异来保留开发和部署版本?我不介意使用单独的存储库或不同的工具,如果它导致解决方案.

tou*_*anb 12

我也发现了关于修补的问题:

要创建补丁: git diff dev > master.patch

申请: patch < master.patch

  • 谢谢你——投了赞成票!但需要注意的是,因为我的 `git` 配置为将废弃的虚拟目录名称 `a/` 和 `b/` 放入我的 diff 中,所以第二个命令对我来说略有不同:`patch -p1 &lt; master.patch ` (3认同)

Wil*_*n F 5

利用这样一个事实:创建 git 分支很便宜,并且不需要对工作目录的实际内容产生影响。

  1. 检查你的源分支dev
  2. 创建一个临时分支。它将指向dev执行以下操作的相同提交:checkout -b for_master

    据推测,您知道(或可以轻松找出)分支之前的哪个提交是您(部分)想要的更改之前的dev最后一个提交。在此示例中,假设该提交具有哈希值(“最后一个”,明白了吗?)。1457B4

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

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

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

    记下最后一次提交的哈希值(或给它一个标签)。在这个例子中,我会说它的哈希值是C0DA.

  5. 查看master

  6. 精挑细选您刚刚所做的提交:git cherry-pick 1457B4..C0DA

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

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

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

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


Nik*_*pta 4

我认为没有办法从同一文件中选择提交的一部分。我想说你需要简单地重构你的代码以将这些部分移动到不同的文件中。

顺便说一句,如果您想从提交中获取一些文件,您可以将cherry-pick 与其他命令的组合结合使用,如此处所述

  • 按照链接中的说明执行“git checkout -pbranchname”就可以了!这使我能够以交互方式从其他分支获取选择性更改,而无需合并。Cherry-pick 也可以工作,但只能在每次提交时获得更改。 (5认同)