我的合并请求没有得到维护者的批准,因为我的分支包含多个提交。如果我没有在Gitlab上选中“Merge commits when approved”复选框(我选中了),这是合理的,但他们不会听。我不想在本地压缩,因为我想保留历史记录,而不是被迫使用reflog,以防我需要返回一些提交 我能先压扁,再推,然后再不压扁吗?
git checkout your-feature-branch
git rebase -i HEAD~<number-of-commits-to-squash>
# Change pick to squash in the editor window that opens, save it and close it.
字符串 1.将压缩的提交推送到远程。
git push --force
# git push origin +<branch_name>
型 1.如果我需要取消压缩提交, a.在压缩的提交之前找到提交哈希。
git log --oneline
型 B. checkout 该提交上的新分支
git checkout -b new-branch <commit-hash>
型 c.挑选压缩提交到新分支
git cherry-pick <squashed-commit-hash>
型 d.执行一个rebase(最好是交互式的)来拆分压缩的提交
git rebase -i HEAD~2
# change from pick to edit for the squashed commit.
git checkout your-branch
git branch branch-unsquashed
git reset --soft "$parent_commit_of_your_branch"
git commit -m 'Whatever your commit message'
git push origin +your-branch # force-push is required, you have changed the history
4条答案
按热度按时间qnakjoqk1#
这听起来最终像是一个 * 社会 * 问题,而不是一个 * 技术 * 问题,因为你有两个相互冲突的要求:
在git中没有一个工具可以给予你俩想要的东西。你可能需要遵守维护者的政策,即使你不同意它。
然而,正如其他人所指出的,没有什么可以阻止你保留一个本地分支和原始的一系列提交。在压缩提交和强制推送原始分支之前,只需运行
git branch some-name-for-backup-branch
。只要记住 * 这个分支永远不能与上游合并 *,因为它会试图在压缩的版本中重新引入更改;它只作为历史参考有用。
既然你提到了在reflog中查找提交,那么值得注意的是,你可以创建一个备份分支。一旦你找到一个提交哈希,只要它没有被垃圾收集,你就可以运行
git branch branch-name hash
来创建一个指向那个提交的分支,例如git branch before-i-squashed abc123def0
cgyqldqp2#
应用KISS原则,我会将原始的本地分支与生成的squash提交合并,并将其保持在本地.
5anewei63#
我会分享我的方法来解决你的问题。
1.我会使用交互式rebase压缩我的提交(我使用VSCode,因为它提供了一个很好的体验,但你可以选择其他编辑器的选择)
字符串
1.将压缩的提交推送到远程。
型
1.如果我需要取消压缩提交,
a.在压缩的提交之前找到提交哈希。
型
B. checkout 该提交上的新分支
型
c.挑选压缩提交到新分支
型
d.执行一个rebase(最好是交互式的)来拆分压缩的提交
型
e.完成上述步骤后,我将在压缩提交时处于分离状态。然后我将简单地重置它:
型
f.最后,我可以根据需要在单独的提交中重新提交更改。
z18hc3ub4#
最简单的方法可能是在压缩之前创建一个新的分支。这会将未压缩的提交保留在另一个分支中。当然,一旦创建了分支,分支之间就独立了,你必须手动同步它们之间的更改。
字符串