我有一个系统sys/master
的git存储库,这是我在创建系统一段时间后创建的。我有一个系统sys_bk
的备份,它是在创建存储库之前完成的。
在不影响系统最新版本的情况下,将sys_bk
版本作为标记版本添加到当前存储库的推荐方法是什么?
仅供参考,sys_bk
和sys/master
之间存在巨大差异。
答案 0 :(得分:1)
最简单的方法是使用git&#39; git checkout --orphan <branch>
命令,这样您就可以创建一个没有父级的分支,并将sys_bk
文件夹的内容作为初始提交
示例工作流程:
git checkout --orphan sys_bk
(签出没有父母的新分支)git rm -rf .
(删除工作目录中的所有文件)cp /path/to/sys_bk/* ./
(将sys_bk
个文件移至工作目录中)git add --all .
(将所有新sys_bk
个文件添加到索引中)git commit -m "Add sys_bk"
答案 1 :(得分:1)
我认为这里真正未解答的问题是,您希望这个新的(/旧)提交如何出现在历史记录中?今天你的历史从以后开始
D -- E -- F <--(master)
现在你有了一些旧版本A
。一些用户(他的回答中的jof,StephenNewell和评论中的torek)已经提到了将A
添加到您的回购中的方法。这样就可以得到像
D -- E -- F <--(master)
A <--(sys_bk)
然后斯蒂芬·尼威尔建议合并无关的历史,但我真的怀疑你想做什么。您指定不更改项目的当前版本,因此最好它是一种特殊类型的邪恶合并。基本上你最终会
D -- E -- F -- M <--(master)
/
A <--(sys_bk)
但TREE
处的内容(M
)不是该历史记录的默认/预期合并结果;相反,它会与TREE
的{{1}}重复。因此,合并会造成麻烦,而且它并没有很好地反映F
在项目历史中的真实位置。
一种选择是让历史不相关。您可以保留用于将A
带入回购邮件的sys_bk
分支,和/或您可以标记A
(这听起来像您打算做的那样),它会保留给任何关心寻找它的人。 (好吧,如果你保留分支而不仅仅是一个标签,可见性可能是最简单的;取决于你记录你正在做什么的方式。)
另一个合理的考虑因素是A
看起来像是A
的父母。有几种方法可以解决这个问题,有利有弊。
历史重写
重新编写历史记录,以D
的父级(粗略)将A
物理连接起来,这是您预先支付费用的选项,然后从那时起一切顺利。但是,根据有多少人分享您的回购,前期成本可能非常大,每个人都会支付它是否关心D
。
如果您想使用此选项,请使用A
选项查阅git filter-branch
的文档。最后你会得到像
--parent-filter
我使用A -- d -- e -- f <--(master)
来识别d
与TREE
完全相同的新提交。 (关于它的一切都像D
,除了它有一个父亲 - D
- 而A
没有父亲。)这与典型的&#34;重写提交&#34略有不同;从一个基础 - 特别是在D
的情况下 - 这就是为什么我使用小写而不是主要符号。但结果是一样的:这些是新的提交。
这意味着,假设d
(和/或任何其他参考号)已被推送到遥控器,您将不得不强迫推送&#34; - master
- 使用新的refs覆盖这些refs,或者只是丢弃遥控器并在其位置放置一个新的。无论哪种方式,每个其他用户都将处于破碎状态,他们必须仔细纠正以避免撤消您已完成的操作(请参阅&#34;从上游Rebase恢复&#34;在{{ 1}} docs)。
对象替换
一种侵入性较小的方法是根据需要更新单个存储库&#34;使他们表现得好像git push -f
是git rebase
的父母。在这种情况下,任何不关心将A
视为D
的父级的人都完全不受影响。缺点是(a)它需要在每个需要它的仓库上设置,(b)它有一些已知的错误/怪癖 - 请参阅A
文档。
为方便起见,您需要复制提交D
。您可以采用与历史重写类似的方式执行此操作,除非您创建一个新分支以重写并保留所有其他分支。
所以你要找出一个引用git replace
的表达式。 (也许你得到它的提交ID,或者在我们的例子中我们可以使用D
。)
D
然后以与完全重写相同的方式运行master~2
,但仅指定 git checkout master~2
git checkout -b sys_bk_replacement
分支(不是git filter-branch
,因为您可能将完全重写)。这会给你
sys_bk_replacement
任何希望--all
看起来像D -- E -- F <--(master)
A <--(sys_bk)
\
d <--(sys_bk_replacement)
的父母的人都可以使用A
替换D
git replace
。