将断开的GIT历史恢复到一起
背景 感恩节假期期间,我在路上做一个没有互联网连接的项目。在我离开之前,我使用DropBox sync而不是git将文件移动到我的笔记本电脑上。坏主意。git目录没有正确地显示出来,如果没有Google,我唯一能做的事情就是把整个事情都处理掉,并创建一个新的git存储库 我度假回来,现在可以去GitHub了,那里有着原始的历史 问题将断开的GIT历史恢复到一起,git,git-merge,Git,Git Merge,背景 感恩节假期期间,我在路上做一个没有互联网连接的项目。在我离开之前,我使用DropBox sync而不是git将文件移动到我的笔记本电脑上。坏主意。git目录没有正确地显示出来,如果没有Google,我唯一能做的事情就是把整个事情都处理掉,并创建一个新的git存储库 我度假回来,现在可以去GitHub了,那里有着原始的历史 问题 d -- e -- f -- * <= working tree when bad things happened / a --
d -- e -- f -- * <= working tree when bad things happened
/
a -- b -- c (Original git repository)
\
g -- h
a' -- b' -- c' -- d' (new repo with a' = *)
d -- e -- f -- a' -- b' -- c' -- d'
/ \
a -- b -- c -- (desired result) ------------m
\
g -- h
如何将新存储库中的提交应用于原始存储库
插图
d -- e -- f -- * <= working tree when bad things happened
/
a -- b -- c (Original git repository)
\
g -- h
a' -- b' -- c' -- d' (new repo with a' = *)
d -- e -- f -- a' -- b' -- c' -- d'
/ \
a -- b -- c -- (desired result) ------------m
\
g -- h
d--e--f--*您基本上希望按顺序将每个修补程序应用于原始存储库。如果您必须手动git am
每一个,这将是一个巨大的痛苦!但Git真是太棒了。如果您记住,git-rebase
在补丁级别而不是提交级别工作,并且基本上可以为您完成所有工作,那么这是相当简单的
转到您的工作存储库,查看您决定删除项目时所在的分支。我强烈建议你的工作目录要干净;如果不是,那么在继续之前,您应该将其隐藏起来(并知道如何使用git reflog
)
准备好重播工作后,将新存储库添加为远程存储库。如果您正在使用临时远程repo(例如在GitHub上)或本地计算机上其他地方的目录,那么这种方法同样有效。现在,假设您调用了远程土耳其
,请运行以下命令:
$ git fetch turkey
$ git rebase HEAD turkey/master
$ git checkout -b rebased
现在,您有了一个新的分支,重新基调
,其中包含您的感恩节工作。我不完全确定Git为什么不继续移动旧的分支指针,但不管怎样:如果您愿意,可以将新的重定基址的
合并到您的旧分支中,而旧分支应该快速前进
此时,您可以删除遥控器并推送到GitHub。将最新的工作副本签出到新目录。然后把整个项目放在最上面。那就承诺吧。它应该只提交更改。不过,您可能无法让每个提交都这样做。我认为解决方案是将Github repo添加为远程,然后在其上重新设置新提交的基础。不过,我没有足够的信心将其作为一个答案发布。这失败了:首先,倒带头部以在其上重播您的工作。。。致命错误:无法从以下命令解析对象“200dddf914aa8e6787e9d778902e72adc45b0589^”未知退出代码(128):git merge recursive 200dddf914aa8e6787e9d778902e72adc45b0589^--HEAD 200dddf914aa 8e6787e9d778902e72adc45b0589Uh。我不知道;听起来您的存储库已损坏。如果运行git fsck(在两个回购协议上),会发生什么情况?