我是GIT的新手,我无法弄清楚我的问题是否已经有了答案。在将其标记为重复之前,请仔细阅读。
我有一个分支,我们称之为public
,它被推送并与origin
同步。有一次,我创建了另一个分支private
,它从public
中弹出,因为我想做很多我想要保密的工作。所以我只在private
工作,我做了,比方说,10次提交,直到我最终到达一个可以公开的状态。
现在,我显然不想进行public
的快进合并,因为所有中间提交都会出现在远程服务器上。
如果rebase
分支没有从创建public
的位置偏离,我该如何进行private
。
显然,我想在public
分支上创建一个新的提交,其中包含来自10个private
提交的所有修改。我知道这会转换为rebase
,但我不知道该怎么做。
答案 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次提交。
针对远程服务器的当前状态开始交互式rebase。
git checkout private
git rebase -i origin/public
将弹出一个编辑器。具体编辑器将取决于平台和环境变量设置。在这个编辑器中,您将看到10个提交的哈希值,左侧列中带有“pick”字样。对于第一行,请保留pick
。对于后续行,请将pick
替换为squash
。保存文件并退出编辑器。
此时,git
将10个提交合并为一个提交,因此我们可以合并到public
并推送。
git checkout public
git merge private
git push
如果您希望将原始的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
之上对其进行一次提交。