我的情况是我有一个分支,我已经对构建过程(分支A)做了很大的改进,而在另一个分支我正在研究一个不相关的特性(分支B)。所以,现在当我在分支B中进行攻击时,我想要提取我在分支A中编写的内容,因为我想要更快更容易的构建。但是,我不想“污染”我的分支B,只需将branchA中的更改添加到未分阶段的更改。
我尝试过的(当站在branchB上时):
git merge --no-commit branchA
不起作用,因为它会让你进入合并。如果没有,那将是完美的。
git checkout branchA -- .
不起作用,因为它在branchA..branchB之间应用更改而不是更改master..branchA。
还有别的吗?
编辑:是,提交分支A上的更改。在此示例中,只有一个分支具有构建改进,但是在处理功能分支时,可能最多有N个分支具有构建改进。
答案 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
之上branchA
和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
答案 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 .
可以将特定文件作为参数而不是所有文件 (.
)。