【问题标题】:Rebase instead of fast forward变基而不是快进
【发布时间】:2015-04-24 08:16:07
【问题描述】:

我是 GIT 新手,我不知道我的问题是否已经有了答案。请在标记为重复之前仔细阅读。

我有一个分支,我们称之为public,它被推送并与origin 同步。有一次,我创建了另一个分支private,它从public 中弹出,因为我想做很多我想保密的工作。所以我只在private 上工作,比方说,我做了 10 次提交,直到我最终达到可以公开的状态。

现在,我显然不想对public 进行快进合并,因为所有中间提交都会出现在远程服务器上。 鉴于public 分支没有偏离private 的创建点,我该如何做rebase

显然,我想在 public 分支上创建一个新提交,其中包含来自 10 个 private 提交的所有修改。我知道这会转化为rebase,但我不知道该怎么做。

【问题讨论】:

    标签: git git-branch git-rebase


    【解决方案1】:

    首先,public跟踪一个存在于origin 上的远程分支这一事实并不意味着本地分支public 等同于远程分支origin/public .

    由于 git 的分布式特性,您可以在本地 public 分支上进行大量提交,而无需将任何内容发送到服务器,只要您不推送即可。

    鉴于系统的当前状态,关于您尝试执行的操作,这里有一些详细的步骤,假设您不关心保留最初的 10 次提交。

    1. 根据远程服务器的当前状态开始交互式变基。

      git checkout private
      git rebase -i origin/public
      
    2. 将弹出一个编辑器。具体的编辑器将取决于平台和环境变量设置。在此编辑器中,您将看到 10 次提交的哈希值,左侧列中有“pick”一词。对于第一行,保留pick。对于后续行,将pick 替换为squash。保存文件并退出编辑器。

    3. 此时,git 会将 10 个提交合并为一个提交,因此我们可以合并到 public 并推送。

      git checkout public
      git merge private
      git push
      

    如果您想在本地 private 分支上保留最初的 10 次提交,则可以改为在本地 public 分支上进行快进合并,然后在此处进行变基。

    git checkout public
    git merge private
    git rebase -i origin/public
    # Do the same rebase steps as above
    git push
    

    【讨论】:

    • 感谢您的最后提示,这可能对我将来有用。现在,我刚刚创建了一个新的私有分支并对其进行了重新定位,从而确保我将 10 次提交保留在原始私有分支上,该分支保持不变。
    【解决方案2】:

    使用 git rebase -i 并为您的 10 次提交选择 squash,这样您就只有一个基于公共分支的大提交。

    将 -i 与 rebase 一起使用时,您将获得一个文本编辑器,您可以在其中选择每个提交将如何被 rebase(或者是否会被 rebase)。 Squash 是允许您使用这种语法将多个提交集成到一个选项中的选项(来自 github doc,链接如下):

    pick 1fc6c95 Patch A
    pick 6b2481b Patch B
    squash dd1475d something I want to split
    squash c619268 A fix for Patch B
    squash fa39187 something to add to patch A
    squash 4ca2acc i cant' typ goods
    squash 7b36971 something to move before patch B
    

    这将变基 2 次提交:“补丁 A”将逐字记录,“补丁 B”将包含下一次“压缩”提交的更改。

    有关详细信息,请参阅reference 或漂亮的github doc page 中的“交互式变基”。

    【讨论】:

    • “选择squash”是什么意思?
    【解决方案3】:

    确切地说,在 public 上创建一个包含来自 private 的修改的新提交并不需要 rebase。它要求merge

    变基以将private 的提交压缩在一起似乎是您想要的,您保留一个分支和一个合并提交。

    但是,由于您不关心 private 分支的详细历史记录,您也可以:

    $ git checkout public
    $ git merge --squash private
    $ git commit
    

    索引首先使用private 的内容更新,您可以在public 之上对其进行一次提交。

    【讨论】:

    • 确实更简单...不知道这种语法
    • 太棒了。这更快!
    猜你喜欢
    • 2019-10-31
    • 2012-07-23
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多