我有一个庞大的代码库,有很多变化,我想对它进行分支,并将其推送到一个远程的新分支,但只推送上个月的变更集,使本月的第一个变更看起来像是创建存储库,这意味着我不关心以前的更改。
我确定这是可能的,只是不知道它叫什么以及如何做。
最佳答案
首先,假设您已经发现大约一个月前的提交,您希望成为新的第一次提交,可能使用 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/