git - 如何在不破坏树的情况下重新调整推树枝?
问题描述
我是唯一在存储库中工作的开发人员,因此破坏人们的流程没有问题。但是,当我在本地重新设置基准然后尝试将其推送到 Bitbucket 时,它会返回告诉我我需要提取最新的更改。我这样做了,rebase 完全毁了我干净的树。
有没有办法将 rebase 推送到服务器,而无需额外的“合并分支”提交作为其中的一部分?
谢谢!
解决方案
Rebase 从根本上说是“复制一些提交,然后丢弃旧的提交以支持新的和据称改进的提交”操作。
例如,考虑这种情况:
...--A--B--E--F <-- master
\
C--D--G <-- feature (HEAD)
您已经完成了您的功能feature
,但无论出于何种原因,您必须在工作时创建两个提交master
。所以现在feature
可以被重写。
没有提交永远不会改变,因此实际上不可能用新的和改进的变体替换,但我们可以使用临时分支或 Git 的“分离 HEAD”模式制作一个新的和改进的 替换:C
C'
C
C' <-- HEAD
/
...--A--B--E--F <-- master
\
C--D--G <-- feature
CommitC'
确实提交了 commit 对 commit所做的F
事情。旧的(现在很糟糕)作为其父级,而新改进的则作为其父级。所以现在我们需要复制到一个 new-and-improved ,然后对 再次执行相同的操作:C
B
C
B
C'
F
D
D'
G
C'--D'--G' <-- HEAD
/
...--A--B--E--F <-- master
\
C--D--G <-- feature
我们现在准备好迎接git rebase
的最后一招了。它将名称feature
从提交中剥离出来G
并feature
指向G'
:
C'--D'--G' <-- feature (HEAD)
/
...--A--B--E--F <-- master
\
C--D--G [abandoned]
由于我们甚至看不到被放弃的提交,因此在您笔记本电脑的本地存储库中,历史似乎一直是这样的:您C'
基于编写提交F
,等等。哈希 ID 看起来是随机的;没有人,但你会知道这一切。
只是……你对 Bitbucket 做了一个git push
提交C-D-G
,或者至少是其中的一些。 他们有你的旧的和糟糕的提交,由他们的分支名称指向feature
。你向他们发送你闪亮的新功能——<code>git push origin 功能——最后,你的 Git 礼貌地要求他们将他们的 feature
名字移到 commitG'
而不是G
.
当然,这会导致他们放弃承诺G
,转而支持新的和改进的G'
. 这就是你希望他们做的事情。但他们会说:不,如果我这样做,我将失去我宝贵的承诺G
!
你所要做的就是告诉他们——或者让你的 Git 告诉他们——<em>是的,我知道你可能会丢失一些提交,但无论如何都要这样做!也就是说,你让你的 Git 向他们发送一个强有力的命令,而不是一个礼貌的请求。
您执行此操作的方式是将--force
或添加--force-with-lease
到您的git push
命令中。这变成了礼貌的请求,如果可以,请设置您feature
的命令:设置您的功能!
--force
和之间的区别在于--force-with-lease
后者首先添加了安全检查。而不是仅仅说Set your name feature
to point to commit G'
!,你的 Git 会说:我认为,根据我的信息,你feature
要提交的点G
。如果是这样,请将其设置为指向G'
。如果没有,请告诉我我犯了错误。
安全检查通常很好,但如果你是唯一一个将新提交放入 Bitbucket 存储库的人,那么它也是不必要的。
推荐阅读
- jquery - Bootstrap 下拉菜单未在 Spring Boot Thymeleaf Gradle 中打开
- python - Tkinter .get 方法查询
- java - 如何在多级继承中从另一个派生类访问派生类的字段
- python - 具有依赖关系的 crontab python 脚本错误
- mysql - MySQL LOAD DATA LOCAL INFILE - 100 万条记录 - 双引号附加到每个记录
- vba - VBA - 将文件上传到共享点文档库停止工作
- java - 错误:无法弄清楚如何将此字段保存到数据库中。您可以考虑为其添加类型转换器。安卓工作室 Java
- java - 为什么 java.time.ZoneId 没有实现 Comparable 接口?
- android - 为什么Android ImageView 中的图像在中间显示为一个点?
- java - 带有 Panache 的 Quarkus 出现休眠错误 HHH000183