我认为这个问题的答案分散在文档和其他问题的某处,但我找不到与我的情况完全相关的内容,所以我发布了这个。请随时指出我在其他地方的任何相关答案。
我有三个分支:wip
,deploy-dev
,client
。
wip
是我们团队内部的工作分支。它包括第三方密钥/秘密和一些本地环境配置。
deploy-dev
也是内部的,但它有不同的配置来测试已部署的版本。
client
是被推送到客户端远程的分支。它删除了我们用于测试的第三方密钥/秘密。
我的wip
分支有很多提交。对于客户端的第一个版本,我想将它们压缩成一个提交。所以我这样做了:
git checkout -b client
git reset --soft <first commit>
git add .
git commit -m "v1.0 release to client"
在client
分支中的第一次提交之后,我想再次检出wip
并继续处理v1.1。然后我应该能够分别结帐deploy-dev
和client
并将wip
合并到其中。
但是,当我结帐client
和git merge wip
时,我会将整个提交历史记录恢复为client
。
我遗漏了一些简单的东西,但我不知道如何描述它而不描述整个情况。 谢谢您的帮助。
答案 0 :(得分:1)
听起来你需要学习git rebase
的魔力。例如,请参阅When would one need git-rebase?和git rebase vs git merge开头。
在你压缩client
之后,你应该有这样的东西。
A--B--C--D[wip]
/
X--E--F--G[deploy-dev]
\
Z[client]
运行
git checkout wip
git rebase client
也可能是
git checkout deploy-dev
git rebase client
现在您的DAG将如下所示:
A--B--C--D
/
X--E--F--G
\
Z[client]--E'--F'--G'[deploy-dev]
\
A'--B'--C'--D'[wip]
当然,您需要解决任何冲突,就像您已经完成merge
一样。
答案 1 :(得分:0)
这将是一个巨大的痛苦。您无法再合并任何内容client
;就git而言,历史是完全不同的。您实际上有两个不相关的项目碰巧存在于同一个存储库中并生成相同的文件。
你必须兼顾重置,或以创造性的方式使用变基。有了重置(我想!):
git checkout wip
git reset --soft client
git add .
git commit...
git reset --soft
会更改你所在的分支git 认为,而不会更改任何文件。因此,您将拥有wip
中的文件,git会认为您在client
分支上,然后您可以再次批量提交。
你也可以使用rebase:
git rebase --onto client X wip
其中X
是wip
上已被压缩为client
的最后一次提交。这将采用所有新提交并在client
之上一次一个地重新创建它们。您还可以使用-i
来获取交互模式,这样您就可以将它们压缩在一起,或者在您去的时候重写提交消息。
你必须为每个版本执行此操作,如果你犯了错误,你会得到一些更糟糕的结果。理想情况下,您应该:
从一开始就写下你的提交历史记录,这样就可以随时公开 - 保持带外秘密等等。但是现在迟到了。或者:
使用其他一些机制向您的客户端提供代码,例如tagging提交,然后只是通过电子邮件向他们发送tarball。如果他们想跟踪差异,你可以使用git diff v1.0..v1.1
生成一个,或者他们可以自己做。