Git-获取代码,将其分支并部分推送

Git-获取代码,将其分支并部分推送,git,git-extensions,Git,Git Extensions,我有一个庞大的代码库,有许多更改,我想将其分支,并将其推送到一个远程新分支,但要仅推送上个月的更改集,请使本月的第一次更改看起来像是创建存储库,这意味着我不关心以前的更改。 我确信这是可能的,只是不知道它叫什么以及如何做。一个可能的解决方案是使用查询,以便在自己的回购协议中隔离相关的提交(一个月或更短) 但这意味着推出新的回购协议,而不是在现有回购协议中推出新的分支机构。 除非创建一个不相交的分支(新的根提交),并且没有公共历史记录。请参阅“”。 在这种情况下,您确实会根据过滤分支的结果推送一个

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

一个可能的解决方案是使用查询,以便在自己的回购协议中隔离相关的提交(一个月或更短)

但这意味着推出新的回购协议,而不是在现有回购协议中推出新的分支机构。
除非创建一个不相交的分支(新的根提交),并且没有公共历史记录。请参阅“”。

在这种情况下,您确实会根据过滤分支的结果推送一个新分支(用于分割回购历史并隔离所需的更改)。

首先,假设您在大约一个月前发现了要成为新的第一个提交的提交,可能是使用
git show HEAD@{1.month.ago}
或者只需查看
git日志
。假设提交是
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
之后到新的
master
上的
previous/dev
的所有提交,该主机当前只有一个提交

git rebase --onto master b1cbc10e84bb2e2 previous/master
在重设基础期间,您可能必须修复一些冲突。默认情况下,
git-rebase
将在重新应用这些提交引入的更改时线性化历史-您可以告诉它尝试使用
-p
保留这些更改,但这可能不起作用

现在,此新存储库中的
主分支应符合您的要求,因此您可以删除我们创建的远程存储库:

git remote rm previous


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

有一个
git checkout--orphan
方法,它可以创建一个独立的分支,可以以类似的方式使用,可以节省一些按键

显然(?),正如其他人所暗示的,如果你选择了历史的一个简单的线性部分作为基线,事情会变得更简单

编辑:克隆步骤的详细信息见

如果我正确获得您的请求,您希望从当前存储库的特定点开始创建新存储库。为什么?因为你想保持它的干净,消除特定点后面的所有历史。现在,这更有可能

这里的关键术语是。您只需要先进行备份

最重要的是,你在请求一件非常具体的事情。它确实是这样做的,而不是那样做的。事实上,它并没有做很多事情。。。这就是为什么它甚至为您提供了一个命令行按钮的原因

你会需要它的。您需要调整命令行。如果你不习惯那样做,那你就不走运了。我知道没有git gui工具可以为您完成这项工作

下面,只是我先前(现在的遗产)答案的一部分,在op对他的真实意图发表新的评论之前

如果情况并非如此,那么让我们假设有一个很好的理由“接受一个代码,将其分支,并部分推送”。那么,你所要做的就是


或者,假设它是用于备份的。那么,这是一个不好的方法。取而代之的是,找一个备份工具,然后。GIT不是用于备份的,也不应该用于这种情况。我强烈建议使用或甚至。

这是为了推动新的回购……对不起,我理解得不够公平。修复了我的答案。如何选择简单的线性历史记录?一种方法是使用gitk查看相应分支的一部分是否在查找最近的部分,直到上次合并。最近一组没有合并的提交(a)是一个非常独特的sha1序列,并且(b)独立于初始提交的单亲sha1之外的任何其他序列。这应该为要锁定的分支更新提供唯一的密钥。对于所需的分支,请在要开始的位置之前返回大约6-8次提交。如果你以后有任何问题,这会给你一个“干净”的序列来比较。是否有一个特定的部分(可能从一开始)你不明白?如果是这样的话,你可以考虑一个关于堆栈溢出的更具体的问题,因为你想做的事情需要对Git概念有一个清晰的认识。陈:总的想法是把历史隔离在一个单独的Reopp中,然后把它推到你的新回购。