Rebase而不是快进

Bog*_*dru 2 git git-rebase git-branch

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

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

现在,我显然不想进行快进合并,public因为所有中间提交都会出现在远程服务器上.rebase如果public分支没有从private创建点偏离,我该怎么做呢?

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

mer*_*011 6

首先,这一事实public跟踪的远程分支的生活origin并不意味着当地分支机构public相当于远程分支origin/public

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

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

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

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

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

    git checkout public
    git merge private
    git push
    
    Run Code Online (Sandbox Code Playgroud)

如果您想在本地private分支上保留原始的 10 个提交,您可以改为在本地public分支上进行快进合并并在那里变基。

git checkout public
git merge private
git rebase -i origin/public
# Do the same rebase steps as above
git push
Run Code Online (Sandbox Code Playgroud)


Pre*_*euk 5

使用git rebase -i并选择squash你的10个提交,这样你的公共分支上只会有一个大的提交.

当使用-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
Run Code Online (Sandbox Code Playgroud)

这将修改2个提交:"Patch A"将逐字逐句"Patch B"将包括来自下一个"压缩"提交的更改.

有关详细信息,请参阅参考资料中的 "Interactive Rebasing" 或精美的github文档页面.