Git的基本原理 及 常用命令情景模拟

Git是一个分布式的版本控制系统,github可以用于管理项目版本控制。

msysgit是Windows版的Git,从http://msysgit.github.io/下载,然后按默认选项安装即可。


工作原理

在开始正式尝试使用之前,先简单看一下GIT的工作原理:


在本地GIT仓库当中,实际分为工作区和版本库。简单来说:

  • 工作区就是你存放工作文件的目录。
  • 而当执行git init创建本地git仓库之后,隐藏的“.git”目录下就是版本库。
  • 版本库当中有一个被称为“stage”或者“index”的暂存区。
  • 当我们申请创建仓库之后,git会为我们创建版本库中的第一个默认的分支“master”,既主分支。
  • 以及指向当前所使用分支的一个指针“HEAD”。
所以,当我们提交改动的时候,可以理解为:
  • git add将改动的文件提交到了暂存区。
  • git commit将提交到暂存区存放的改动文件,一次性提交到我们的仓库分支上。
注:图来自于http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

常用命令介绍


了解了基本原理,我们来看一下实际工作中最常用到的一些命令:

1、向git表明身份:

git config --global user.name "Your Name"

git config --global user.email "Your Email"

注:“global”参数代表当前机器上所有的GIT仓库都会使用这个配置。


2、将普通目录设置成GIT仓库:

git init


3、提交文件到GIT仓库:

git add 文件路径

git commit -m “提交说明”


4、查看GIT仓库中的内容的改动状态:

git status


5、如果有仓库状态有所改变化,查看变化的具体情况:

git diff 文件名


6、查看仓库中的历史“commit”记录:

git log 或 git log --pretty==oneline


7、版本回退

git reset --hard HEAD^

git reset --hard 版本号

注:

  • HEAD用于表示当前版本,^表示上一版本,^^则表示上上个版本,而例如100个版本之前,可以写作HEAD~100.
  • GIT每次通过“commit”执行提交时,会生成一个对应的通过SHA1计算出的“commit id”,也可以通过此来更改仓库的当前版本。


8、查看“未来”的“commit id”:

git reflog

注:昨天你GIT仓库回退到了某个版本,但今天打开电脑你重新考虑后还是应该换回昨天回退之前的版本。这个时候,通过“git log”命令已经无法得到该版本的“commit id”了,因为该版本的提交位于你回退的版本之后,你无法通过历史记录查询到该版本的id。这是reflog能够帮你解决。


9、用版本库中的版本替换工作区中的版本:

git checkout -- 文件名

注:该命令使用可以分为两种情况:

一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一此commmit或add时的状态。


10、撤销暂存区的修改内容(既撤销掉通过“git add”提交过的内容):

git reset HEAD 文件名

注:由此可以发现,“git reset”不仅可以回退版本,还可以撤销暂存区的改动。


11、删除文件:

git rm 文件名


12、添加远程仓库:

git remote add 远程仓库链接


13、推送改动到远程仓库:

git push origin master


14、从远程仓库获取改动内容

git pull origin master

注:

第一次提交时,可以使用git push -u origin master。之所以这样做是因为:

我们使用git push命令,实际上是把本地版本库中的master分支的内容提交到远程库。

加上“-u”参数,则代表不但会把本地master的最新内容推送到远程库新的master分支,还会将两个分支联系起来。


14、克隆远程仓库的内容到本地仓库:

git clone 远程库链接


模拟场景运用


了解了这么多GIT的常用命令之后,我们来模拟一些场景来联系一下真实的运用。使用GIT的最通常都的目的都是:多个人协同完成一项工作内容!

那么假设我们现在有如下情况:你和小明约好一起写一篇文章,你负责文章的上半部分,小明负责文章的下半部分。

于是,首先你和小明一起在github上创建了一个共同的远程仓库。假设,远程仓库的地址为:git@github.com:meAndxiaoming/article.git.


现在,远程库建立好了,你和小明都得到了远程仓库的地址,负责文章上半部分编写的你决定率先开始工作:

1、首先你会做好的你git配置,向git表明自己的身份,打开git命令行工具,输入:

  • git config --global user.name "me"
  • git config --global user.email "me@me.com"

2、完成git的初始你在自己的电脑上建立了一个文件夹“MyArticleRepertory”,用于存放文章。


3、此时建立的文件夹“MyArticleRepertory”只是一个在你的电脑上用于存放文档的目录,它还和git没有产生联系。为此,我们决定先在该目录下建立我们自己的本地GIT仓库,于是继续输入命令:

  • git init
4、此时,本地仓库的建立工作已经完成,你开始放心编写你的文章“MyArticle.txt”。天色不早了,你决定先睡上一觉。但为了写好的文章避免丢失,你决定先把它放进本地仓库里保管好:
  • git addMyArticle.txt
  • git commit -m "第一次编写工作存档"
5、第二天起床,你开始继续你自己的编写工作。一天劳累的工作完成,你又进行了一次提交,如步骤4相同。第三天了,当你起床时,你发现自己对于昨天编写的内容十分不满意,想要重新进行编写。所以此时,你需要将文章版本回退到第一天时提交的版本:
  • git reset --hard HEAD^
6、文章又回到了第一天完成的部分,你开始接着编写,这两天你的灵感似乎不太好。写写停停,新写出的东西,似乎老是不让你满意。没办法,你又只好摒弃新写的不满意的部分,恢复到之前的状态。这个时候,可能存在以下几种情况:

6.1:你只是在“MyArticle.txt”进行了编写工作:
  • git checkout --MyArticle.txt
6.2:你不止在“MyArticle.txt”中完成了编写工作, 还执行“git add”将改动提交了暂存区。
  • git reset HEADMyArticle.txt (首先,将暂存区的改动撤销)
  • git checkout -- MyArticle.txt(接着,将版本库里的内容覆盖掉我们工作区的内容,既撤销我们这次在工作区做的最新改动)
6.3:你不止提交改动到了暂存区,并且还“git commit”到了master分支上。
  • git reset --hard HEAD^(当你执行完了这么多操作,实际也就是完成了一次版本提交了,所以想要撤销改动,实际就是做版本回退的工作了)

7、这几天写作工作的不顺,让你着实有点心烦意乱,你新建了一个txt文件写下一些牢骚用于发泄,并且手贱的将他提交到了版本库。当然这种东西并不需要提交到远程库上,。所以你最终还是要选择删除它:
  • git rm 牢骚.txt.
  • git commit -m "发牢骚是我不对"

8、在你情绪最低落的时候,你爆发了,我尼玛不干了,随后你删除了MyArticle.txt。当你冷静下来,工作还是要继续,但是用于保存文章的MyArticle.txt已经被你删掉了。别怕,这是使用版本库的好处就体现了,你可以找回它,还记得checkout命令吗?

  • git checkout --MyArticle.txt
注:这时,我们再次加深记忆,checkout这个命令很多功能,它是将版本库的最新内容替换掉工作区的内容。
所以如果你工作区里该文件仍然存在,就显得是在做“撤销工作区改动”的工作。而如果该文件已经被删除,实际就显得是在做“文件恢复”的工作了。

9、低谷总会过去,你的灵感又回来了,你一气呵成完成了满意的文章上半部分。这时候,你决定将文章提交到远程库了。
  • git add MyArticle.txt
  • git commit -m “上半部分成功完成,小明快接着写下半部分吧!”
  • git remote add origin git@github.com:meAndxiaoming/article.git (首先,你当然需要将远程库添加你的本地库来)
  • git push -u origin master (将我们本地仓库的master分支与远程库的master分支绑定,并将本地分支上的内容全部推送到远程分支上。此时,我们的文章,实际就已经存放到远程仓库了)。
注:“git@github.com:meAndxiaoming/article.git”这种格式的链接,使用的是ssh协议。这种协议的好处是,速度更快和稳定。
我们可以通过git命令“ssh-keygen”来生成一个秘钥,并将此秘钥添加到github上。
完成此配置带来的另一好处留是:你 就不用再在每次对GitHub上托管的远程库进行操作时,都输入身份密码等口令了。
因为你之前通过“git config ***”命令已经对git表明了你的身份,所以git为你生成的密钥就相当于申请了一张你的“身份认证”,GitHub通过SSH协议解析秘钥,就可以知道这是你使用“你的Git账号”在“你的某台电脑”上的本地仓库对远程仓库进行操作。

10、小明在最初收到远程仓库地址后,由于负责的是下半部分,所以他也会先建立本地仓库并与远程库建立联系。随后呢,小明决定没事就看看上半部分的完成情况,于是:
  • git log

11、终于有一天,小明通过“git log”命令查看到了一次提交,并且发现注释为“上半部分成功完成,小明快接着写下半部分吧!”。小明很开心,马上着手将存放到远程库的上半部分克隆到本地仓库:

  • git clone git@github.com:meAndxiaoming/article.git


12、随后小明完成了下半部分的编写工作,将文章提交到了远程库,至此,你们的协同工作也就完成了。而假设你们的文章发表后,反响不错。于是你们决定写第二部。这个时候,你们中间如果有人想要从远程库获取最新改动,由于此时你们在自己电脑上已经有相关联的本地库了,就不必再使用克隆,只需要将远程库的最新改动“拉”下来就行了:

  • git pull origin master



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值