Git:如何将[仅源码(zip)]与远端仓库关联
本文最后更新于:2023年12月16日 下午
前情提要
众所周知,大中华区信号不要太好,打不通Github是常态
git clone也是时常error
对于一个大仓库,还不如直接下载源码zip来得快
但是解压之后我们会发现,这个zip里没有.git文件夹,宛如一只离开蜂群的无人机,再也无法回家
没有.git文件夹就意味着没有加入版本控制,就无法与远端Github仓库产生联系,就是裸代码(raw codes),再也无法fetch和push了,哭
辣怎么办
辣就喝牛奶
不管怎么说,总得先创建一个本地git仓库吧
1 | |
ok,那么怎么和远端Github仓库产生关联呢
1 | |
酱紫就添加了一个名为origin的远程仓库了
反映在.git\config文件中就是:
1 | |
这段表明:
- 声明了一个远端仓库,名为
origin - 其
url为:https://github.com/XXX/XXX.git - 执行
git fetch操作时,远程仓库的所有分支会被抓取并强制更新到本地的origin/*引用上(简而言之就是用远端更新本地)
By the way
其实一个远程仓库也可以对应两个url(如:同时推送到gitee和github)
1 | |
1 | |
类似酱,那么问题来了,从哪个url fetch呢
答:默认是第一个url
且push时会同时向两个url推送,可以用git remote -v查看
1 | |
1 | |
Okay back
现在,我们有了一个远程仓库origin,但也仅此而已
1 | |
1 | |
可以发现什么都没有输出,甚至连一个本地分支都没有(主分支也没有)
啥也没有了属于是,no commit, no branch
那咋整啊,不管了,先fetch一下
1 | |
1 | |
太好了,现在有了几个远程分支,但是仍然没有本地分支(git branch显示当前分支为空)
为什么没有本地分支,也没有当前分支呢?
因为没有commit,HEAD指针就不知道指向谁,也就没有分支了
所以这种情况下,我们其实还是没有和远端产生较好的关联(没有本地分支跟踪远程分支)
同时,由于没有活动分支,也无法进行merge(众所周知,pull = fetch + merge)
那么,我们要怎么让本地拥有和远端master一样的commit记录呢?
其实就是检出(checkout)到远程分支嘛
1 | |
在较新Git版本中,如果本地不存在master分支,也可以简写为:
1 | |
Git 会自动创建一个新的本地分支 master 并将其设置为跟踪远程的 master 分支,这在 Git 2.23 及以上版本中更常见
但是显然,无论是哪个命令,checkout都会失败
1 | |
这是因为:工作目录中存在一些未跟踪的文件,这些文件在远程master 分支中也存在,因此Git 阻止了分支切换以避免这些未跟踪文件被覆盖
Solution:
- 删除所有未跟踪文件:
git clean -f - 暂存:
git stash --include-untracked - 提交:
git add . & git commit -m "Add untracked files" - 强制切换:
git checkout -f master
好的,我们还是强制切换吧
1 | |
Perfect
现在就跟直接执行git clone之后的仓库一毛一样了
好好好 再提一嘴 跟踪分支是怎么回事
branch ‘master’ set up to track ‘origin/master’.
注意这一句提示,checkout的时候本地master自动跟踪的远程的origin master分支
这个体现在.git\config就是:
1 | |
意味着,pull & merge的时候,自动合并origin仓库的master分支,也就是跟踪了远程分支嘛 差不多就酱
方法2
我们刚刚采用的是fetch + checkout -f法,那能不能直接pull呢
1 | |
好的,显然是不行,但是从这里我们可以清晰地看到pull = fetch + merge
那么原因还是类似,有未跟踪文件存在,且有被覆盖的风险
那么pull或merge有没有类似-f的强制指令呢
答案是没有,因为checkout是切换分支,有覆盖的语义,但是merge或pull是合并两个分支,是平等的
所以我们只能手动清理这些文件了
由于这些代码是直接下载的zip,我们也没有修改,所以删了也不心疼,待会儿pull就恢复了,所以直接
1 | |
库擦一下,工作区空了 /哭
然后
1 | |
1 | |
直接完美成功,本地也有了master分支
但是聪明的小伙伴可能发现了,本地没有分支怎么能merge
根据GPT-4的说法:Git会自动帮我们checkout一个新分支并跟踪远程分支巴拉,反正就是噼里啪啦就好了
注:实测发现,nonono,并不会自动设置远程跟踪分支,需要手动设置
git branch --set-upstream-to=origin/master master
Tip
如果仓库实在太大,fetch跟clone其实压力是一样的
(只不过下载zip能让你更快地开始工作,之后再考虑fetch)& 玄学:说不定fetch网络更好
咳咳
其实我们可以只clone最近的几次提交(浅克隆)
1 | |
如果需要完整的历史记录,可以通过 git fetch --unshallow 将浅克隆的仓库转换为完整的仓库;这个命令会拉取剩余的历史记录。
Peace
Ref
GPT-4