1. 概述
1.1 Git和代码托管中心
代码托管中心的任务:维护远程库
局域网环境下:
- GitLab服务器
外网环境下:
- GitHub
- 码云
1.2 本地库和远程库
-
团队内部协作
-
跨团队协作
2. Git命令行操作
2.1 本地库操作
-
命令:git init
-
效果:
-
注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
2.2 设置签名
- 形式
用户名:tom
Email地址:[email protected] - 作用:区分不同的开发人员
- 辨析:这里设置的签名和登录远程库(代码托管中心)的账户、密码没有任何关系。
- 命令
- 项目级别/仓库级别:仅在当前本地库范围内有效
- git config user.name tom_pro
- git config user.email [email protected]
- 信息保存的位置:./.git/config文件
- 系统用户级别:登录当前系统的用户范围
- git config --global user.name tom_glb
- git config --global user.email [email protected]
- 信息保存位置:~/.gitconfig文件 (家目录下的.gitconfig文件)
- 级别优先级:
- 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有,不允许
- 项目级别/仓库级别:仅在当前本地库范围内有效
2.3 基本操作
- 状态查看操作
- git status
查看工作区、暂存区状态
- git status输出的绿字表明:暂存区的内容与工作区一致,与本地库不一致(暂存区的内容即将要提交到本地库。此时提交到本地库后,三者的内容将一致)
- git status输出的红字表明:暂存区的内容与工作区有不一致,但与本地库一致(此时要做的事情是,将工作区修改好的文件添加到暂存区,此时git status将会输出绿字) - 添加操作
- git add [filename]
将工作区的“新建/修改”添加到暂存区 - 提交操作
- git commit -m "commit message" [filename]
将暂存区的内容提交到本地库
- git commit -m "commit message" [filename]
- 查看历史记录操作
- git log
- 多屏显示控制方式:
- 空格向下翻页
- b 向上翻页
- q 退出
- git log --pretty=oneline
- git log --oneline
- git reflog (在--oneline的基础上还显示了:HEAD指针到某个版本,需要移动几步)
- git add [filename]
- git status
2.4 Git版本的前进、后退
-
本质:HEAD是一个指针,指针可以指向过去的版本,即后退;后退之后,也可以再指向前面的版本,即前进。
-
基于索引值操作[推荐] (建议配合git reflog命令使用)
git reset --hard [索引值]
-
使用^符号:只能后退,一个异或符号退1步
git reset --hard HEAD^^^ (该命令后退3步)
-
使用~符号:只能后退,波浪线符合后的数字表示后退的步数
git reset --hard HEAD~3 (该命令后退3步)
2.5 git reset命令的三个参数对比
-
--soft
- 不会碰暂存区和工作区。仅仅会在本地库移动HEAD指针
- 执行命令 git reset --soft 9a9ebe0后,工作区的good.txt还是以eeeeee为最新的一行,和未执行该命令时相同。然而暂存区变成了“modified: good.txt”,为什么呢?因为本来在命令执行前,本地库、暂存区、工作区,三者是一致的(working tree clean)。但是后来通过执行命令,把本地库的HEAD指针往前(前进)移动了几个commit,此时三者的一致就被打破了,所以现在暂存区的内容并没有提交到本地库指针现在指向的位置(或者说本地库后退或前进了,就显得暂存区变化了),实际上暂存区的内容没有变化。所以暂存区变成绿字,不是它变了,而是本地库的指针发生了变化。
--
--
--
--
-
--mixed
- 在本地库移动HEAD指针
- 重置暂存区(用指针指向的commit)
基于上图的git reflog命令的结果,执行命令:git reset --mixed 42e7e84,命令执行后,工作区没有改变,而本地库、暂存区往后移动了几个commit。
暂存区目前是红字,但实际上没有变化,如何理解?该命令使得本地库、暂存区都往后移动了几个commit,工作区没有移动,所以就显得工作区往前走了(被改动了,所以就变成红字了)。
-
--hard
- 在本地库移动HEAD指针
- 重置暂存区(用指针指向的commit)
- 重置工作区(用指针指向的commit)
git reset --hard xxxxxx 该命令会让三者(本地库、暂存区、工作区)同时“移动”。即移动了本地库的指针,然后将暂存区、工作区刷新为当前指针指向的commit对应的内容。
一般来说,前--soft和--mixed用的少。