将分支b中的更改应用于a,而不合并或添加提交

时间:2013-11-18 10:52:03

标签: git merge branch

我的情况是我有一个分支,我已经对构建过程(分支A)做了很大的改进,而在另一个分支我正在研究一个不相关的特性(分支B)。所以,现在当我在分支B中进行攻击时,我想要提取我在分支A中编写的内容,因为我想要更快更容易的构建。但是,我不想“污染”我的分支B,只需将branchA中的更改添加到未分阶段的更改。

我尝试过的(当站在branchB上时):

git merge --no-commit branchA

不起作用,因为它会让你进入合并。如果没有,那将是完美的。

git checkout branchA -- .

不起作用,因为它在branchA..branchB之间应用更改而不是更改master..branchA。

还有别的吗?

编辑:是,提交分支A上的更改。在此示例中,只有一个分支具有构建改进,但是在处理功能分支时,可能最多有N个分支具有构建改进。

6 个答案:

答案 0 :(得分:97)

我只需做类似的事情就可以通过将--squash添加到合并命令来修复它

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

答案 1 :(得分:8)

cherry-pick -n应该做你想做的事,但我不确定你为什么要将构建改进作为非分阶段的更改 - 这只会使一些事情变得更难(例如将其他更改合并到修改后的文件中,或者重新定义任何东西)

  

在此示例中,只有一个分支具有构建改进,但在处理功能分支时,可能最多有N个分支具有构建改进功能。

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

这意味着您可以在分支C中使用Git的所有功能,而不是在脏树中处理未提交的更改。

答案 2 :(得分:6)

你应该能够挑选提交(使用-n以避免立即提交)。

答案 3 :(得分:3)

我不确定我理解你的要求。

您可以运行合并,然后拨打git reset HEAD~1


以下序列应重播master之上branchAbranchB之间的每次提交。将跳过已在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

答案 4 :(得分:3)

我不确定自己是否100%清楚地理解它,但是就我而言,我只是在分支之间创建了diff补丁,然后将此路径应用于B分支。

内部分支A:

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

答案 5 :(得分:2)

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

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

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

实现所需的结果
git restore --source branchA --worktree .

可以将特定文件作为参数而不是所有文件 (.)。