如何Fork一个仓库的旧版本(在github上)

开源 0

可以直接前往标签“自己想出的方法”这里查看实现方法,跳过我的废话

提出问题:

在自己的学习过程中,真的很需要Fork一个仓库之前的旧版本,于是我产生了这个疑问

前提:

首先要知道,在github中没有一种快捷方式可以直接用于 Fork 一个仓库的先前版本。

一般情况下无论你处于一个仓库的哪一个版本的页面,进行 Fork 操作都是会默认的帮你 Fork 一个最新的仓库到个人仓库目录下,所以我决定自己查证并实现这个方法。

首先看看人工智能的回答:

分析:fork 一个库的以前的版本这个操作可能会有一些限制和复杂性。

理论做法:克隆(clone)库到本地,然后使用 Git 的命令行工具来切换到特定的历史版本,创建一个新的分支,然后将该分支推送到你自己的 GitHub 仓库。这样你就可以创建一个特定历史版本的 fork。

注意:要注意的是,某些库的所有者可能会限制 fork 的操作,或者禁用了对历史版本的访问。在进行这样的操作之前,最好先阅读该库的许可证和所有者的规定,以确保你的操作是符合规定的。

具体实现(人工智能):

要在 GitHub 上 fork 一个库的特定历史版本,你可以按照以下步骤操作:

  1. Clone 原始库到本地: 使用 Git 命令行工具,在本地克隆原始库。在命令行中执行:

    git clone <原始库的 URL>
  2. 查看提交记录: 进入克隆下来的库目录,使用以下命令查看提交记录:

    git log
  3. 切换到特定历史版本: 根据提交记录找到你想要的历史版本的 commit ID,然后使用以下命令切换到该版本:

    git checkout <commit ID>
  4. 创建新分支: 切换到特定历史版本后,创建一个新的分支:

    git checkout -b <new-branch-name>
  5. 将分支推送到自己的 GitHub 仓库: 将新创建的分支推送到你自己的 GitHub 仓库:

    git push origin <new-branch-name>

我们再来看看其他论坛上涉及这个问题的方法: 

1.

转载自https://segmentfault.com/q/1010000019161901icon-default.png?t=N7T8https://segmentfault.com/q/1010000019161901

 2.

转载自 Git 如何在Github上fork一个旧版本的项目|极客教程

 3.

转载自:How can I restore a previous version of my project? | Learn Version Control with Git

该网站的说明:使用像 Git 这样的版本控制系统带来了一个惊人的好处:您可以随时返回到项目的任何旧版本

4.

转载自: git - how do I fork an older version of a github project? - Stack Overflow

5. 

 

转载自: 使用之Git回退到某个历史版本_fork 回退到以前-CSDN博客

自己想出的方法:

1.

是否可以 clone 一个仓库的之前版本到本地,然后上传自己的本地文件为一个库,将此库作为被Fork的库一样使用?

首先尝试克隆某一版本的库

但是可以在 clone 中进行拓展操作,实际上可以 clone 历史版本 

-----------------或者(有伏笔)-----------------

这时候去外部文件夹看文件,也会变成该版本的样子。 

---------------------------------

然后在github 上创建一个新仓库 

---------------------------------- 

在刚才克隆的仓库这里我们进入 checkout 进入的版本,创建一个分支,将此分支下的文件推入我们的库(这个分支包含了旧版本库的文件,如果不创建这个分支,还是会默认的push当前最新版本的库进入新库)

这样我们就得到了一个包含某个库的旧版本文件的个人的库,你可以Fork自己的旧版本库或者将其作为submodule,满足你的某些需求。(这样也实现了Fork旧库的目的,就是Fork自己的库)

 

做完后我才发现和人工智能的答案几乎相同。我以自己的想法实现了,不错。

(好像和论坛中的某些方法也类似哈,之前不懂的时候没看出来的哈哈) 

分析:

阅读了以上文章,我们找到了一些类似的命令,但每一个方法却又都给人一种大同小异的感觉,所以我将去查阅这些命令的意义,然后实验这些方法。

论坛上的两种方案:

I

人工智能方案、方法2以、方法3的后半部分、方法4的后半部分  给出的方法是类似的:

即:使用了 git checkout,然后push

II

方法1、方法3的前半部分、方法4的前半部分、方法5  给出的方法是类似的

即:使用了git reset,然后 push

我的方法:

和人工智能大相径庭,实现过程我已经放在上面了。

指令意义分析:

git clone:用于克隆远程仓库

git log:用于查看提交历史的命令,它可以显示当前分支的所有提交记录。使用 git log 可以了解项目的修改历史,包括每次提交的作者、提交日期、提交信息等。

git checkout:用于在不同分支之间进行切换、撤销更改和恢复文件等操作。

  1. 切换分支:最常见的用法是通过 git checkout <branch_name> 来切换到指定的分支,这样你可以在不同的分支上进行工作,查看不同的代码状态。

  2. 创建分支:通过 git checkout -b <new_branch_name> 可以同时创建一个新分支并切换到该分支上,方便进行新功能的开发或实验性工作。

  3. 撤销更改:你可以使用 git checkout -- <file_path> 来撤销对某个文件的更改,将其恢复到最近一次提交时的状态。

  4. 查看历史版本:通过 git checkout <commit_hash> 可以切换到指定的提交版本,查看该版本的代码状态,进行比较或其他操作。

  5. 恢复删除的文件:如果你误删了某个文件,可以使用 git checkout <commit_hash> -- <file_path> 来恢复该文件,其中 <commit_hash> 是包含该文件的提交的哈希值。

git branch -a:用于查看所有的分支,包括本地分支和远程分支。这个命令的意义在于列出当前 Git 仓库中所有可用的分支,无论是在本地还是在远程仓库中。

git tag :用于标记特定提交的命令,它可以在某个特定的提交上打上一个标签,用来标识该提交对应的版本号、发布版本等信息。

git checkout <Tag/Commit>:用于切换到指定的标签(Tag)或提交(Commit)。<Tag/Commit> 可以是标签名(Tag)或提交的哈希值(Commit),通过这个命令可以快速切换到对应的版本,进行相应的操作。

git reset --hard <老版本hash>:

  1. 回退到指定版本:通过指定 <老版本hash> 对应的提交,可以将当前分支的 HEAD 指针移动到该提交,丢弃所有的后续提交,实现回退到指定的历史版本。

  2. 清空暂存区和工作目录:使用 --hard 参数可以彻底地重置工作目录和暂存区,删除所有未提交的更改,确保工作目录和索引与指定的老版本完全一致。

  3. 提示:<老版本hash> 是要回退到的历史版本的提交哈希值,执行这条命令将会使当前分支回退到指定的历史版本,并丢弃所有未提交的更改。

git push --force: 用于将本地的提交强制推送到远程仓库,并覆盖远程仓库上对应分支的提交历史,即使远程仓库中已经存在不兼容的提交历史。

git push -f -u origin <local_branch_name>:

  1. 强制推送:通过 -f--force 选项,可以强制推送本地分支到远程仓库,覆盖远程仓库上的对应分支的提交历史。

  2. 建立关联:使用 -u 选项可以建立本地分支与远程分支的关联,即在推送后,本地分支会自动与指定的远程分支建立跟踪关系。

git checkout -b my-branch <老版本hash>:在指定的 <老版本hash> 处创建一个新的分支 my-branch 并切换到这个分支,即以历史版本为基础创建一个新的分支。

  1. 创建新分支:通过 -b 选项,Git 会在指定的 <老版本hash> 处创建一个新的分支 my-branch

  2. 切换分支:创建新分支后,Git 会自动切换到这个新创建的分支,即当前工作目录会切换到新分支上。

  3. 基于历史版本创建:使用 <老版本hash> 参数指定了历史版本的哈希值,因此新创建的 my-branch 分支将以这个历史版本作为起点,包含该历史版本的文件状态和提交记录。

  4. 实现版本控制:通过在特定历史版本处创建新分支,可以在不影响当前开发进度的情况下,进行一些历史版本的修改或实验性工作。这有助于快速回退到之前的状态或实现特定需求。

git reset --soft <老版本hash>:

  1. 移动 HEAD 指针:通过 --soft 选项,Git 会将当前分支的 HEAD 指针移动到指定的 <老版本hash> 处,不影响工作目录和暂存区的内容。

  2. 保留修改:由于使用了 --soft 选项,命令执行后,工作目录和暂存区中的修改仍然存在,并未被清除或回滚。

  3. 撤销提交:这条命令可以用来撤销之前的提交,将当前分支的历史记录回溯到指定的 <老版本hash> 处,但保留之后的修改。

git checkout -b old-project-state <老版本hash>:

在指定的 <老版本hash> 处创建一个新的分支 old-project-state 并切换到这个分支,即以历史版本为基础创建一个新的分支来还原项目到过去的状态。

  1. 创建新分支:通过 -b 选项,Git 会在指定的 <老版本hash> 处创建一个新的分支 old-project-state

  2. 切换分支:创建新分支后,Git 会自动切换到这个新创建的分支,即当前工作目录会切换到新分支上。

  3. 基于历史版本创建:使用 <老版本hash> 参数指定了历史版本的哈希值,因此新创建的 old-project-state 分支将以这个历史版本作为起点,包含该历史版本的文件状态和提交记录。

  4. 还原项目状态:通过在指定历史版本处创建新分支,可以还原项目到过去的状态,查看历史文件状态或进行与历史版本相关的操作。

实际演习:

这些回答无论是论坛上的或者人工智能的,和我的方法都差不多(除去git reset指令,我没有试)。所以就不演示了,实际使用过程我包含在“我的想法”这个标签中了,可以去看看。

因为我实现了类似的功能,但如果有一天我真的需要去Fork原仓库的旧版本,而不是将其push到我的私人仓库中然后Fork自己的仓库,我会回来将演示完成并放在这里的。(原谅我的懒惰>-<)

也许您对下面的内容还感兴趣: