将本地分支进行变基并将其推送到Github

4

在Github上,我有:

  • 主分支,假设为github_master_branch
  • 还有一个个人(远程)分支,假设为github_personal_branch

    1. 过去我从GitHub克隆

    2. 我使用Pycharm检出了github_personal_branch并创建了一个本地分支,名称相同(但是假设它是local_personal_branch

    3. local_personal_branch推送到github_personal_branch

现在,在github_personal_branch上,我有github_master_branch前后的提交。

我想要获取来自github_master_branch的更改,将其合并到我的local_personal_branch,解决冲突,然后将其推送到github_personal_branch

  1. 我尝试过rebase,但实际上得到了许多提交,所有这些提交都是github_master_branch前进的,而不是移动头部。

  2. 我也尝试了Pycharm中的rebase选项,多种组合,但我不太理解ontofrom字段的逻辑。

  3. 我尝试了第二次手动rebase,但是除了master之外,我得到的很旧的代码在一段时间前是可用的local_personal_branch


1
请提供有关两个分支状态的更多信息。你的目标是什么?在完成后,你想要哪个代码在你的分支上? - Rozart
您需要从github_master_branch拉取更改到local_personal_branch,解决问题(合并问题),然后强制推送到github_personal_branch。无论如何,rebase都需要强制推送,但这既不是强制推送的好方法,也不是rebase的好方法。请尽量避免这种情况发生在未来。 - Dmitrii
@user 我已经编辑了我的回答。 - VonC
3个回答

4

要在Pycharm中rebase,你需要确保先进入正确的分支:

  • 切换到local_personal_branch分支
  • 更新origin分支
  • 按照这里所述,将当前分支以git远程库中的github_master_branch为基础进行rebase操作(使用onto字段)

https://blog.jetbrains.com/ruby/files/2010/12/rebase.png

重新设置基础需要强制推送,顺便说一下,这既不是强制推送的好方法,也不是重新设置基础的好方法。在这种情况下,我认为这样做是可以的:“local_personal_branch”是个人的(属于你): 你可以重新设置它并多次强制推送它,因为只有你在工作。重新设置基础的想法是使将来的拉取请求容易被接受,因为你的“local_personal_branch”提交将已经在最新的“origin/github_master_branch”之上进行了重新设置,这意味着接受这样的PR将导致一个简单的快进合并:没有冲突。此外,正如这里所提到的,将“master”合并到特性分支中并不被认为是最佳实践:你(通常)将合并到“master”,而不是从它中合并。
参见“rebase vs. merge”。

3

虽然我对CLI rebase很有经验,但我从来没有掌握过如何使用IntelliJ的rebase选项^^

据我所了解,您的设置如下:

     github/master
          v
A-B-C---D-E
     \
      \-F-G
          ^
       personal,
    github/personal

你应该也需要一个 master 分支(本地主分支)。如果你不确定这个设置,请提供以下命令的输出:

git log --oneline --decorate --graph local_personal_branch github_personal_branch master github_master_branch

你想要的是将你的个人分支变基到主分支上,以获得以下图形:
       github/master
            v
A-B-C---D---E---F'---G'
                     ^
                  personal
               github/personal

所以命令是:
git rebase --onto github/master C personal
git push --force

为了解释它:
- 您希望将提交在提交“C”和“个人”之间的内容放入当前的“github/master”分支中。 - 您将新的个人分支推送到GitHub。由于rebase不创建线性历史记录(一些以前的个人提交(F、G)被替换为新的“相同”提交(F'和G'),因此您需要强制推送。 请注意,您的远程存储库可能称为“origin”,而不是“github”(请参见git remote -v的输出),因此您应该在先前的提交中将对“github”的引用替换为对“origin”的引用。字母“C”必须替换为“master”和“personal”之间最后一个共同提交的哈希号。
祝好。

在这种情况下不需要使用 --onto:只需使用简单的 git rebase github/master 就足以将 personal 移动到 github/master 之上。 - VonC
@VonC 是的,在这种简单情况下,“--onto”是多余的,就像“C”参考一样。一个简单的“git rebase origin/master”就可以完成工作,但更加详细地说明了什么是“rebase”:从哪里到哪里,到什么上面。 - AlexisBRENON

0

不要使用rebase,而是使用合并(merge),具体如下:

  1. 将最新的(远程)github_master_branch合并到你的local_personal_branch中。(远程指的是该分支在远程的状态;你可能需要先更新本地主分支并合并它,但请确保你正在使用最新版本)

  2. 解决主分支和你的分支(在本地的local_personal_branch上)之间的任何冲突。

  3. local_personal_branch推送到github_personal_branch

现在,personal_branch和master之间的差异应该只有在personal_branch上进行的更改。这将使将来将其合并到主分支中更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接