我有一个庞大的代码库,有很多变化,我想对它进行分支,并将其推送到一个远程的新分支,但只推送上个月的变更集,使本月的第一个变更看起来像是创建存储库,这意味着我不关心以前的更改。
我确定这是可能的,只是不知道它叫什么以及如何做。

最佳答案

首先,假设您已经发现大约一个月前的提交,您希望成为新的第一次提交,可能使用 git show HEAD@{1.month.ago} 或仅通过查看 git log 。假设该提交是 f414f31 。我们还假设您正在处理的分支的名称称为 dev

您说您希望它显示为以后的提交是存储库中的第一个提交,因此将这个分支保留在同一个存储库中没有实际意义 - 根本没有共同的历史记录。因此,让我们创建一个新的空存储库,以便从头开始:

 mkdir squashed-repository
 cd squashed-repository
 git init

现在让我们添加一个引用旧存储库的远程,并从那里获取所有分支作为新存储库中的远程跟踪分支。
git remote add previous /home/whoever/original-repository/
git fetch previous

现在从月初的提交更新您的工作树和索引:
git checkout f414f31 .

(注意该行末尾的 .。)

现在从索引的状态创建一个提交:
git commit -m 'A new start.'

现在,您使用 git rebase 重放从 f414f31 之后的所有提交,直到并在新的 previous/dev 之上包含 master ,目前只有一个提交。
git rebase --onto master b1cbc10e84bb2e2 previous/master

您可能需要在该 rebase 期间修复一些冲突。默认情况下,git rebase 将在重新应用这些提交引入的更改时线性化历史记录 - 您可以告诉它尝试使用 -p 保留它们,但这可能不起作用。

现在这个新存储库中的 master 分支应该如您所愿,因此您可以删除我们创建的远程:
git remote rm previous

我应该说,我通常会尽量避免这种类型的历史重写,特别是如果您与任何人共享了原始存储库。在任何情况下,较早的历史记录都非常有用 - 将其保存在您的存储库中真的那么糟糕吗?

关于Git - 获取代码,将其分支并部分推送,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6914595/

10-16 03:36