我的情况是我有一个分支,我已经对构建过程(分支A)做了很大的改进,而在另一个分支我正在研究一个不相关的特性(分支B).所以,现在当我在分支B中进行攻击时,我想要提取我在分支A中编写的内容,因为我想要更快更容易的构建.但是,我不想"污染"我的分支B,只需将branchA中的更改添加到未分阶段的更改.
我尝试过的(当站在branchB上时):
git merge --no-commit branchA
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它会让你进入合并.如果没有,那将是完美的.
git checkout branchA -- .
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它在branchA..branchB之间应用更改而不是更改master..branchA.
还要别的吗?
编辑:是,提交分支A上的更改.在此示例中,只有一个分支具有构建改进,但是在处理功能分支时,可能最多有N个分支具有构建改进.
gui*_*fer 117
我只需要做类似的事情,并能够通过添加--squash
到merge命令来修复它
git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
Run Code Online (Sandbox Code Playgroud)
lea*_*ode 10
从 git 2.23 版本开始,您可以使用它git restore
来精确地达到所需的结果。
git restore
提供选项来指定通过和来“恢复”哪些文件。它还提供了一个选项来指定文件将通过 恢复到哪种状态,默认情况下是工作副本,可以接受任何 git 对象。--staged
--worktree
--source
因此,问题可以表述为“将工作树中的所有文件恢复到branchA中所有文件的状态”,并且可以通过以下方式实现所需的结果
git restore --source branchA --worktree .
Run Code Online (Sandbox Code Playgroud)
.
可以指定特定文件作为参数,而不是所有文件 ( )。
cherry-pick -n
应该做你想做的事,但我不确定你为什么要将构建改进作为非分阶段的更改 - 这只会使一些事情变得更难(例如将其他更改合并到修改后的文件中,或者重新定义任何内容).
在此示例中,只有一个分支具有构建改进,但是在处理功能分支时,可能最多有N个分支具有构建改进.
在这种情况下,我将创建一个新的分支C,您可以从A和B(以及任何其他具有构建改进的分支)合并.在功能分支B上提交更改,然后将它们合并到C分支,现在包含构建改进和功能分支更改,因此您可以一起测试它们.如果您需要进行更多更改,请在相应的分支中进行,而不是C,然后合并到C.因此,永远不要更改C分支中的任何内容,只需使用它来集成来自其他分支的更改.
这意味着您可以在分支C中使用Git的所有功能,而不是在脏树中处理未提交的更改.
我不是 100% 确定我清楚地理解它,但就我而言,我刚刚在分支之间创建了差异补丁,然后在 B 分支上应用了这个补丁。
A分行内:
git diff branchA..branchB > patch.diff
git apply patch.diff
Run Code Online (Sandbox Code Playgroud)
我不确定我是否理解您的要求。
您可以运行合并,然后调用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
Run Code Online (Sandbox Code Playgroud)