git - 如何在不使用交互式 git rebase 的情况下将两个 git 提交合并为一个提交?
问题描述
我正在开发一个也被其他团队使用的功能分支,他们有很多开发人员,所以从他们的末端发生了很多提交。我最后一次提交是在大约 10 天前,我计划今天再次提交,但我想确保从我的最后一次提交。
我知道我可以使用“git rebase -i HEAD~n”来实现这一点,但我不知道用什么数字代替 n,因为在这 10 天内有超过 20 次来自其他团队的提交。这个命令很好如果您有连续提交,但它不适合我的场景。
虽然我已经完成了 git 提交的哈希码,但除了 git 交互式 rebase 之外,还有什么方法可以将我的 git 哈希码之一用作“pick”,另一个用作“squash”。它将为我省去 20 多个 git 提交的麻烦。
解决方案
无需使用即可达到您想要的结果git rebase -i
。无论您是否使用该选项,都值得研究该方法,以便您真正了解它的作用。git rebase
-i
完全达到您想要的结果可能是不明智的,尽管只有您和您的同事才能真正确定这一点。
手动执行此操作的一种方法是git checkout
通过哈希 ID 进行特定提交,并创建一个指向此提交的新分支名称。您在此处选择的提交应该是有问题的两个提交之前的那个。
然后,您将要git cherry-pick -n
压缩的两个提交合并为一个新提交,并用于git commit
提交结果。
现在您面临另外使用git cherry-pick
将每个后续提交复制到新分支的问题。这并不是那么困难——事实上,只要给定正确的哈希 ID,它就应该自动进行。您只需要找到正确的哈希 ID。
完成后,您需要说服您的同事放弃现有的功能分支并使用您重新构建的新功能分支。这个新分支具有原始提交的副本,但它们是新的和改进的,因为它们是基于您对原始两个提交的压缩替换而构建的。
如果这听起来有点令人费解,那么它和你会做的一样——git rebase -i
除了当你用git rebase -i
. ,这有点令人困惑!feature/foo
feature/foo
要做到这一点git rebase -i
而不必计算提交(如HEAD~20
),请使用:
git log --decorate --oneline --graph
好好看看你打算变基的提交。您将获得带有缩写哈希 ID 及其提交主题的提交的单行列表,以及提交图的 ASCII 图形。确保它在您将复制的提交中没有分支和合并模式(或者如果有,则丢弃所有合并也没关系)——在这种情况下,这意味着它只是*
之前的一系列标记您打算复制和替换的提交。然后,而不是count,使用:
git rebase -i <hash>
其中是您不会复制或修改hash
的第一次提交。
请注意,像这样的变基的最终结果是一系列新的提交,即使您使用旧的分支名称来识别它。这就是为什么这通常是一个坏主意:您将丢弃和替换的不仅仅是您的提交,还有其他人正在使用并且现在仍在进行的其他提交。所以他们也必须切换到你对他们的提交所做的这些新副本。
推荐阅读
- arduino - 带有 AsyncWebServer(ds18b20 传感器)的 NodeMCU 板上出现错误
- square - 创建发票后更新 Square Order 时出错
- ios - MarqueeLabel Swift - 使用情节提要的错误
- reactjs - AWS Amplify 前端构建在主分支上失败,但在功能分支上成功构建
- python - 在 Jupyter 中运行第一个 Pyspark 程序时出错
- javascript - 每当在Angular中更改要发布的元素时如何刷新对api的发布请求
- java - LinearLayout 的函数 onTouch() 不起作用
- javascript - sequelize如何选择?
- r - R循环遍历函数参数以将变量添加到数据框
- android - Android 系统在深色模式下会覆盖亮色。Xamarin.Forms