分布式版本控制GIT学习 - momoran/LeeCode GitHub Wiki

分布式版本控制GIT学习

什么是GIT?

GIT是分布式版本控制系统,什么是版本控制呢?举个例子,在我们撰写毕业论文的时候都有一个体验,(初稿,初稿1,终稿1,终稿2,最终稿…)一个文档有着不同的版本,当然不同版本都是出于某种原因进行修改的,为什么不删除前面的版本呢,这就是另一个神奇的现象,改着改着最后发现还是原来的改动比较好,这时候我们就需要找到原始版本,将原始版本的改动加到当前的修改中,但这又存在着一个问题,有时候版本太多了,我们可能忘记了哪个版本有我们的修改,这就使得我们只能挨个文档挨个文档查询找到相应的版本。有个好的解决方法就是在每个文档上加上我们对应修改的内容,也就是备注信息,这样就能很快找到相应修改在哪里,但是这样的结果就是我们的文件名很长不好维护。

GIT就是解决版本管理问题的一个工具,可以通过打标签加入到分支的对应修改节点,需要哪个修改节点可以回退到对应的版本,同时允许多个用户同时维护同一个功能,时进行版本管理的一个利器。

GIT存放的版本在哪里?

想搞清楚GIT存放的版本在哪里这个问题,首先需要明确两个概念,一个是集中式版本控制系统,一个是分布式版本控制系统,而我们GIT就是一个分布式的版本控制系统。

集中式版本控制系统:版本库集中存放在中央服务器,使用时从中央服务器取得最新的版本,事情干完之后将修改推送到中央服务器。其最大的缺点是必须联网才能工作。

分布式版本控制系统:分布式版本控制系统没有中央服务器的概念,每个人的电脑都是一个完整的版本库,版本库在自己的电脑上。Github是远程版本库,由于很少在两个人之间推送版本库的修改,主要原因可能是不在同一个局域网,互相无法进行访问等,因此我们将本地修改同步到远程库,协作的同时在将最新同步的修改更新进而达到协作的目的。

可能到这里我们会想问,我们每次进行修改都会将代码推送到远程仓库,这不就和集中式版本控制系统一样了吗,都有一个固定的中央服务器。这里需要注意的是,有两个概念,一个是本地仓库,是对自己本地的版本进行控制的,也就是说我们本地仓库存放的是我们本地的修改,别人无法知道我们修改了什么;而远程仓库可是说是本地仓库的备份,其他人也可以通过远程仓库进行协作。因此从结论上来看,我们GIT存放的版本在我们本地PC上

基本概念

工作区:电脑中初始化git init对应的文件夹为工作区

版本库:.git隐藏目录为git的版本库,版本库有叫stage的暂存区,还有git为我们自动创建的第一个分支master,以及只想master’的一个指针叫HEAD。版本库中有两个概念,一个是暂存区,一个是分支。比如我们第一步通过git add 命令将文件修改添加到暂存区,通过commit将暂存区的所有内容提交到当前分支。(add命令先将修改放在暂存区,通过commit将暂存区的所有修改提交到分支)

如何创建版本库?

  • 选择一个合适的地方,创建一个空目录

  • 它通过git init 命令把这个目录编程git可以管理的仓库(当前目录下会多一个.git的目录,这个目录是git来跟踪管理版本库,默认是隐藏的) (ps:版本控制系统只能跟踪文本文件的改动,)

  • 添加文件到git仓库,分成两步

    Step1:使用命令git add , 注意,可反复多次使用,添加多个文件;

    Step2:使用命令git commit -m ,完成。

常用的git命令

作用 命令
掌握工作区状态 git status
显示历史更新记录(最近到最远) git log; git log --pretty=oneline (简略版)
历史版本切换 it reset --hard commit_id(HEAD 指向的版本就是当前版本,上一个版本是HEAD^,网上多个版本对应的则是HEAD~100(100表示上移的版本数))
记录每次操作的命令 git reflog(回到未来版本,找到未来版本的ID)
显示差异 git diff(查看工作区和暂存区的差异; git diff --cached查看暂存区和仓库差异; git diff HEAD -- file查看工作区和仓库的差异
丢弃工作区的修改 git checkout – file;提交过修改用git reset进行回退;未提交则用git checkout
版本库删除文件 git rm file(删除工作区+暂存区文件)
关联远程仓库 git remote add origin git@https://github.com/momoran/LeeCode/learngit.git
推送代码 git push -u origin master 将当前分支master推送到远程
查看远程库信息 git remote -v
解除本地和远程的绑定关系,并非物理上的删除了远程库 git remote rm <name>
将远程库克隆到本地库 git clone 地址
切换分支 git switch -c dev; git checkout <branch>
查看分支 git branch
创建分支 git branch <name>
合并某分支到当前分支 git merge <name>
删除分支 git branch -D <name>
存储修改 git stash(存储当前修改,然后切换到另一个分支进行修改,修改完之后在切回原有分支); git stash list 工作区列表
恢复存储内容 git stash apply 恢复后stash不删除,git stash drop删; git stash pop 恢复后删除
丢弃没有合并过的分支 git branch -d <name>
打标签 git tag <tag> <commit id>
查看所有标签 git tag

创建远程仓库

创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

 ssh-keygen -t rsa -C [email protected]

需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容.

点“Add Key”,可以看到已经添加的Key:

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定有若干电脑,一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送。

关联远程仓库

  • Github创建一个新的git仓库

  • 本地仓库运行下面的命令

    git remote add origin [email protected]/momoran/LeeCode/learngit.git

origin表示的是远程仓库的名字,后面链接表示关联的远程仓库的地址

什么是标签?

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),标签的作用就是做一个标记,可以直接通过标签回退到相应版本(标签替代commit ID)

参考资料

廖雪峰GIT教程

⚠️ **GitHub.com Fallback** ⚠️