首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在新的git存储库上重放提交的最简单方法

在新的git存储库上重放提交的最简单方法
EN

Stack Overflow用户
提问于 2011-03-17 22:56:36
回答 1查看 8.8K关注 0票数 23

我一直在使用git-svn,最近,我在尝试提交时遇到错误(我认为这是由于libneon中的一个bug造成的,但这超出了这个问题的范围)。解决方案是使用git svn clone重新克隆我的git存储库。然而,我在我的旧git库中的主分支上有一些更改,我无法使用git svn dcommit将这些更改提交到svn。我想在使用git svn克隆的新存储库上重播这些更改。我想我可能可以使用git format-patch导出一个补丁集,然后在新的存储库上重放这些更改,但我不完全确定如何做到这一点,我想知道是否有更简单或更优雅的方法来完成这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-17 23:48:58

从新存储库中,添加对旧存储库的远程引用:

代码语言:javascript
复制
git remote add temp file:///path/to/old/repo/on/your/machine

从旧的存储库获取:

代码语言:javascript
复制
git fetch temp

查看旧存储库中的主分支:

代码语言:javascript
复制
git checkout temp/master -b wip

(wip代表正在进行的工作)

在当前存储库中的内容之上重新设置更改的基础:

代码语言:javascript
复制
git rebase master

将master更新为指向您的新头部:

代码语言:javascript
复制
git checkout master
git merge wip

删除对旧存储库和您使用的wip分支的远程引用:

代码语言:javascript
复制
git branch -d wip
git remote rm temp

您实际在做的事情:

首先,通过添加远程引用和获取,您可以从以前的存储库中提取当前存储库中还没有的提交。Git知道如何做到这一点,因为,无论它在哪里或如何进行,相同的提交在任何地方看起来都是一样的。它是一些众所周知的信息的SHA1散列,包括目录树、提交者、时间戳等。

因此,当您基于相同的SVN存储库创建一个新的Git存储库时,所有提交都具有相同的SHA1和。因此,您获取到当前存储库中的新提交继续指向正确的内容。这很酷,记住这一点很重要。

然后切换到temp的master分支的顶端,并告诉它重新建立到您当前的master上。rebase可能是不必要的,因为来自SVN的master可能没有从旧repo中的master移走,但最好是安全的。

rebase通过回溯两个提交的历史,直到它们都指向同一个父提交,从而找到两个提交之间最近的共同点。然后,它切换到您为其指定的分支名称(在本例中为master),并从原始分支的历史记录中挑选缺失的每个提交。一旦完成,它将指向您在上次应用提交时所在的分支。

最后,master和wip的合并只是为了将master快进到底。因为它是一条直线,所以它真的只是一个快进。您可以很容易地完成rebase或reset --hard;任何这些操作都会改变主分支,使其指向正确的位置。Merge是其中最安全的,因为如果发生了一些奇怪的事情,它会让你知道这不是一个简单的快进。

票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5340790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档