应用从分支 A 到分支 B 的更改,而不需要合并或添加提交

我的场景是,我有一个分支,在这个分支中,我对构建过程(分支 A)做了很大的改进,而在另一个分支中,我正在处理一个不相关的特性(分支 B)。所以现在,当我在 B 分支中编写代码时,我想要引入我在 A 分支中编写的内容,因为我想要更快、更容易的构建。但是,我不想“污染”我的分支 B,只是添加从分支 A 到非阶段性更改的更改。

我试过的(站在树枝上) :

git merge --no-commit branchA

不管用是因为这会让你进入合并,如果不管用,那就太完美了。

git checkout branchA -- .

Doesn't work because it applies changes between branchA..branchB and not the changes master..branchA.

还有别的事吗?

编辑: 是的,提交了分支 A 上的更改。在这个示例中,只有一个分支进行了构建改进,但是可能有多达 N 个分支进行了构建改进,我希望在处理特性分支时应用这些改进。

43477 次浏览

您应该能够优先选择提交(使用 -n以避免立即提交)。

我不太明白你的要求。

可以运行合并,然后调用 git reset HEAD~1


下面的序列应该重播 masterbranchA之间在 branchB上的每次提交。将跳过已经应用于 branchB的提交。

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip


# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB


# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip

cherry-pick -n应该可以做你想做的事情,但是我不确定你为什么要把构建改进作为非阶段性的改变——这只会让一些事情变得更加困难(比如合并其他修改到修改过的文件,或者重新设置任何东西的基础)。

在这个示例中,只有一个分支进行了构建改进,但是可能有多达 N 个分支进行了构建改进,我希望在处理特性分支时应用这些改进。

在这种情况下,我将创建一个新的分支 C,您可以将它与 A 和 B (以及任何其他具有构建改进的分支)合并。提交对特性分支 B 的更改,然后将它们合并到 C 分支,C 分支现在包含构建改进和特性分支更改,因此您可以将它们一起测试。如果您需要在适当的分支(而不是 C)中进行更多的更改,那么将其合并到 C。因此,永远不要更改 C 分支中的任何内容,只需使用它来集成来自其他分支的更改。

That means you can use all the features of Git in branch C, instead of juggling uncommitted changes in a dirty tree.

我只是必须做一些类似的事情,并能够通过将 --squash添加到 merge 命令来修复它

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes

我不能100% 确定我理解得很清楚,但是在我的例子中,我只是在分支之间创建了 diff 补丁,然后在 B 分支上应用了这个补丁。

内分行 A:

 git diff branchA..branchB > patch.diff
git apply patch.diff

从 git 版本2.23开始,您可以使用 git restore来精确地获得所需的结果。

git restore提供了指定 哪个文件将通过 --staged--worktree“恢复”的选项。它还提供了一个指定 到哪里状态的选项,这些文件将通过 --source恢复,这是默认的工作副本,可以接受任何 git 对象。

因此,这个问题可以表述为“将工作树中的所有文件恢复到分支 A 中所有文件的状态”,并且可以通过

git restore --source branchA --worktree .

特定的文件可以作为参数给出,而不是所有的文件(.)。