从某个提交开始维护一个git分支。

时间:2013-01-18 01:25:52

标签: git

我认为这个问题的答案分散在文档和其他问题的某处,但我找不到与我的情况完全相关的内容,所以我发布了这个。请随时指出我在其他地方的任何相关答案。

我有三个分支:wipdeploy-devclient

  • 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-devclient并将wip合并到其中。

但是,当我结帐clientgit merge wip时,我会将整个提交历史记录恢复为client

我遗漏了一些简单的东西,但我不知道如何描述它而不描述整个情况。 谢谢您的帮助。

2 个答案:

答案 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

其中Xwip上已被压缩为client的最后一次提交。这将采用所有新提交并在client之上一次一个地重新创建它们。您还可以使用-i来获取交互模式,这样您就可以将它们压缩在一起,或者在您去的时候重写提交消息。

你必须为每个版本执行此操作,如果你犯了错误,你会得到一些更糟糕的结果。理想情况下,您应该:

  1. 从一开始就写下你的提交历史记录,这样就可以随时公开 - 保持带外秘密等等。但是现在迟到了。或者:

  2. 使用其他一些机制向您的客户端提供代码,例如tagging提交,然后只是通过电子邮件向他们发送tarball。如果他们想跟踪差异,你可以使用git diff v1.0..v1.1生成一个,或者他们可以自己做。