如何将一个Git存储库重新绑定到另一个存储库?

kro*_*mon 55 git merge repository rebase

我有一个Git存储库(A),它包含项目的开发直到某一点.然后我丢失了这个回购A打开的USB记忆棒.幸运的是,我有一个最新提交的备份,所以我可以稍后创建一个新的存储库(B),我导入最新项目的状态并继续开发.现在我恢复了丢失的USB记忆棒,所以我有两个Git存储库.

我想我不得不以某种方式将回购B重新命名为回购A,但我不知道如何做到这一点,也许使用fetch/pull和rebase?

Jos*_*Lee 63

如果A和B不是同一个仓库(您使用最新的工作副本创建了B),则必须使用移植来假装它们具有共同的历史记录.

假设你根据VonC的答案添加了A作为B的遥控器,并且repo看起来像这样1:

~/B$ git tnylog 
* 6506232 (HEAD, master) Latest work on B
* 799d6ae Imported backup from USB stick
~/B$ git tnylog A/master
* 33b5b16 (A/master) Head of A
* 6092517 Initial commit
Run Code Online (Sandbox Code Playgroud)

创建一个移植物告诉B的根,它的父节点是A的头:

echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \
 >> .git/info/grafts
Run Code Online (Sandbox Code Playgroud)

现在,当您请求B的历史时,上面的两个历史将显示为一个.使移植永久化是一个简单的git filter-branch,没有参数.但是,在filter-branch之后,你不在任何分支上,所以你应该这样做git branch -D master; git checkout -b master.


1 git tnylog =git log --oneline --graph --decorate

  • +1顺便说一句,我编辑了你的答案以反映你的'git-tnylog`的作用(我很困惑并且花了一些时间直到我发现它是你的别名:['Pimped tnylog a bit'](https: //github.com/jleedev/dotfiles/commit/dc70a0bbef6ab6c7afabd49d6b917adca66e7bf5)) (12认同)
  • 这是一个很棒的帮助; 绝对做了我最想要的事情.谢谢! (3认同)
  • 用于处理"其他场景"的+1是A和B在提交历史中完全不同. (2认同)

Von*_*onC 30

如果A和B是相同的仓库(第一个SHA1是常见的),您可以:

  • 将A声明为B的远程: git remote add A /path/to/A
  • git fetch A更新所有远程甲分支在B回购
  • git checkout dev (在B,您正在开发的地方)
  • git rebase A/devBranchA/devBranch(您丢失的开发)之上重放B(即您从备份中开发或重新开发的内容).有点像这样的问题.

最后一步允许您将您的开发者与您丢失的开发者同步.
但实际上,一旦你从A获取,你就完成了:B现在包含" 所有 "历史记录(你丢失的那个和你当前的工作)


mef*_*yar 5

2021 年更新

git filter-branch自 Git 2.24(2019 年第 4 季度)起已弃用。相反,对于 A 和 B 不是同一个存储库的场景,您可以使用git replace --graft <commit> <parent>.

看:


归档时间:

查看次数:

20786 次

最近记录:

8 年,4 月 前