如何移动分支的来源

How to move where a branch originates from

我觉得 Git 缺少一些基本的东西,但是有没有办法移动分支的起源?我 运行 经常遇到这样一种情况,我从 master 创建一个功能分支,在它上面工作几天,然后我推送它 我需要确保添加到 master 的任何更改都需要成为 merged/rebased 到我的分支。这似乎使我的分支非常混乱。我想我可以简单地将分支的起源位置更改为 master 现在所在的位置,就好像我刚刚创建了分支一样(但显然,我需要处理出现的任何冲突)。有没有办法做到这一点或其他一些过程来保持我的分支清洁?

我希望能够从以下位置切换:

a--b--d--f
    \
     c--e--g

a--b--d--f
          \
           c--e--g

编辑: 最近,为了模拟这一点,我一直在使用临时分支,当我的工作完成后,我将创建一个新分支,并将所有提交移至该分支并重新提交并推送。如果 pull-request 审查需要一段时间,这就不会很好地工作。我最近也尝试过做一个 git pull --rebase upstream master 然后将 master 合并到分支中。这增加了大量其他人对我的分支的承诺。我在想合并把事情搞砸了,但在我推送并检查拉取请求之前我没有意识到。

您所描述的变基。你只是在错误的方向上做。假设 master 指向提交 f 并且 your-branch 指向 g.

a---b---d---f  ← master
     \
      c---e---g  ← your-branch

要在提交 f 时获取分支并使其成为 "start",您必须在 master 上重新设置 your-branch。对应的命令为:

git rebase master your-branch

Git 将首先检查您在第二个参数中指定的分支(此处为 your-branch)。因此,如果您已经签出该分支,则可以省略第二个参数。

第一个参数将用于确定基本提交,在本例中为 b。 Git 将使用您提供的分支和您当前签出的分支之间的第一个共同祖先。

除非您指定 --onto,否则 Git 将再次使用第一个参数来确定新的基数。在本例中,就是提交 f。结果是:

a---b---d---f  ← master
             \
              c'--e'--g' ← your-branch

请记住,提交哈希会发生变化,因为您实际上有新的提交。我用素数 (') 标记了新提交。


I've also recently tried doing a git pull --rebase upstream master then merging master into the branch.

您不希望在 master 重新定位后将其合并到您的分支中。变基完全按照您的描述进行,您不需要额外的步骤。