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


85

我的情况是,我有一个分支,对构建过程进行了重大改进(分支A),而在另一个分支中,我正在开发一个不相关的功能(分支B)。因此,现在当我在分支B处破解时,我想提取在分支A中编写的内容,因为我想要更快,更轻松的构建。但是,我不想“污染”分支B,只需将分支A的更改添加到未暂存的更改即可。

我已经尝试过的内容(当站在branchB上时):

git merge --no-commit branchA

不起作用,因为它会使您陷入合并。如果没有,那将是完美的。

git checkout branchA -- .

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

还要别的吗?

编辑:是的,分支A上的更改已提交。在此示例中,只有一个分支具有构建改进,但是在功能分支上,我可能要应用多达N个分支进行构建改进。


A上的更改是否已提交?
Theolodis

Answers:


152

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

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

3
这还应该说明其功能。它会将变化的差异从branchA转移到您当前的分支中
KareemElashmawy

可以说我只是将代码从branchA合并到master中,但是我忘记了一些东西,想在此合并提交中添加一些其他代码/更改,而不会在git历史中显示为另一个合并提交。这种方法行得通吗?
Sushmit Sagar

@Sushmit我想您可以做一个git commit —amend,它将新的更改附加到上一次提交中,我不确定是否可以在合并提交中使用
guilffer

1
我认为-这里不需要提交吗?应该是默认值。
皮特

11

cherry-pick -n 应该执行您想要的操作,但是我不确定为什么您希望将构建改进作为未进行阶段的更改-这只会使某些事情变得更加困难(例如,将其他更改合并到修改后的文件中,或重新部署任何内容)。

在此示例中,只有一个分支具有构建改进,但是在功能分支上,我可能要应用多达N个分支进行构建改进。

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

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


UseCase的用途cherry-pick -n:我通过向随机位置添加很多内容来创建代码的工作副本。现在,我想在提交此功能的分支之前清理代码。因此,我切换到临时分支,提交所有更改。回到功能分支,cherry-pick即提交。有更好的方法吗?
Tejas Kale


5

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

内部分支A:

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

4

我不确定我是否理解您的要求。

您可以运行合并,然后调用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

那会将文件添加到git的暂存区中,这是我不想要的。另外,只有当所有分支都从master分支上的同一提交分支出来时,它似乎才能很好地工作。否则,将引入不在master..branchA范围内的差异。
比昂·林德奎斯特(BjörnLindqvist)

@BjörnLindqvist:--soft如果您不希望在暂存区域中进行更改,请删除该选项。你能画出分支机构如何建立的图吗?
LeGEC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.