可以直接前往标签“自己想出的方法”这里查看实现方法,跳过我的废话
提出问题:
在自己的学习过程中,真的很需要Fork一个仓库之前的旧版本,于是我产生了这个疑问
前提:
首先要知道,在github中没有一种快捷方式可以直接用于 Fork 一个仓库的先前版本。
一般情况下无论你处于一个仓库的哪一个版本的页面,进行 Fork 操作都是会默认的帮你 Fork 一个最新的仓库到个人仓库目录下,所以我决定自己查证并实现这个方法。
首先看看人工智能的回答:
分析:fork 一个库的以前的版本这个操作可能会有一些限制和复杂性。
理论做法:克隆(clone)库到本地,然后使用 Git 的命令行工具来切换到特定的历史版本,创建一个新的分支,然后将该分支推送到你自己的 GitHub 仓库。这样你就可以创建一个特定历史版本的 fork。
注意:要注意的是,某些库的所有者可能会限制 fork 的操作,或者禁用了对历史版本的访问。在进行这样的操作之前,最好先阅读该库的许可证和所有者的规定,以确保你的操作是符合规定的。
具体实现(人工智能):
要在 GitHub 上 fork 一个库的特定历史版本,你可以按照以下步骤操作:
-
Clone 原始库到本地: 使用 Git 命令行工具,在本地克隆原始库。在命令行中执行:
git clone <原始库的 URL>
-
查看提交记录: 进入克隆下来的库目录,使用以下命令查看提交记录:
git log
-
切换到特定历史版本: 根据提交记录找到你想要的历史版本的 commit ID,然后使用以下命令切换到该版本:
git checkout <commit ID>
-
创建新分支: 切换到特定历史版本后,创建一个新的分支:
git checkout -b <new-branch-name>
-
将分支推送到自己的 GitHub 仓库: 将新创建的分支推送到你自己的 GitHub 仓库:
git push origin <new-branch-name>
我们再来看看其他论坛上涉及这个问题的方法:
1.
转载自https://segmentfault.com/q/1010000019161901https://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:用于在不同分支之间进行切换、撤销更改和恢复文件等操作。
-
切换分支:最常见的用法是通过
git checkout <branch_name>
来切换到指定的分支,这样你可以在不同的分支上进行工作,查看不同的代码状态。 -
创建分支:通过
git checkout -b <new_branch_name>
可以同时创建一个新分支并切换到该分支上,方便进行新功能的开发或实验性工作。 -
撤销更改:你可以使用
git checkout -- <file_path>
来撤销对某个文件的更改,将其恢复到最近一次提交时的状态。 -
查看历史版本:通过
git checkout <commit_hash>
可以切换到指定的提交版本,查看该版本的代码状态,进行比较或其他操作。 -
恢复删除的文件:如果你误删了某个文件,可以使用
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>:
-
回退到指定版本:通过指定
<老版本hash>
对应的提交,可以将当前分支的 HEAD 指针移动到该提交,丢弃所有的后续提交,实现回退到指定的历史版本。 -
清空暂存区和工作目录:使用
--hard
参数可以彻底地重置工作目录和暂存区,删除所有未提交的更改,确保工作目录和索引与指定的老版本完全一致。 -
提示:<老版本hash>
是要回退到的历史版本的提交哈希值,执行这条命令将会使当前分支回退到指定的历史版本,并丢弃所有未提交的更改。
git push --force: 用于将本地的提交强制推送到远程仓库,并覆盖远程仓库上对应分支的提交历史,即使远程仓库中已经存在不兼容的提交历史。
git push -f -u origin <local_branch_name>:
-
强制推送:通过
-f
或--force
选项,可以强制推送本地分支到远程仓库,覆盖远程仓库上的对应分支的提交历史。 -
建立关联:使用
-u
选项可以建立本地分支与远程分支的关联,即在推送后,本地分支会自动与指定的远程分支建立跟踪关系。
git checkout -b my-branch <老版本
hash>:在指定的 <老版本hash>
处创建一个新的分支 my-branch
并切换到这个分支,即以历史版本为基础创建一个新的分支。
-
创建新分支:通过
-b
选项,Git 会在指定的<老版本hash>
处创建一个新的分支my-branch
。 -
切换分支:创建新分支后,Git 会自动切换到这个新创建的分支,即当前工作目录会切换到新分支上。
-
基于历史版本创建:使用
<老版本hash>
参数指定了历史版本的哈希值,因此新创建的my-branch
分支将以这个历史版本作为起点,包含该历史版本的文件状态和提交记录。 -
实现版本控制:通过在特定历史版本处创建新分支,可以在不影响当前开发进度的情况下,进行一些历史版本的修改或实验性工作。这有助于快速回退到之前的状态或实现特定需求。
git reset --soft <老版本
hash>:
-
移动 HEAD 指针:通过
--soft
选项,Git 会将当前分支的 HEAD 指针移动到指定的<老版本hash>
处,不影响工作目录和暂存区的内容。 -
保留修改:由于使用了
--soft
选项,命令执行后,工作目录和暂存区中的修改仍然存在,并未被清除或回滚。 -
撤销提交:这条命令可以用来撤销之前的提交,将当前分支的历史记录回溯到指定的
<老版本hash>
处,但保留之后的修改。
git checkout -b old-project-state <老版本
hash>:
在指定的 <老版本hash>
处创建一个新的分支 old-project-state
并切换到这个分支,即以历史版本为基础创建一个新的分支来还原项目到过去的状态。
-
创建新分支:通过
-b
选项,Git 会在指定的<老版本hash>
处创建一个新的分支old-project-state
。 -
切换分支:创建新分支后,Git 会自动切换到这个新创建的分支,即当前工作目录会切换到新分支上。
-
基于历史版本创建:使用
<老版本hash>
参数指定了历史版本的哈希值,因此新创建的old-project-state
分支将以这个历史版本作为起点,包含该历史版本的文件状态和提交记录。 -
还原项目状态:通过在指定历史版本处创建新分支,可以还原项目到过去的状态,查看历史文件状态或进行与历史版本相关的操作。
实际演习:
这些回答无论是论坛上的或者人工智能的,和我的方法都差不多(除去git reset指令,我没有试)。所以就不演示了,实际使用过程我包含在“我的想法”这个标签中了,可以去看看。
因为我实现了类似的功能,但如果有一天我真的需要去Fork原仓库的旧版本,而不是将其push到我的私人仓库中然后Fork自己的仓库,我会回来将演示完成并放在这里的。(原谅我的懒惰>-<)