gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:23:51 26 4
gpt4 key购买 nike

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

最佳答案

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

git remote add temp file:///path/to/old/repo/on/your/machine

从旧仓库中获取:

git fetch temp

从旧的 repo 查看你的 master 分支:

git checkout temp/master -b wip

(wip 代表进行中的工作)

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

git rebase master

更新 master 以指向您的新 HEAD:

git checkout master
git merge wip

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

git branch -d wip
git remote rm temp

你实际上在做什么:

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

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

然后你切换到 temp 的 master 分支的顶端,并告诉它 rebase 到你当前的 master 上。 rebase 可能是不必要的,因为来自 SVN 的 master 可能没有离开你旧仓库中的 master,但最好是安全的。

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

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

关于git - 在新的 git 存储库上重播提交的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5340790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com