文章目录
- 几个基本概念
- 版本控制
- Git的由来
- 分布式 vs 集中式
- Git
- SVN
- Git、GitHub、GitLab、GitWeb、Gitee的区别
- 动手进行版本控制
- 初始化Git
- 使用情景一:开发新项目
- 使用情景二:在已有项目上开发
- 设置代理
- 参考
几个基本概念
版本控制
在工作学习中,备份是一个十分重要的习惯,只有经历了硬盘损坏才明白数据无价的道理。
回想过去自己的备份习惯,通常是整个项目文件夹拷贝加上日期,有时候会加上个版本号。然而,这种方式虽然简单但却有着致命的缺点。首先,没有对文件进行更改追踪,就不能具体知道每个版本分别修改了什么(常常出现找不到代码的情况);其次,整个项目拷贝通常占用较大的存储空间。个人开发者还勉强能够接受,一旦涉及多人协同开发,这种管理方式往往是不可行的。
Git作为各大企业使用的版本控制工具,就像一个高级的时间机器,不仅仅能够让你回溯过去查看历史,甚至还能更改历史。
为了提高开发效率,学习并掌握Git是十分有必要的。
Git的由来
话说Git和著名的Linux是同宗同源,都是由Linus Torvalds开发的。21世纪初,Linux在世界上引起了一波开源浪潮,许多的开发者都向Linux提交代码,当时代码管理的任务是由微软的BitKeeper工具来实现的。但本着开源的思想,Linux开发者希望将 BitKeeper开源,因此触犯了微软的利益,结束了BitKeeper提供的服务。
这迫使 Linux 社区寻找或创建一个新的版本控制工具,最终,Linus Torvalds 用了两周时间开发了 Git,一直流传至今,成为当下最热门的分布式版本控制系统
分布式 vs 集中式
与分布式版本控制系统相对的还有集中式版本控制系统,最经典的就是Git和SVN,它们的差别如下:
Git
完整的代码库:每个参与者的机器上都有代码的完整拷贝。这不仅包括当前的代码快照,还包括整个历史记录。
不依赖中央服务器:虽然可以有一个“主”存储库供开发者推送更改,但每个开发者的本地存储库都可以独立工作。
更强大的分支和合并:DVCS通常提供更高级和灵活的分支和合并功能。
离线工作:由于每个开发者都有完整的代码库,因此他们可以离线工作,并在稍后同步更改。
SVN
中央存储库:所有的版本历史都存储在一个中央服务器上,开发者通常只获取代码的最新版本。
完全依赖中央服务器:如果中央服务器出现问题,可能会暂时阻止开发者进行版本控制操作,或者在最坏的情况下导致数据丢失(除非有备份)。
速度:由于所有操作都需要与中央服务器通信,某些操作可能会较慢。
需要网络连接:开发者需要连接到中央服务器才能提交更改,虽然本地工作可能仍然是可能的。
Git、GitHub、GitLab、GitWeb、Gitee的区别
- GitHub:全球最大的代码托管平台
- Gitee:国内最大的代码托管平台,因GitHub在国内较慢应运而生
- GitWeb:轻量化的基于Web界面的Git存储库,适用于个人搭建在服务器上
- GitLab:与GitHub类似的代码托管平台,相对于GitWeb有较好的权限管理功能,适用于搭建在团队的服务器上
- Git:以上这些平台都是基于Git工具
动手进行版本控制
实践出真知。这里以GitHub为例,提供了两种最常见的情况下使用Git的方法。推荐在Windows环境下使用Git Bash
初始化Git
初始化在环境配置阶段仅需要完成一次,在不更换电脑和不修改Github账户的情况下无需再操作。
- 初始化本地的git用户信息,该信息只用于标记操开发者,不用于身份验证:
git config --global user.name "Your Name"
git config --global user.email "Your Email"
- 建立安全连接,建议使用SSH(Secure SHeel)的方式进行连接。首先在本地生成ssh key,回车按照默认信息即可:
ssh-keygen -t rsa -C "Your Email"
- 添加ssh key到GitHub,GitHub上依次点击头像->settings->SSH and GPG keys->New SSH keys
Git操作的对象通常是一个仓库,因此每个项目工程都应该建立一个仓库,而不建议一个仓库下放多个项目文件。
使用情景一:开发新项目
该情景适用于在完成一个新项目的第一个版本后,需要将该版本备份的情况。
- 在GitHub上新建一个远程仓库,仓库名称尽量项目名称保持一致
- 在项目下初始化一个本地仓库:
git init
- 将本地仓库链接远程仓库:
git remote add origin <repository-url>
- 修改主分支为main,否则将会默认添加到master分支:
git branch -m main
- 将项目代码添加到暂存区:
git add .
- 提交更改至本地版本库:
git commit -m "Your commit message here"
- 拉取远程仓库到本地进行合并:
git pull origin main
注意:如果提示 fatal: refusing to merge unrelated histories 是因为本地仓库和远程仓库的历史修改信息不同步(此时远程仓库可能不为空)。解决方案是不考虑他们的历史是否有关联(由于是新仓库,该操作合理):
git pull origin main --allow-unrelated-histories
- 推送到main分支:
git push origin main
- 回到GitHub即可看到新提交的文件
使用情景二:在已有项目上开发
该情景适用于在已有项目上继续开发新的功能,或者基于已有项目进行学习和开发。
由于克隆的仓库中本身存在git仓库,因此不需要使用git init来初始化一个仓库
- 从远程仓库中克隆一个到本地仓库:
git clone <repository-url>
- 进入仓库目录:
cd <repository-name>
- 切换到要推送的分支(如果你不在那里):
git checkout main
- 执行所需的代码更改,并将它们添加到暂存区:
git add <changed-files>
- 提交更改至本地版本库:
git commit -m "Your commit message here"
- 拉取最新的远程更改以确保没有冲突(可选,但推荐):
git pull origin main
- 推送更改到远程的main分支:
git push origin main
设置代理
- 打开SSH配置文件,没有就新建一个:
touch ~/.ssh/config
- 在配置文件中添加代理,这里我用的是socks代理,开启v2ray后转发至10808端口:
Host github.com
ProxyCommand connect -S 127.0.0.1:10808
- 重启git后生效,即可加速下载
参考
- https://git-scm.com/