gpt4 book ai didi

git - 为什么我的 "git rebase master"在最后一次 merge 后返回的提交比 "normal"多?

转载 作者:行者123 更新时间:2023-12-03 20:27:51 26 4
gpt4 key购买 nike

我试图理解我做错了什么,但什么也没有。我完全糊涂了。
我知道 merge 分支(或提交)的另一种方法是使用“git rebase”。
我有 3 个分支:master 和另外 2 个用于不同功能的分支。我们来谈谈master,f1和f2。
我正在处理我的 f1,我需要另一个功能,所以我创建了 f2。
当我完成 f1 时,master 已经有另一个变化。我想在 master 上 rebase f1。我做到了,我看到了 144 个步骤。我尝试修复所有提交并推送更改。现在我将我的 f2 提交应用到 f​​1 并决定向 master 发出 pull 请求。我尝试在 master 上重新设置 f1,我得到了 244 步。或者它只是对 master 的 4 个新提交。我已经在我本地的主人身上得到了它们。

我感到很困惑。每次我想使用 rebase 时,似乎我都会得到更多真正完成提交的步骤。

我必须说一开始我只是用“git merge”做 merge ,但我被要求用“git rebase”来做。

我尝试搜索为什么我的步骤太多,我再次遵循教程,但我无法再次尝试修复超过 200 个步骤。很无聊,需要时间。
你能解释我更多并帮助解决这种情况吗?
我不想现在解决这个问题,然后再得到 300 多个。
谢谢

最佳答案

你对 rebase 的作用有严重的误解,我相信这就是造成这种非常令人沮丧的情况的原因。

可能发生了什么

假设您有以下情况(我相信这就是您所描述的)。

master  o---o---o---o---o---o
\
feature1 A---B---C
\
feature2 X---Y---Z

您已完成 feature1 上的工作,但是在 master 上有一些提交没有用 feature1 测试过。变化。所以,更新 feature1您执行以下操作:
  • git checkout feature1
  • git rebase master

  • 这导致以下情况:
    master  o---o---o---o---o---o
    \ \
    feature1 \ A'---B'---C'
    \
    feature2 A---B---C---X---Y---Z

    等等,什么?为什么会有两份 A-B-C !?

    就是这样 rebase做。 Rebase从命令中给出的基数开始进行 NEW 提交(在这种情况下为 master)。

    接下来可能发生了什么

    现在, feature1已更新为最新的 master ,您需要更新 feature2 .因此,您遵循相同的过程:
  • git checkout feature2
  • git rebase feature1

  • 这导致以下情况:
    master  o---o---o---o---o---o
    \
    feature1 A'---B'---C'
    \
    feature2 A"---B"---C"---X---Y---Z

    哦哦。

    正如您所看到的,经过几次此循环后,您最终会陷入非常糟糕的境地,您必须解决“冲突”,这些“冲突”只是一遍又一遍地应用相同的更改。

    如何解决当前的烂摊子

    硬着头皮使用 merge .说真的,这是处理它的最快方法。从 master 更新功能分支与 git merge master然后 merge功能分支回主(在适当的时候)。

    或者,您可以深入研究交互式 rebase 的黑暗魔法。使用 -i运行时的标志 git rebase您将看到它尝试重新应用的所有提交的列表。删除重复项并继续您的快乐方式。我不喜欢这种方法,因为它很容易犯错误,而且从这些错误中恢复是一种 PIA。

    如何避免这种情况发生

    Detailed article

    简而言之,您需要告诉 git 忽略重复的提交。更新中 feature1使用 rebase很好,问题发生在 feature2 .
  • git checkout feature2
  • git rebase --onto feature1 feature1@{1} feature2

  • 这让我们
    master  o---o---o---o---o---o
    \
    feature1 A'---B'---C'
    \
    feature2 X'---Y'---Z'

    正是我们想要的!

    那么,这个命令是做什么的呢?
    git rebase --onto feature1 feature1@{1} feature2
  • --onto feature1 - 我们将把这些提交移到分支 feature1
  • feature1@{1} - 我们只是rebase 'd feature1 ,所以我们需要获取上一次提交(即 rebase 之前的提交)。这是我们要移动的提交范围的开始
  • feature2 - 这是我们要移动的提交范围的结尾

  • 注意: feature1@{1}当用作文章中描述的过程的一部分时将起作用,但如果在更新 feature1 之间运行其他 git 命令,则可能不正确。和 feature2 .在这种情况下,您可以将其替换为原始提交 ID - 通过查看 git log 的输出获得。同时在 feature2并从 feature1 中选择最后一次提交(此处给出的示例中的“C”)。

    其他好书:

    Atlassian article: Merging vs Rebasing

    SO Question

    关于git - 为什么我的 "git rebase master"在最后一次 merge 后返回的提交比 "normal"多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57008847/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com