Rebase而不是快进

时间:2015-04-24 08:16:07

标签: git git-branch git-rebase

我是GIT的新手,我无法弄清楚我的问题是否已经有了答案。在将其标记为重复之前,请仔细阅读。

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

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

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

3 个答案:

答案 0 :(得分:5)

使用git rebase -i并为您的10次提交选择squash,这样您只需在公共分支上重新设置一次大提交。

将-i与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个提交:" Patch A"将是逐字的"补丁B"将包括下一个"压扁的变化"提交。

请参阅" Interactive Rebasing"在reference或好github doc page中了解详情。

答案 1 :(得分:4)

首先,public 跟踪位于origin的远程分支的事实并不意味着本地分支public等同于远程分支origin/public

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

考虑到系统的当前状态,关于你要做的事情,这里有一些详细的步骤,假设你不关心保留原来的10次提交。

  1. 针对远程服务器的当前状态开始交互式rebase。

    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
    
  4. 如果您希望将原始的10次提交保留在本地private分支上,则可以改为快速合并到本地public分支,然后在那里进行rebase。

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

答案 2 :(得分:2)

准确地说,在public上创建包含private修改的新提交不会要求rebase。它需要merge

重新将private之前的提交压缩在一起似乎是你想要的,你保留一个分支和一个合并提交。

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

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

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