前言
- 说明:本文是为了给公司员工培训而编写的教程,意在深度理解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 命令行工具:
- macOS系统:iTerm2以及终端工具配置:iTerm2 + Zsh + Oh My Zsh + tmux
上面的配置工具包含:
1. iTerm2:一个终端模拟器,比macOS系统自带的终端好用太多。
我刚接触到iTerm2时的时候是极力抗拒的,但是发现了她的好自后,我宁愿花上20分种时间配置一个iTerm2环境出来。
具体我不多说,谁用谁知道
2. Solarized:为iTerm2增加配色方案
3. Zsh:使用brew更新macOS自带的zsh(brew是macOS下强大的包管理工具)
4. Oh My Zsh:用来管理 Zsh 配置的,自带了好用的基本配置,基本都是 Zsh 的标配了
5. tmux:一个终端复用软件,可将终端方案化
配置完成的效果如下:
- windows系统:cmder,安装教程简单,安装教程:windows下的命令行工具-Cmder
配置完成的效果如下:
1.1.2 图形化工具
- SourceTree:最好用的Git图形化工具,没有之一。
官网地址:https://www.sourcetreeapp.com
接下来我们以最受欢迎的Swift的http请求项目Alamofire
为例子,查看SourceTree效果。
优势:
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为邮箱。
在SourceTree
查看提交的作者信息,效果如下
1.2.2 查看用户配置信息
当你配置完成用户信息,想要查看用户信息是否配置正确可以执行一下命令
$ git config --global --list
1.2.3 SourceTree查看配置信息
Mac
版的SourceTree
配置用户名和地址如下:
二. Git基础
2.1 忽略文件
顾名思义,忽略文件,也就是不需要加入Git
版本控制的文件,文件形式为.gitignore
文件。比如macOS系统中的.DS_Store
文件。
依旧以Alamofire为例,查看他的.gitignore
文件
查看.gitignore
文件内容
疑惑:我的个XXX,这又是 .
*
/
什么鬼意思,那我的项目需要加入什么样子内容的.gitignore
呢?
淡定,别急,我们同性交友网站的大神们帮我们整理出来了网页地址如下:https://github.com/github/gitignore
下面是我贴出来的部分.gitignore
的文件:
找到属于你的语言的.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初始化命令之后,你会发现,在项目的根目录下多了一个.git
的文件夹,那个git进行版本控制的最核心的文件夹。
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文件夹下,克隆这个开源项目。
解释说明:
命令说明:
pwd:输出当前所在路径
ls -a:查看当前文件夹下所有的子文件
克隆结果说明:
当前目录下创建一个名为 “AlamofireImage” 的目录,并在这个目录下初始化一个 .git 文件夹,
从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。
如果你进入到这个新建的 AlamofireImage 文件夹,你会发现所有的项目文件已经在里面了,
准备就绪等待后续的开发和使用。
- 克隆方式选择:https方式一般需要输入账号密码,git方式需要配置ssh。
3. 使用SourceTree克隆远端仓库
点击顺序:新仓库
->从URL克隆
,弹出第二个页面。
克隆仓库时,输入信息说明:
源URL:是远程仓库地址
目标路径:你想要在电脑磁盘保存的路径,这里需要自己增加项目仓库的名称
名称:项目仓库的名称
注意事项:第一次克隆项目如果是https需要输入用户名和密码,如果是git方式
并且你的ssh密钥有密码需要你输入密码。
2.2 记录每次更新到仓库
2.2.1 文件状态查看
- 请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪
未跟踪:Untracked(未跟踪)
已经跟踪:Unmodified(未修改)、Modified(已修改)、Staged(已暂存)
总结:第一次理解这个图片比较难,但是理解之后,你就会发现,对于git文件状态你就完全掌握。
各种状态剖析:
- Untracked(未跟踪):
- 新增加的文件
- 从git跟踪中移除(git rm --cached <file path>)
图片说明:我创建了一个
status.txt
文件,在使用git status
命令时,他已经变成一个Untracked(未跟踪)文件。
- Staged(已暂存):
- 使用
git add
命令跟踪文件,只要一个文件被git add
过,它就变成Staged状态(可以被git add
状态是Unmodified
和Untracked
)
- 使用
图片说明:图片中的"changes to be",意思是
status.txt
文件已经被暂存,你可用于提交。
- Unmodified(未修改)
- 已经提交的文件状态:
git commit
提交修改文件,文件状态将变成此状态。 - 丢弃这个文件的当前修改:
git checkout -- <file path>
- 已经提交的文件状态:
- Modified(已修改)
- 已经提交的文件,修改此文件,他会变成此状态。
- 已经暂存的文件,修改此文件,他也会变成此状态。
图片说明:我使用vim命令编辑了status.txt
文件,在用git status
命令查看文件状态时,它已经变成已修改状态了。
2.2.2 查看文件状态
使用git status
查看项目所有文件状态,其中包含哪些文件时新增
、被修改
、被删除
、已暂存
等等,其实就是上面四种状态的具体形式的反应。
$ git status
- SourceTree查看文件状态
黄色的"-"号表示Modified(已修改)文件,紫色的"?"表示Untracked(未跟踪)文件。当然还有其他状态文件,途中没有尽列出来。
2.2.3 跟踪并暂存文件
对于新建文件,或者已经从git跟踪中移除的文件,或者已经修改的文件,使用git add
命令,让他们变成已经暂存的状态。
// 跟踪并暂存单个文件
$ git add <file name>
// 跟踪并暂存所有文件,常用!!!
$ git add -A
- SourceTree跟踪并暂存文件
- 跟踪并暂存单个文件,相当于命令
git add <file name>
- 跟踪并暂存所有文件,相当于命令
git add -A
或者git add .
- 跟踪并暂存单个文件,相当于命令
2.2.4 查看已暂存和未暂存的修改
- 查看未暂存的修改
尽管 git status
可以看到路径下那些文件发现变动,但是我们无法知晓具体改动那一行代码?而git diff
将通过文件补丁的格式显示具体哪些行发生了改变。
// 查看未暂存文件的修改
$ git diff
注意事项:"+"号标识的是修改中增加内容,同理推测,"-"标识的就是修改中删除内容
- 查看已暂存的修改
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached
命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged
,效果是相同的,但更好记些。)
$ git diff --cached <file path>
- SourceTree 查看已暂存和未暂存的修改
点击顺序:文件状态
->已暂存文件
(未暂存文件
)->选择具体文件名
->查看文件状态
2.2.5 提交更新
-
可以提交的条件:确认所有的新建或者修改被
git add
过,因为git
无法记录未暂存的变动。 -
规避提交遗漏:先用
git status
看下,是不是都已暂存起来了,然后在运行提交命令git commit
$ git commit
- 注意事项:这种提交方式会启动文本编辑器以便输入本次提交的说明。
- 图片说明:
- 输入提交内容,以"#"为开头的行将被忽略,如果你输入的内容为空,提交将被中断。
- 提交成功后,在反馈信息中会有本次提交的修改信息。(包含文件个数,增加行数,删除行数)
我们比较常用的方法,会在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:
$ git commit -m "<commit message>"
- 使用SourceTree提交,三部曲:
2.2.5 移除文件
- 移除文件的三种方式
-
rm <file path>
: 将文件只从磁盘中移除 -
git rm --cached <file path>
:将文件只从git暂存中移除 -
git rm <file path>
:相当于上面两个操作的合并,将文件从磁盘和git暂存中同时移除。
-
2.3 查看提交历史
这边涉及的知识点比较零散,一般使用者只要知道基本命令就行,不做详细的说明。
具体可以看官网教程,我在这边附上链接:官方文档-查看提交历史。
- 查看最基础的git提交记录
// 查看提交记录,最简单的数据呈现
$ git log
- 查看前某几次的提交的变动
// 参数说明:"-1"表示最后一次提交的变动,以此类推"-2"则是最后两次提交的变动
$ git log -p -1
// 查看作者为caiqiujun的,提交前最后一次的变动
git log --author=caiqiujun -p -1
- 查看某个文件的变动记录(俗称:找锅)
// file path为文件路径
$ git log -p -- <file path>
- 查看分支的图形化变动
目的:分析当前分支的合并情况
$ git log --graph
- SourceTree 查看历史变动情况,三部曲:
2.4 撤消操作
2.4.1 将修改补充到上次提交中
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交:
$ git commit --amend
图片说明:
-
vim
编辑 forget.txt 文件 -
git add -A
将文件暂存 -
git status
查看文件状态,确认文件已经暂存 -
git commit --amend
将forget.txt提交到上次提交中
2.4.2 撤消对文件的修改
- 需要撤销的文件--未暂存
有时候我们需要,放弃对某个未暂存文件的修改,可以使用git checkout
命令丢弃文件修改,这是一个很危险的命令,一旦丢弃就无法找回。
图片说明:
-
git status
查看文件forget.txt文件是已修改状体 -
git checkout -- <file name>
撤销该文件修改 -
git status
在此查看文件状态,已经没有被修改的文件了,对forget.txt文件修改撤销成功。
- 需要撤销的文件--已暂存
图片说明:
-
git status
查看文件状态,forget.txt为已经暂存的修改 -
git reset HEAD <filename>
放弃暂存文件 -
git status
查看文件是否已经变成未暂存状态 - 再调用上一小节
git checkout -- <file name>
撤销对文件的修改。
2.4.3 SourceTree 撤销操作
- 将忘记提交的文件补充到赏赐提交中,类似于
git commit --amend
- 撤销该文件的修改,到赏赐提交的状态,类似于
git checkout -- <filename>
- 将文件变成未暂存文件,类似于
git reset HEAD <filename>
2.5 远程仓库的使用
2.5.1 查看远程仓库
如果想查看你已经配置的远程仓库服务器,可以运行 git remote -v
命令,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
$ git remote -v
2.5.2 添加远程仓库
运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写:
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 rm [remote-name]
:
$ git remote rm [remote-name]
2.5.5 SourceTree 远端仓库操作
- 配置远端仓库
首先看远端仓库的增删改查:设置->远端仓库->其他操作...
- 执行抓取操作
注意点:一定要勾选第二复选框。
比如:团队里面其他开发者删除了一些远端分支,在你的git远端分支依然还显示者那些分支。如果你尝试勾选它时,在抓取一次,你就会发现那些已经删除的分支消失了。
- 执行拉取操作
三. Git 分支
3.1 分支简介
分支原理介绍请参照官网:官网地址
3.1.1 分支创建
创建分支,原理就是创建一个新的可以移动的分支。如下命令是创建一个testing分支
$ git branch testing
注意事项
- 创建分支之前最好保证所有修改已经提交,即工作树是干净的。
- 创建新分支时,会拷贝当前分支代码。(从分支原理可以解释)
- 创建分支后,不会主动切换到新建分支上,必须执行
git checkout [branch-name]
命令切换分支。如果你想创建一个新分支,并切换到新分支上可以执行git checkout -b testing
命令
3.2 分支合并
如果你想将testing分支修改的内容合并到master主分支上,你可以执行以下操作:
// 切换到master分支
$ git checkout master
// 将testing分支合并到master分支
$ git merge testing
注意事项
- 创建分支之前最好保证所有修改已经提交,即工作树是干净的。
- 分支合并完成如果有冲突,需要解决冲突,在作出一次新的提交。
- 冲突原因
两个分支不同的代码块修改了同一代码区域,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
解决冲突步骤
- 读懂冲突代码实现的功能
- 构建最终需要的代码
- 删除冲突标记
<<<<<<<
(冲突开始标记) 、=======
(两个冲突分割标记) 、>>>>>>>
(冲突开始结束) ,最终让整个文件变成一个正常的代码文件。 -
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 远程分支
远程跟踪分支是远程分支状态的引用。 它们是你不能移动的本地引用,当你做任何网络通信操作时,它们会自动移动。 远程跟踪分支像是你上次连接到远程仓库时,那些分支所处状态的书签。
本篇文章持续更新中,有什么意见可以提,谢谢!