Git 全面剖析

前言

  • 说明:本文是为了给公司员工培训而编写的教程,意在深度理解git原理,不适合“快餐式”学习,适合“刨根问底”式学习。理解本文内容,可以解决git常见的一切问题。

Git学习官方网址:https://git-scm.com/book/zh/v2

主要学习内容:git原理、git命令。

githug游戏----git学习游戏:https://github.com/Gazler/githug

将git基本操作,设计成游戏卡关的方式,主要学习git命令行。

正文

一. 起步

1.1 Git工具

Git操作工具比较多,主要分为命令行和图像化工具,本文主要介绍:iTerm2(命令行)SourceTree两种工具。

1.1.1 命令行工具:
上面的配置工具包含:
1. iTerm2:一个终端模拟器,比macOS系统自带的终端好用太多。
我刚接触到iTerm2时的时候是极力抗拒的,但是发现了她的好自后,我宁愿花上20分种时间配置一个iTerm2环境出来。
具体我不多说,谁用谁知道
2. Solarized:为iTerm2增加配色方案
3. Zsh:使用brew更新macOS自带的zsh(brew是macOS下强大的包管理工具)
4. Oh My Zsh:用来管理 Zsh 配置的,自带了好用的基本配置,基本都是 Zsh 的标配了
5. tmux:一个终端复用软件,可将终端方案化

配置完成的效果如下:

dir.png
git.png

配置完成的效果如下:

cmder.jpg
1.1.2 图形化工具
  • SourceTree:最好用的Git图形化工具,没有之一。
    官网地址:https://www.sourcetreeapp.com
    接下来我们以最受欢迎的Swift的http请求项目Alamofire为例子,查看SourceTree效果。
SourceTree的UI界面.png
优势:
1. 强大的UI操作,远端和本地分支清晰分明。
2. 强大的分支流显示,可以显示每个分支的状态,以及合并状态。这是我使用它的重要原因。
3. 简单,入门比较低,但是如果不懂git底层原理,容易造成误操作。

不足:
1. 与基本命令行相比,功能不够完善。
2. Git状态显示延时,不够流畅。

1.2 Git配置

1.2.1 用户信息配置

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中。

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

解释说明
--global:配置全局的信息

  • 疑惑:那我们为什么要配置用户名和邮箱呢?
    这便于我们在提交代码时候查看到开发者信息,方便找到提交的作者。

git log查看git提交记录命令中,正如Author信息所显示:Christian Noon为作者,christian.noon@gmail.com为邮箱。

gitlog效果.png

SourceTree查看提交的作者信息,效果如下

sourcetree log.png
1.2.2 查看用户配置信息

当你配置完成用户信息,想要查看用户信息是否配置正确可以执行一下命令

$ git config --global --list
git config.png
1.2.3 SourceTree查看配置信息

Mac版的SourceTree配置用户名和地址如下:

sourcetree config.png

二. Git基础

2.1 忽略文件

顾名思义,忽略文件,也就是不需要加入Git版本控制的文件,文件形式为.gitignore文件。比如macOS系统中的.DS_Store文件。

依旧以Alamofire为例,查看他的.gitignore文件

gitignore.png

查看.gitignore文件内容

gitignore content.png

疑惑:我的个XXX,这又是 . * / 什么鬼意思,那我的项目需要加入什么样子内容的.gitignore呢?

淡定,别急,我们同性交友网站的大神们帮我们整理出来了网页地址如下:https://github.com/github/gitignore

下面是我贴出来的部分.gitignore的文件:

gitignore list.png

找到属于你的语言的.gitigonre文件,使用命令行工具,加入项目中。

如果你不知道怎么创建.gitignore文件我也告诉你,方法如下:

1. 用命令行工具(iTerm2)打开项目根路径

2. 然后 vim .gitignore ,创建或者编辑 .gitignore 文件

3. 然后将 gitignore 官方提供的 gitignore 提供的内容拷贝下来,
粘贴到 .gitignore 文件中,推出并且保存。到此 .gitignore 文件添加成功

4. 你还可以用 cat .gitignore 命令查看自己的.gitignore文件是否添加正确

  • 提高部分:
    探究或者增加自己的.gitignore内容,可以阅读以下地址的忽略文件章节
    网址:.gitignore忽略文件学习

2.2 获取Git仓库

两种方式获取一个git仓库

1. 在现有目录中初始化仓库

打算使用Git对现有项目进行管理,只需要进入该项目的根路径,可以使用cd命令进入该项目路径

$ git init
git init.png

当你完成git初始化命令之后,你会发现,在项目的根目录下多了一个.git的文件夹,那个git进行版本控制的最核心的文件夹。

git dir.png

Tips:Mac如何显示隐藏文件呢?之前一直使用命令行,我日,那个方法太麻烦了。现在我教你一个最简单的方法,一般人我可不告诉他,哈哈。显示或隐藏隐藏文件快捷键:Command + .

2. 克隆现有的远端仓库

Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git

// git协议
$ git clone git@github.com:Alamofire/Alamofire.git
// https协议
$ git clone https://github.com/Alamofire/Alamofire.git

克隆一个远端仓库需要两点注意的问题:

  • 克隆后的项目路径问题:因为本人有点小洁癖,对这个克隆后的文件路径都很严谨
    我们以克隆AlamofireImage为例子,我想在Project文件夹下,克隆这个开源项目。
git clone exmple.png

解释说明:

命令说明:
pwd:输出当前所在路径
ls -a:查看当前文件夹下所有的子文件

克隆结果说明:
当前目录下创建一个名为 “AlamofireImage” 的目录,并在这个目录下初始化一个 .git 文件夹,
从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 
如果你进入到这个新建的 AlamofireImage 文件夹,你会发现所有的项目文件已经在里面了,
准备就绪等待后续的开发和使用。
  • 克隆方式选择:https方式一般需要输入账号密码,git方式需要配置ssh。
3. 使用SourceTree克隆远端仓库

点击顺序:新仓库->从URL克隆,弹出第二个页面。

git clone sourcetree1.png

克隆仓库时,输入信息说明:

源URL:是远程仓库地址
目标路径:你想要在电脑磁盘保存的路径,这里需要自己增加项目仓库的名称
名称:项目仓库的名称

注意事项:第一次克隆项目如果是https需要输入用户名和密码,如果是git方式
并且你的ssh密钥有密码需要你输入密码。
git clone sourcetree2.png

2.2 记录每次更新到仓库

2.2.1 文件状态查看
  • 请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪
    • 未跟踪:Untracked(未跟踪)

    • 已经跟踪:Unmodified(未修改)、Modified(已修改)、Staged(已暂存)

    • 总结:第一次理解这个图片比较难,但是理解之后,你就会发现,对于git文件状态你就完全掌握。

git status

各种状态剖析:

  • Untracked(未跟踪):
    • 新增加的文件
    • 从git跟踪中移除(git rm --cached <file path>)

untracked.png

图片说明:我创建了一个status.txt文件,在使用git status命令时,他已经变成一个Untracked(未跟踪)文件。

  • Staged(已暂存):
    • 使用git add命令跟踪文件,只要一个文件被git add过,它就变成Staged状态(可以被git add状态是UnmodifiedUntracked)

staged.png

图片说明:图片中的"changes to be",意思是status.txt文件已经被暂存,你可用于提交。

  • Unmodified(未修改)
    • 已经提交的文件状态:git commit提交修改文件,文件状态将变成此状态。
    • 丢弃这个文件的当前修改:git checkout -- <file path>
unmodified.png
  • Modified(已修改)
    • 已经提交的文件,修改此文件,他会变成此状态。
    • 已经暂存的文件,修改此文件,他也会变成此状态。
Modified.png

图片说明:我使用vim命令编辑了status.txt文件,在用git status命令查看文件状态时,它已经变成已修改状态了。

2.2.2 查看文件状态

使用git status查看项目所有文件状态,其中包含哪些文件时新增被修改被删除已暂存等等,其实就是上面四种状态的具体形式的反应。

$ git status
git status demo.png
  • SourceTree查看文件状态

黄色的"-"号表示Modified(已修改)文件,紫色的"?"表示Untracked(未跟踪)文件。当然还有其他状态文件,途中没有尽列出来。


source git status.png
2.2.3 跟踪并暂存文件

对于新建文件,或者已经从git跟踪中移除的文件,或者已经修改的文件,使用git add命令,让他们变成已经暂存的状态。

// 跟踪并暂存单个文件
$ git add <file name>

// 跟踪并暂存所有文件,常用!!!
$ git add -A
git add.png
  • SourceTree跟踪并暂存文件
    • 跟踪并暂存单个文件,相当于命令git add <file name>
    • 跟踪并暂存所有文件,相当于命令git add -A或者git add .
sourcetree add.png
2.2.4 查看已暂存和未暂存的修改
  • 查看未暂存的修改

尽管 git status 可以看到路径下那些文件发现变动,但是我们无法知晓具体改动那一行代码?而git diff 将通过文件补丁的格式显示具体哪些行发生了改变。

// 查看未暂存文件的修改
$ git diff
git diff.png

注意事项:"+"号标识的是修改中增加内容,同理推测,"-"标识的就是修改中删除内容

  • 查看已暂存的修改

若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。)

$ git diff --cached <file path>
git diff --cached.png
  • SourceTree 查看已暂存和未暂存的修改
    点击顺序:文件状态->已暂存文件(未暂存文件)->选择具体文件名->查看文件状态
sourcetree add file.png
2.2.5 提交更新
  • 可以提交的条件:确认所有的新建或者修改被git add过,因为git无法记录未暂存的变动。
  • 规避提交遗漏:先用git status看下,是不是都已暂存起来了,然后在运行提交命令git commit
$ git commit
  • 注意事项:这种提交方式会启动文本编辑器以便输入本次提交的说明。
git commit.png
git commit msg.png
git commit success.png
  • 图片说明:
    • 输入提交内容,以"#"为开头的行将被忽略,如果你输入的内容为空,提交将被中断。
    • 提交成功后,在反馈信息中会有本次提交的修改信息。(包含文件个数,增加行数,删除行数)

我们比较常用的方法,会在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:

$ git commit -m "<commit message>"
git commmit -m.png
  • 使用SourceTree提交,三部曲:
sourcetree commit.jpg
2.2.5 移除文件
  • 移除文件的三种方式
    • rm <file path>: 将文件只从磁盘中移除
    • git rm --cached <file path>:将文件只从git暂存中移除
    • git rm <file path>:相当于上面两个操作的合并,将文件从磁盘和git暂存中同时移除。

2.3 查看提交历史

这边涉及的知识点比较零散,一般使用者只要知道基本命令就行,不做详细的说明。
具体可以看官网教程,我在这边附上链接:官方文档-查看提交历史

  • 查看最基础的git提交记录
// 查看提交记录,最简单的数据呈现
$ git log
git log.png
  • 查看前某几次的提交的变动
// 参数说明:"-1"表示最后一次提交的变动,以此类推"-2"则是最后两次提交的变动
$ git log -p -1
// 查看作者为caiqiujun的,提交前最后一次的变动
git log --author=caiqiujun -p -1
git log -p -1.png
  • 查看某个文件的变动记录(俗称:找锅)
// file path为文件路径
$ git log -p -- <file path>
git log -p -filename.png
  • 查看分支的图形化变动

目的:分析当前分支的合并情况

$ git log --graph
git log --graph.png
  • SourceTree 查看历史变动情况,三部曲:
sourcetree log.png

2.4 撤消操作

2.4.1 将修改补充到上次提交中

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:

$ git commit --amend
git commit --amend.png

图片说明:

  1. vim编辑 forget.txt 文件
  2. git add -A 将文件暂存
  3. git status 查看文件状态,确认文件已经暂存
  4. git commit --amend 将forget.txt提交到上次提交中
2.4.2 撤消对文件的修改
  • 需要撤销的文件--未暂存

有时候我们需要,放弃对某个未暂存文件的修改,可以使用git checkout 命令丢弃文件修改,这是一个很危险的命令,一旦丢弃就无法找回。

git checkout --filename.png

图片说明:

  1. git status查看文件forget.txt文件是已修改状体
  2. git checkout -- <file name> 撤销该文件修改
  3. git status 在此查看文件状态,已经没有被修改的文件了,对forget.txt文件修改撤销成功。
  • 需要撤销的文件--已暂存
git reset HEAD.png

图片说明:

  1. git status 查看文件状态,forget.txt为已经暂存的修改
  2. git reset HEAD <filename> 放弃暂存文件
  3. git status 查看文件是否已经变成未暂存状态
  4. 再调用上一小节 git checkout -- <file name> 撤销对文件的修改。
2.4.3 SourceTree 撤销操作
  • 将忘记提交的文件补充到赏赐提交中,类似于git commit --amend
sourcetree git commit amend.png
  • 撤销该文件的修改,到赏赐提交的状态,类似于 git checkout -- <filename>
sourcetree checkout -- filename.png
  • 将文件变成未暂存文件,类似于git reset HEAD <filename>
sourcetree reset HEAD.png

2.5 远程仓库的使用

2.5.1 查看远程仓库

如果想查看你已经配置的远程仓库服务器,可以运行 git remote -v 命令,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。

$ git remote -v 
git remote -v.png
2.5.2 添加远程仓库

运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写:


git remote add.png
2.5.3 从远程仓库中抓取与拉取

从远程仓库中获得数据,可以执行:

$ git fetch [remote-name]

这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作

运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支

$ git pull [remote-name]

这个操作比较危险,因为她会自动帮你合并,或许有时候你只想看看远端仓库,有没有其他开发者更新了代码而已。

2.5.4 远程仓库的移除与重命名

如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。

$ git remote rename [old-name] [new-name]
git remote rename [old] [new].png

如果因为一些原因想要移除一个远程仓库,可以使用 git remote rm [remote-name]

$ git remote rm [remote-name]
git remote rm.png
2.5.5 SourceTree 远端仓库操作
  • 配置远端仓库

首先看远端仓库的增删改查:设置->远端仓库->其他操作...


sourcetree remote -v.png
  • 执行抓取操作

注意点:一定要勾选第二复选框。

比如:团队里面其他开发者删除了一些远端分支,在你的git远端分支依然还显示者那些分支。如果你尝试勾选它时,在抓取一次,你就会发现那些已经删除的分支消失了。

sourcetree fetch.png
  • 执行拉取操作
sourcetree pull.png

三. Git 分支

3.1 分支简介

分支原理介绍请参照官网:官网地址

3.1.1 分支创建

创建分支,原理就是创建一个新的可以移动的分支。如下命令是创建一个testing分支

$ git branch testing

注意事项

  1. 创建分支之前最好保证所有修改已经提交,即工作树是干净的。
  2. 创建新分支时,会拷贝当前分支代码。(从分支原理可以解释)
  3. 创建分支后,不会主动切换到新建分支上,必须执行git checkout [branch-name]命令切换分支。如果你想创建一个新分支,并切换到新分支上可以执行git checkout -b testing 命令
git branch [branch-name].png

3.2 分支合并

如果你想将testing分支修改的内容合并到master主分支上,你可以执行以下操作:

// 切换到master分支
$ git checkout master
// 将testing分支合并到master分支
$ git merge testing
git merge testing.png

注意事项

  1. 创建分支之前最好保证所有修改已经提交,即工作树是干净的。
  2. 分支合并完成如果有冲突,需要解决冲突,在作出一次新的提交。
  • 冲突原因

两个分支不同的代码块修改了同一代码区域,git不能判断需要保留哪个分支的提交。

  • 冲突案例分析
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
  • 冲突区域模型
<<<<<<< 分支A

[冲突代码块]

=======

[冲突代码块]

>>>>>>> 分支B

解决冲突步骤

  1. 读懂冲突代码实现的功能
  2. 构建最终需要的代码
  3. 删除冲突标记<<<<<<<(冲突开始标记) 、=======(两个冲突分割标记) 、>>>>>>>(冲突开始结束) ,最终让整个文件变成一个正常的代码文件。
  4. git add 缓存修改,git commit 完成冲突修改提交

3.3 分支管理

3.3.1 查看本地分支

如果你想查看你的本地有哪些分支,你可以使用以下命令:

$ git branch
3.3.2 过滤已经合并或尚未合并到当前分支的分支

如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged:

$ git branch --merged
  iss53
* master

查看所有包含未合并工作的分支,可以运行 git branch --no-merged:

$ git branch --no-merged
  testing

如果未合并的分支,无法正常删除。如果需要强制删除使用git branch -D [branch-name]

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

3.4 远程分支

远程跟踪分支是远程分支状态的引用。 它们是你不能移动的本地引用,当你做任何网络通信操作时,它们会自动移动。 远程跟踪分支像是你上次连接到远程仓库时,那些分支所处状态的书签。

本篇文章持续更新中,有什么意见可以提,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,683评论 1 17
  • 还忆少儿烂漫时, 窗前知了共吟诗。 放学路上追蝶戏, 手把蜻蜓细品思。 掏蛋树枝惊鸟唤, 溪中垂钓也归迟。 童心未...
    YYC011阅读 527评论 0 0
  • 寂寞悲伤 仰天一笑 泪光寒 少
    51314z21阅读 212评论 0 0
  • 我为夜色中残疾的卖水人 为他蜷曲的四肢嘶哑的嗓子而踌躇 为他洁白的沧桑与负隅顽抗的倔而泪迷 我为一颗心粗糙的同情 ...
    昕夕小兔阅读 470评论 1 1