目录

A Brief Tutorial Of Git

上一篇Gogs的搭建写完之后,我稍微想了一下,可能很多人还是不懂什么是git,我们怎么用git。所以写一篇简单的文章来介绍一下什么是git和怎么使用git。

要注意,这篇教程内容并不多,只会教你上路和简单的问题处理,如果你想深入学习,文末会给出更多信息。

0. 引言

无论是些什么,只要是做一个项目,总会有版本控制的说法。什么是版本控制呢?其实很简单,一份产品,就比如代码,在最终成型前肯定是有很多版本的,而版本管理系统出现就是为了帮你管理这些东西。

在git之前有很多版本管理系统,诸如SVN、Darcs等,而在git出现之后,几乎全世界都开始学习和选择git了——包括Google和微软、苹果等大型企业。

git是Linux之父Linus写的,诞生初衷就是为了给Linux的开发提供一个更好的版本管理工具,这里面还有个故事,有兴趣的同学搜搜看!

值得称道的是,现在的git仍然保持着超凡的活力——2016年Git从v2.7升级到了v2.11,也就意味着有5大新特性被加入,代码提交量也比2015年多出15%。甚至这些代码的管理,也是通过git!

Talk is cheap, show me the code. - Linus Torvalds

相信大家已经了解到了Git的魅力了,那我们就开始讲解吧。

1.安装

安装其实很简单。

如果你是Windows用户,官网下载最新版就行,双击.exe安装就够了。

如果你是Linux用户,使用包管理器安装就行,比如:

1
2
sudo apt update
sudo apt install git -y

如果你是Mac用户,用Homebrew装就够了,从官网下载或者安装Xcode也可以。

注意,在本篇教程不会讲如何使用GUI客户端来进行管理,一切都是跑在命令行下,如果你想获得有关GUI客户端的内容,可以看官网的GUI统计页面,这里不做更多讲解了。

2.使用

注意:阅读此部分时默认你已经安装好了git而且会使用终端进行git操作。

  1. 新建一个库

    欢迎开始使用git。首先,当我们要开始内容管理的时候,我们就需要新建一个库,告诉系统:兄弟,你给我管管这里的内容。

    1
    
    git init
    
    https://assets.lxdlam.com/img/1665505564_8ed08e6a.png
    图 1
  2. 提交内容

    好了,当我安装完毕以后,我写了点东西,比如readme.md

    现在,让我们看一看git发现了些什么:

    1
    
    git status
    
    https://assets.lxdlam.com/img/1665505562_633b6fd0.png
    图 2

    聪明!git已经发现了我们新建了一个readme.md,但是它不确定我们跟不跟踪。当然跟踪!让我们把它添加进去:

    1
    
    git add readme.md
    

    让我们现在再看一看现在的情况:

    1
    
    git status
    
    https://assets.lxdlam.com/img/1665505563_d40395c9.png
    图 3

    OK,看来git已经开始管理我们的文件了!让我们推送吧!

    1
    
    git commit -m "Add readme.md"
    

    让我们再看看现在的情况

    1
    
    git status
    
    https://assets.lxdlam.com/img/1665505558_30ade332.png
    图 4

    结束啦!现在我们的readme.md已经被git接管了,大家可以放心修改。

  3. 修改文件与删除文件

    好了,现在我加了两行内容,并且改了一点东西。

    1
    
    git status
    
    https://assets.lxdlam.com/img/1665505559_ac1e45f5.png
    图 5

    等会儿,我忘了我刚才的readme.md是什么内容了,让我看看我改了些什么:

    1
    
    git diff readme.md
    
    https://assets.lxdlam.com/img/1665505561_33aa3644.png
    图 6

    说了些什么?

    • -/+的一组,说明你进行了修改,原先为-这一行,被你改成了+这一行
    • -这一行被删除了
    • +这一行是新增的

    OK,看起来和我想的一样,推送了!

    1
    2
    
    git add *
    git commit -m "A test.cpp, test.c; M readme.md"
    
    https://assets.lxdlam.com/img/1665505560_bc2f4dae.png
    图 7
  4. 回溯与取消暂存

    Wait!test.c不应该提交啊!有大Bug!

    1
    2
    
    git rm test.c
    git status
    
    https://assets.lxdlam.com/img/1665505540_d751106f.png
    图 8

    没错!推送了~

    1
    
    git commit -m "D test.c"
    

    ……等会儿,我刚刚想了一下,我没写出Bug!啊啊啊啊!

    吓得我看了看我的文件:

    1
    
    ls
    
    https://assets.lxdlam.com/img/1665505542_7a4d6c34.png
    图 9

    完了,血崩了。

    嘿!不要急,让我们看看之前提交了什么:

    1
    
    git log
    
    https://assets.lxdlam.com/img/1665505551_f2b8539b.png
    图 10

    哇,看到commit 66fc57567df98723f609842cf43b2b59bb672429这条commit的提交就知道我们在这里提交了test.c,迅速回溯到这一条上!

    1
    
    git reset --hard 66fc5756
    

    不用写完,它会自己找那个版本。让我们看看怎么样了:

    1
    2
    
    git status
    ls
    
    https://assets.lxdlam.com/img/1665505550_0fe95b57.png
    图 11

    Yes!都回来了!

    提示:假如要回到上一个版本,则不用这么麻烦,使用git reset --hard HEAD^即可。

    好了,老老实实干活吧。

    1
    2
    
    git add *
    git status
    
    https://assets.lxdlam.com/img/1665505548_77f36aa2.png
    图 12

    且慢!我刚才加的这个文件似乎还没弄完,不应该现在提交的。

    1
    2
    
    git reset HEAD important.c
    git status
    
    https://assets.lxdlam.com/img/1665505549_4176da11.png
    图 13

    OK啦,开始工作吧!

到这里为止,你已经掌握了本地版本跟踪的有关内容了。当然,这并不是全部,很多高级仓库操作可以在更多部分看其他内容学习,但是你现在已经能管理自己的代码了,不是吗?

简单复习
  • 新建一个库:git init
  • 跟踪文件:git add <文件名>
  • 提交更新:git commit -m "<提交信息>"
  • 查看状态:git status
  • 查看修改:git diff <文件名>
  • 删除文件:git rm <文件名>
  • 查看提交历史:git log
  • 版本回溯:git reset --hard <版本号>
  • 撤销文件提交:git reset HEAD <文件名>

3.网络远程库

欢迎来到有关网络远程库的内容。

网络远程库以Github为例介绍,大家同样可以选择来自国内的优秀git托管服务如Coding或者开源中国(码云)。

怎么注册Github就不做过多提示了,直接前往Github主页跟着提示一步步来就行。

下面重点讲如何使用远程库:

  1. 设置你的用户名和邮箱

    在一切操作之前,请先设置你的git用户名和邮箱

    1
    2
    
    git config --global user.name "<用户名>"
    git config --global user.email "<邮箱>"
    

    然后查看一下

    1
    2
    
    git config user.name
    git config user.email
    
    https://assets.lxdlam.com/img/1665505543_7b86c82f.png
    图 14

    嗯,都对了。

  2. 创建仓库与初始化

    点击右上角用户头像左边的加号,选择"New repository",创建一个新的在线仓库,我把它命名为test。

    https://assets.lxdlam.com/img/1665505544_6f8d628d.png
    图 15

    之后你会看到这个页面:

    https://assets.lxdlam.com/img/1665505547_22c4d1f3.png
    图 16

    这个页面上提供了4种方法来初始化这个仓库,让我们详细了解一下:

    1. 克隆

      你可以看到它给出了一个链接,你可以使用

      1
      
      git clone <链接>
      

      直接把仓库克隆到本地,当然了,克隆的时候会要求你不能克隆到已经内容的地方。

      克隆后你可以使用你的账号直接推送上去。

    2. 新建仓库并关联到在线仓库

      这六行命令讲了什么呢?

      1
      
      echo "# test" >> README.md
      

      新建了一个README.md文件并把"# test"内容打进去。

      1
      2
      3
      
      git init
      git add README.md
      git commit -m "first commit"
      

      这里大家应该都知道,初始化仓库→跟踪README.md,更新仓库。

      关键是这两句:

      1
      2
      
      git remote add origin https://github.com/lxdlam/test.git
      git push -u origin master
      

      这两行是关键,第一行说明了添加一个名字为"origin"的远程仓库,这个仓库地址为"https://github.com/lxdlam/test.git"。

      第二行说明了把现有内容推送到origin这个远程仓库的master分支(这篇文章不讲分支的,请看更多部分来进行学习。)

      注意:-u参数仅在首次使用时需要添加。

    3. 关联已有仓库到在线仓库

      其实就是刚才所说的两行命令:

      1
      2
      
      git remote add origin https://github.com/lxdlam/test.git
      git push -u origin master
      
    4. 从其他地方导入代码

      (这就触及到我的知识盲区了.jpg)

      这部分不在本文的讨论内容中,略过~

    四个方法介绍完了,我们自然选择第三个。

    https://assets.lxdlam.com/img/1665505546_a875d6af.png
    图 17

    在推送过程中,git会向你提出认证请求,登陆你的Github即可。(我的地址和你们看起来不一样,因为这是配置了SSH私钥的关系,这部分也不在本文讨论范围内)。

  3. 查看在线仓库以及获取更新

    假设你在某个地方更新了内容,然后回到了家,想起来你写的那个功能没写完,那就下载下来写吧!

    首先看看改了什么:

    1
    
    git fetch
    

    这条命令会向在线仓库请求目前最新的状态信息,你发现有更新,于是

    1
    
    git pull
    

    这条命令从在线仓库下载更新后的最新仓库。

    https://assets.lxdlam.com/img/1665505555_4f5c94fe.png
    图 18

    好了,开始工作吧!

  4. 解决冲突

    这天你睡眼惺忪,在家写了个功能匆匆忙忙提交上去就跑了。然后你又在另一台电脑上写了个新功能,然后打算提交。但是你迷糊,git可不迷糊:

    https://assets.lxdlam.com/img/1665505556_20432402.png
    图 19

    哇!尴尬!

    赶快看看是发生了什么:

    1
    2
    
    git fetch
    git status
    
    https://assets.lxdlam.com/img/1665505554_258efc4c.png
    图 20

    按提示试试看:

    1
    
    git pull
    

    Oops,好像不对,再看看是发生了什么:

    1
    
    git status
    
    https://assets.lxdlam.com/img/1665505552_44a4cf55.png
    图 21

    这下结果很明显了,是ok.c出问题了。看看什么问题:

    1
    
    git diff ok.c
    
    https://assets.lxdlam.com/img/1665505555_681655e3.png
    图 22
    • 提示符++<<<<<<< HEAD下面的内容是当前本地HEAD分支下文件内容
    • 提示符++=======分隔两个冲突分支
    • 提示符++>>>>>>> <commit id>上面的内容是在commit id分支下的内容。

    那么我们怎么解决这个冲突呢?

    1. 我们可以编辑,比如备份一下本地的ok.c,然后改成和在线库一样,然后git pull,再做修改。
    2. 使用git mergetool,这是一个交互式合并工具,会挨个询问你冲突文件该怎么办,回答即可。

    具体的自行选择吧。(关于mergetool的选择不在本文讨论范围内)。

    最后不要忘了推送现在的修改:

    1
    
    git push origin master
    

    好了,介绍到现在也就结束了,相信你已经会使用自己的在线托管仓库了。

然而,这篇教程简单到根本没讲多人协作,所以你可以看更多部分的其他教程学习多人协作中多分支的使用、如何创建更新标签,以及如何设置忽略策略等。

简单复习
  • 克隆一个在线仓库:git clone <仓库地址>
  • 关联本地仓库到在线仓库:git remote add <仓库名> <仓库地址>
  • 推送本地仓库:git push origin master
  • 查看在线仓库信息:git fetch
  • 从在线仓库下载更新:git pull
  • 冲突解决的一般顺序:git fetchgit pullgit diff <相关文件>→进行冲突解决处理

4.更多

正如开头所说,我只引大家上路并处理一下简单的问题,更多的操作,你可以参考:

  1. 廖雪峰大神的半小时git教程
  2. Git官网的文档

当然,你也可以买两本书看看:

  1. 《Github入门与实践》
  2. 《GitHub实践》

当然了,Github也有很多玩法,比如用Pages托管一份自己的博客(我之后可能会写文)等等。

还有,你也可以选择搭建自己的Git服务,一台服务器,跑上一个Linux系统就行,选择腾讯云这些来搭建都是很推荐哒。具体你可以参考:

  1. 小型服务,低配置要求:Gogs(看我这篇文章
  2. 大型服务,高配置要求:Gitlab

最关键的,现在你已经知道怎么获取他人的代码了,从现在开始,去Github上找自己喜欢的代码开始学习吧。

更大的世界等待着你!