上一次在半小时学会使用Git(一)一文中,我主要记录了Git是什么东西,在Windows下安装Git以及使用Git创建仓库三大内容。那么作为该文的续篇,这篇文章我将主要记录历史版本管理和远程仓库github两方面的内容。
话不多说,直接进入正题。
一、历史版本管理
前面已经说过,Git作为分布式版本控制系统,它的核心功能就是做版本控制。所谓的版本控制,说白了不就是对迭代多次过后的历史版本进行管理,以实现修改保存新版本、版本回退、删除之类的功能嘛。在正式开撸这部分内容之前,我想先就工作区、暂存区、默认分支master和指针HEAD做个补充介绍。
上节已经说过,工作区就是创建的版本文件夹目录下没被隐藏的目录,即非.git目录,而.git则是Git的版本库,版本库中又分为stage/index(暂存区)、第一个分支master和指向当前分支的指针HEAD。大致关系如下图:
git add命令是把工作区的文件修改添加到暂存区;
git commit命令是把暂存区的内容提交到当前分支,此处指master,后面如果有新建分支,那么当前分支的含义就是Git控制台当前所处的分支;
同理,HEAD指针指向Git控制台当前所处分支,所以可以说commit命令是将暂存区中的内容添加到HEAD所指的分支之中。
好了,现在正式进入历史版本管理的内容。
1、版本回退
我们首先可以用git status命令查看当前的仓库状态:
On branch masterUntracked files:
(use "git add <file>..." to include in what will be committed)
py2048/.idea/
py2048/2048.ico
py2048env/
nothing added to commit but untracked files present (use "git add" to track)
提示消息告诉我们,有三个路径是没有添加到暂存区的。
由于这三个路径是我的python工程文件,暂时就不用他们做演示,而用我们之前创建好的readme2.txt文件,先来看看文件内容:
修改该文件,然后再看看仓库状态:
这次的信息就比上次多了,以下是多出来的提示:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use"git checkout -- <file>..."
to discard changes in working directory)
modified: readme2.txt
使用命令git diff readme2.txt具体看看改动了什么:
通过结果我们可以很清晰地看到改动,我们再用add和commit命令提交成为一个新版本(强烈建议读者跟随我的步骤一步步敲击,这会加深记忆)。
提交之后,使用命令git log --pretty=oneline查看提交记录:
输出内容的第一个字段,是Git自动生成的唯一提交ID,我们可以利用它来完成各种版本之间的跳跃穿梭。(HEAD->master)则是说明当前版本正处于哪里,最后的内容则是我们commit时添加的,可以理解为备注。当然,上面的显示是由于我们加了--pretty=oneline进行格式化,所以才用一行简洁呈现,如果不加也可以,只是会凌乱一些。
除了可以查看提交记录之外,我们还可以用git reflog查看历史命令:
前面我们知道了唯一提交ID,聪明的小伙伴肯定已经想到它是我们版本回退的利器!事实正是如此,我们可以用git reset --hard HEAD^来回退到上一个版本,而参数HEAD^则可以替换成HEAD~n(n=回退版本数),也可以直接干脆换成提交ID:
我的瞎改了几次之后,可以很明了地从上图看到提交历史。
2、管理修改
通过前面的内容,我们就可以很方便地在各个版本中穿梭游览了。
这一节内容,我就记录一些比较常用的管理修改的相关命令。
查看工作区和版本库的区别:git diff HEAD -- readme2.txt
让文件回到最近一次commit或者add的状态:
git checkout -- readme2.txt
另外命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区。
3、删除文件
删除文件可以有三种方法:直接从文件管理器删除、rm readme2.txt和从版本库中删除。前两种方法是等价的:
git checkout -- readme.txt恢复
从版本库删除:git rm readme.txt
恢复至版本库:git checkout -- readme.txt
二、远程仓库(以github为例)
通过前面的铺垫,我想对于如何玩转本地版本库大家应该都没问题了。不过光是本地版本库可根本体现不出Git作为一个分布式版本控制系统的优越性,版本控制系统从诞生之初就是为了解决多人协作的难题的。Git虽说是分布式(即每个关联在内的机子上都可以有完整的版本库),但其实一般使用时,我们也会创建一个中央库,这样一来所有人都从中取最新版本,在自己的分支改好了再合并进去,这不就完美了?
而github,就是这么一个网络项目托管平台。
本文第二点大内容,就是实现和github的连接,能够实现远程与本地版本库的互通。
既然是要使用github,当然免不了去官网注册账号,这一步很简单,就不赘述了。我们直接从 创建SSH key 开始:
ssh-keygen -t rsa -C "1558473134@qq.com":
检查创建是否成功:在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
创建成功后,登陆GitHub,打开“settings”,“SSH and GPG Keys”页面:然后,点“new SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
创建好ssh key后,就在github创建新仓库,这一步和本地差不多。
一切准备就绪,开始关联:
git remote add origin git@github.com:MountaSouth/py2048.git
把当前分支推送到远程:git push -u origin master
从上图我们可以看到,第一次push是出错了的,但是按照截图先将本地与远程版本库进行合并,然后再push,则可以完美解决问题。执行完毕过后,你会在github上看到和本地仓库一样的文件,这就说明成功了!
好了,半小时学会使用Git(二)到这里就结束了。
如果初学的小伙伴们想要了解更多,和我一起进步,那么欢迎添加个人VX公众号南山泛娱,下期文章再见!