我想通过 PR 审查有选择地将多个提交从一个分支提升到另一个分支。
想象一下我的分支上有master以下提交:
8b08096 - mod4
97eff67 - mod3
b64891f - mod2
fa6e804 - mod1
956e388 - initial
Run Code Online (Sandbox Code Playgroud)
在我的staging分支上我只有以下内容:
956e388 - initial
Run Code Online (Sandbox Code Playgroud)
mod1我现在想将, mod2& mod3from 的提交“推广”master到staging分支。因此,从staging我创建一个新的临时分支并合并提交开始,直到mod3:
git checkout staging
git checkout -b promote
git merge 97eff67
Run Code Online (Sandbox Code Playgroud)
现在执行会git log向我显示所有提交,包括mod3我的promote分支上的提交:
git log --pretty=oneline
97eff67 (HEAD -> promote) mod3
b64891f mod2
fa6e804 mod1
956e388 (origin/staging, staging) initial
git push origin promote …Run Code Online (Sandbox Code Playgroud) 我使用 git-flow 并根据 Github 保护规则我有分支master和develop受保护,两者都带有选项Require linear history。
一切正常,但现在我想不只是从develop到合并master,而是开始使用“拉取请求”( develop -- PR --> master) 我想知道是否可以在保持历史线性的同时保持分支均匀/同步,而不需要对develop树枝施加力。
目前,如果我PR从developto创建一个拉取请求master,并且因为Require linear history选中了该选项,我无法合并,但只是squash and merge因为rebase and merge这样,如果我修改develop分支并进行另一次提交,它会提前 N 倍,但永远不会是“偶数” 。
我发现报复的唯一develop方法master就是
git pull origin master --rebase
Run Code Online (Sandbox Code Playgroud)
但这随后意味着强制推动:
git push -f
Run Code Online (Sandbox Code Playgroud)
不使用时PR,我只需将开发合并到master(FastForward)并保持历史线性,我可以合并拉取请求并通过禁用来防止强制推送Require linear history,但历史不会是线性的。(我认为 PR 没有使用 FastForward 合并)
我使用 git-flow 的原因是该develop …
所有推送到develop分支的提交都表明它们已经过验证。
为了合并从develop到的所有内容master,我决定单击一个按钮Rebase and merge。(我不想为 master 创建另一个新提交。)
令人惊讶的是,合并成功后,所有经过验证的签名都从 master 上消失了。
我发现自己,作为工作流程的一部分,经常这样做:
topic)topic以便将其合并topicmainCI同时合并更改(在 GitHub 上,这意味着在我的情况下进行合并提交 - GitHub 显然不会在这里进行快进合并;请参阅此答案)main我一直在进行的更改的更新main相同,但是topicgit抱怨我的本地更改将被覆盖,因为我在本地修改了一些与上次提交相同的文件,所以我必须:git stashgit checkout maingit fetch; git merge origin/maingit stash pop我知道git命令有很多选项。有没有一种方法可以一步完成上述四步过程,或者更少的步骤(无需编写脚本)?合并总是干净利落地应用,因为origin/main和 的topic内容相同(但git历史不同)。
这个悬而未决的问题表明也许整个序列可以被替换为git checkout -m。那是对的吗?