Git 学习笔记 - 1

$Git$分布式管理系统学习指南。

本文主要介绍$Git$的基本使用方法,未涉及关于$Github$的内容。

!!本文写于Linux环境下,若是window环境需自己酌情更改。!!

Step 0. $Git$是什么?

对于我来说$Git$就是一个文件管理系统,只不过记录了我所有的更改的文件管理系统,不过按照官方语言来说。
$Git$是一个分布式版本控制系统(Distributed Version Control System,简称DVCS),关于什么是分布式版本控制系统? 可以详见此文章

关于$Git$的一些特性

  • 直接记录快照,而非差异比较
  • 近乎所有操作都是本地执行
  • Git 保证完整性
  • Git 一般只添加数据

这边重点是$Git$有三个工作区的概念,这个对理解$Git$的大致运行很有帮助。

三个工作区分为:工作目录暂存区域Git仓库,这三个工作区之间的关系如下。

rela

对于工作目录有三种状态:

  • 已修改 (modified): 已修改,但是未保存到数据库中。
  • 已暂存(staged): 已经做了标记(add),但是还没有提交(commit)。
  • 已提交(committed): 已经保存到了本地数据库中。

对于工作区中的文件则有四种状态,分别为untrackedunmodifiedmodifiedstaged,其中后三种通称已追踪状态,因此大方向看也分为两种状态已追踪未追踪状态,具体就留到命令的时候再同时进行解释。

基本的$Git$工作流程如下:

  1. 在工作目录中修改文件。

  2. 暂存文件,将文件的快照放入暂存区域。

  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 $Git$ 仓库目录。

由于学习GUI的$Git$就失去了,原本的$Git$的味道了,所以选择学习的为命令行模式。

Step 1. 如何配置$Git$?

关于$Git$配置变量存放的默认位置。

在当前用户的家目录(~/)下会有一个.Gitconifg文件或者是~/.config/Git/里面的config文件,这个就是针对当前用户的配置。

在使用仓库(.Git/)里面的config文件是针对仓库的配置。

使用配置的优先级是 .Git/config > ~/.Gitconfig = ~/.config/Git/config > 系统Git配置变量

当然$Git$也提供git config命令来帮助设置配置变量。

设置与检查的命令

在每次安装完毕后我们都要对用户名邮箱进行设置,因为每次提交都会作为身份来使用。

1
2
3
4
5
6
7
# --golbal 表示全局配置
# 设置名字
git config --global user.name 'XXXX'
# 设置邮箱
git config --global user.email XXX@XXX.com
# 设置编辑方式为vim
git config --global core.editor vim

当然也可以直接在配置文件中书写配置,不过显然用命令会方便很多。

在配置完毕后,我们可以使用git config --list检查配置

也可以使用git config <key>来检单项配置,如git config core.editor

内置查询手册

1
2
3
4
# 关于Git命令的内置手册
git help
# 关于Git初始化设置的内置手册
git help config

step 2. 关于$Git$的基本命令

如果将本地整理比喻做‘家’,这一段的别名就成了整理家的艺术

本地初始化和获取远程仓库

初始化有两种方法从零开始接着干

本地目录初始化仓库

初始化命令如下:

1
2
3
4
5
6
#本地目录初始化仓库
git init
#将当前目录的所有文件加入追踪
git add .
#将文件保存到本地仓库中
git commit -m 'initial the repo'

在运行命令之后查看当前目录所有文件,会发现一个.git/的子目录,这个是上述命令创建的,里面包含了所有$Git$需要重要信息。
.git的存在表示了仓库初始化的完成,但是此时目录中的文件都是untracked状态,此时我们需要使用add命令将所有文件加入追踪,即工作目录变为(modified)。
最后则是使用commit命令将已更改(modified)变为已提交(submitted)

克隆获取远程仓库

1
2
#克隆获取远程仓库
git clone [URL]

这个方法是从远程仓库获取,获取下来后所有的文件已经处于可追踪(unmodified)状态。

追踪和提交文件

追踪和提交文件会对文件的状态进行更改,因此先解释关于文件的状态。

对于文件细致来说总共有四种状态关系如下:

rela2

$Git$提供了git status查询命令使得可以对目前仓库下文件的状态进行查询,但是需要注意unmodified的状态$git$不会给出,同时命令行中,文件会显示两种颜色,红色代表未追踪未暂存绿色代表已暂存

下面是对于每个状态的命令行返回示例。

untracked

➜ learn-git git:(master) ✗ 后面表示命令行输入。

learn-git git:(master) echo 'Try a Try' > README
learn-git git:(master)  git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

命令行的提示也给出了此文件是一个未追踪文件Untracked file:,在这一行下面的文件均为未追踪文件。

由于没有加入追踪,此时文件是处于$Git$管理外的,因此我们将文件纳入追踪,即直接将文件变未暂存状态。

staged [git add]

untracked to staged/tracked

learn-git git:(master)  git add README
learn-git git:(master)  git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

unmodified [git commit]

staged to unmodified

learn-git git:(master)  git commit -m 'add README File'
[master 2f0d641] add README File
 1 file changed, 1 insertion(+)
 create mode 100644 README
learn-git git:(master) git status
On branch master
nothing to commit, working tree clean

modified

unmodified to modified

learn-git git:(master) echo 'editor agian' >> README
learn-git git:(master)  git status
On branch master
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:   README

no changes added to commit (use "git add" and/or "git commit -a")

对于修改状态,命令行会在前面提示modified,十分清晰。

其他小技巧

当让我们也可以使用’git status -s’来简单查看文件的状态。

同时有时候我们使用git add .,但可能不需要将所有的文件加入暂存,比如生成的应用文件,由此我们可以在仓库中创建.gitignore文件来告诉$Git$哪些文件不需要纳入管理。

关于.gitignore的详细写法可以查看Git pro

撤销仓库中的操作

关于这里的部分详情可以查看书籍 | Here
个人建议使用git checkout -bgit merge命令回退修改并合并。

查看提交日志

可以使用以下命令来查看提交日志。

learn-git git:(master)  git log
learn-git git:(master)  git log --oneline 

其中第一行是查看详细的提交信息,而第二行只是简略信息。

· 打标签

假设正在写项目,通常需要发布版本号,或者标记工作已经完成一个部分的标志,这个时候就可以使用$GIT$中的打标记的命令,十分方便。

命令 案例 含义
➜ git tag ➜ ~ git tag 查看所有的tag
➜ git show <tag> ➜ ~ git show v1.4 查看tag: v1.4在本地仓库的具体信息
➜ git tag -l <option> ➜ ~ git tag -l "v1.*" 查找所有tag中符合option条件的tag
➜ git tag -a <tag> -m <else> ➜ ~ git tag -a v1.2 -m "lol" 创建附注标签
➜ git tag <tag> -lw ➜ ~ git tag v2.12 -lw 打轻量标签

详细可以查询 | Git-Book

· 使用远程仓库

获取远程仓库和查看仓库配置的远程服务器

  • 使用➜ ~ git clone <url/git>获取远程服务器
  • 使用➜ ~ git remote查看远程服务器的简写
    • 使用➜ ~ git remote -v查看远程服务器的简写和对应的url

实践如下:

Documents git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Enumerating objects: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0), pack-reused 1857
Receiving objects: 100% (1857/1857), 334.06 KiB | 3.00 KiB/s, done.
Resolving deltas: 100% (837/837), done.
Documents cd ticgit 
ticgit git:(master) git remote 
origin
ticgit git:(master) git remote -v     
origin    https://github.com/schacon/ticgit (fetch)
origin    https://github.com/schacon/ticgit (push)

添加,改名和删除远程仓库和详细查询

  • 使用➜ ~ git remote add <shortname> <url> 添加一个新的远程仓库

实践如下:

ticgit git:(master) git remote add pb https://github.com/paulboone/ticgit
ticgit git:(master) git remote -v                                        
origin    https://github.com/schacon/ticgit (fetch)
origin    https://github.com/schacon/ticgit (push)
pb    https://github.com/paulboone/ticgit (fetch)
pb    https://github.com/paulboone/ticgit (push)

  • 使用➜ ~ git remote rename <oldname> <newname> 仔细查询远程仓库的信息
  • 使用➜ ~ git remote show <shortname> 仔细查询远程仓库的信息
  • 使用➜ ~ git remote remove <shortname> 删除一个远程仓库

实践如下:

ticgit git:(master) git remote rename pb paul
ticgit git:(master) git remote
origin
paul
ticgit git:(master) git remote show paul
* remote paul
  Fetch URL: https://github.com/paulboone/ticgit
  Push  URL: https://github.com/paulboone/ticgit
  HEAD branch: master
  Remote branches:
    master new (next fetch will store in remotes/paul)
    ticgit new (next fetch will store in remotes/paul)
  Local ref configured for 'git push':
    master pushes to master (local out of date)
ticgit git:(master) git remote remove paul
ticgit git:(master) git remote
origin

· 使用自定义命令

有时候我们需要经常使用相同的一连串的命令,或者使用自己喜欢的符号来表示莫种命令,这时候就需要使用$GIT$的自定义命令功能来简便操作了。

  • 直接在命令行中设置别名
~ git config --global alias.new 'checkout -b'
~ git config --global alias.co checkout
  • ~/.gitconfig中设置别名
1
2
3
4
5
...
...
[alias]
co = checkout
new = checkout -b

Step 3. 我与$Git$的故事

关于我与$Git$的故事,那时候是刚上大学的时候,憨憨的使用着人工管理文件,那时候还不会使用$Github$这种有意思的东西,虽然现在也不会使用2333,却也还是在发呆的日子里,绑定了$Github$上面自己的$repo$开始了远程仓库之旅,那时候蛮傻的,只会$push$和$pull$这些操作,就连每次最基本的配置都要上网,寻找资料,才能完美的将$Github$和自己的机子慢慢的绑定,就这样过了一些日子(两年)。终于接触到了提交更改,为开源社区做贡献(修改错别字)的时候,那时候只能上网寻找教程的自己,意识到了自己关于理解$Git$的浅显,完全就如同一个阿三一样,只知道嗷嗷呜呜,呜呜嗷嗷。

然后就在暑假真正向着门里面的世界开始慢慢前行了。

Else. 参考书籍

Git - Book | Here



--------------------------END--------------------------
喜欢的话,不妨请我喝杯奶茶(≧∇≦)ノ