首页 > 解决方案 > 如何在不破坏树的情况下重新调整推树枝?

问题描述

我是唯一在存储库中工作的开发人员,因此破坏人们的流程没有问题。但是,当我在本地重新设置基准然后尝试将其推送到 Bitbucket 时,它会返回告诉我我需要提取最新的更改。我这样做了,rebase 完全毁了我干净的树。

有没有办法将 rebase 推送到服务器,而无需额外的“合并分支”提交作为其中的一部分?

谢谢!

标签: gitbitbucketatlassian-sourcetree

解决方案


Rebase 从根本上说是“复制一些提交,然后丢弃旧的提交以支持新的和据称改进的提交”操作。

例如,考虑这种情况:

...--A--B--E--F   <-- master
         \
          C--D--G   <-- feature (HEAD)

您已经完成了您的功能feature,但无论出于何种原因,您必须在工作时创建两个提交master。所以现在feature可以被重写。

没有提交永远不会改变,因此实际上不可能用新的和改进的变体替换,但我们可以使用临时分支或 Git 的“分离 HEAD”模式制作一个新的和改进 替换:CC'C

                C'  <-- HEAD
               /
...--A--B--E--F   <-- master
         \
          C--D--G   <-- feature

CommitC'确实提交了 commit 对 commit所做的F事情。旧的(现在很糟糕)作为其父级,而新改进的则作为其父级。所以现在我们需要复制到一个 new-and-improved ,然后对 再次执行相同的操作:CBCBC'FDD'G

                C'--D'--G'  <-- HEAD
               /
...--A--B--E--F   <-- master
         \
          C--D--G   <-- feature

我们现在准备好迎接git rebase的最后一招了。它将名称feature从提交中剥离出来Gfeature指向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 featureto point to commit G',你的 Git 会说:我认为,根据我的信息,你feature要提交的点G。如果是这样,请将其设置为指向G'。如果没有,请告诉我我犯了错误。

安全检查通常很好,但如果你是唯一一个将新提交放入 Bitbucket 存储库的人,那么它也是不必要的。


推荐阅读