2

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

我有三个分支:wip, deploy-dev, client.

  • wip是我们团队内部的工作分支。它包括第 3 方密钥/秘密和一些本地环境配置。

  • deploy-dev也是内部的,但它有不同的配置来测试部署的版本。

  • client是被推送到客户端远程的分支。它删除了我们用于测试的第 3 方密钥/秘密。

问题

我的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.

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

4

2 回答 2

1

听起来你需要学习git rebase. 例如,参见什么时候需要 git-rebase?git rebase vs git merge开始。

在你 squash 之后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.

于 2013-01-18T01:59:18.840 回答
0

这将是一个巨大的痛苦。你不能再合并任何东西client;就 git 而言,历史完全不同。您实际上有两个不相关的项目,它们碰巧存在于同一个存储库中并生成相同的文件。

您必须兼顾重置,或以创造性的方式使用变基。重置(我认为!):

git checkout wip
git reset --soft client
git add .
git commit...

git reset --soft将更改 git认为您所在的分支,而不会更改您的任何文件。因此,您将拥有文件wip并且 git 会认为您在client分支上,然后您可以再次批量提交。

你也可以使用变基:

git rebase --onto client X wip

X最后一次提交wip已经被压缩到client. 这将获取所有新提交并重新创建它们,一次一个,在client. 您还可以使用-i获取交互模式,这将使您可以将它们压缩在一起或随时重写提交消息。

你必须为每个版本都这样做,如果你犯了错误,你会得到一些更古怪的结果。理想情况下,您应该:

  1. 从一开始就写下你的提交历史,这样它就可以随时公开——把秘密放在外面等等。不过现在有点晚了。或者:

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

于 2013-01-18T02:01:09.207 回答