一、基本概念
1. git 的四个区域
- 工作区(Workspace):开发时放代码的目录
- 暂存区(Index / Stage):临时存放改动文件,就是一个二进制文件。路径.git/index
- 版本库(Repository):.git目录,记录所有版本的数据和提交记录。
- 远端库(Remote):托管代码的地方,如gitlab或github等。
2. 文件的四种状态
- 未跟踪(Untracked): 文件在工作区中的文件夹,但没有加入到git的管理,通过git add可以将状态变成Staged。
- 未修改(Unmodify): 文件已经通过git管理,未修改表示当前文件与版本库的文件完全一致。
- 已修改(Modified): 仅仅是修改, 并没有进行其他的操作。
- 已暂存(Staged): 文件放到暂存区,执行git commit会将其放到git版本库中。
3. git 的目录结构
- hooks/: 钩子,存放脚本,执行git命令前后触发相应的脚本
- info/: 仓库的一些信息
- logs/: 保存所有更新的引用记录
- objects/: 保存所有的git对象,对象为SHA1哈希值,前两位为文件夹,后38位为文件名(快速检索)
- refs/: 主要包括三个文件夹heads、remotes、tags以及一个文件stash,主要记录项目中各个分支指向的commit
- COMMIT_EDITMSG: 保存最新的commit message,git不使用,仅供用户参考展示
- config: git仓库的配置文件
- description: git仓库描述信息,主要给gitlab等托管系统使用
- index: 暂存区,二进制文件
- HEAD: 当前分支的引用,并可获取到下一次commit的parent
- ORIG_HEAD: HEAD指针的前一个状态
- FETCH_HEAD: 版本链接,指向着目前已经从远程仓库取下来的分支的末端版本
4. git 的对象类型
5. 对象类型概念
- blob:表示一个(版本的)文件,只包含文件的数据,无其他元数据比如名称、路径、格式。
- tree: 表示一个目录信息,包括此目录下的 blob、子目录(子 tree)、文件名、路径、文件属性。
- commit: 提交一个更新的所有元数据,如指向的 tree,父 commit,作者、提交者、提交日期、提交日志等。一个 commit 可以有多个父类 commit。
6. 查看对象类型
1 | # 查看index文件内容 |
二、基本命令
以下命令中[]
请替换。
1. 新建 git 版本库
1 | # 当前目录新建git版本库 |
TIP:
git clone --depth=1
只 clone 默认分支,如想要拉取其他分支
1 | # 克隆 |
2. 查看文件状态
1 | # 查看所有文件的状态 |
3. 查看提交日志
1 | # 表示查看最近几次的提交, n为数字 |
TTP:
git log
按q键退出
4. 工作区<–>暂存区
1 | # 将工作区当前目录下的所有文件添加到暂存区 |
TIP:
git checkout [filename]
可以直接将暂存区将文件恢复到工作区,增加--
是为了告知 git 这是一个文件名,与分支名做区分。
1 | # 切换分支 |
TIP:git 无法提交空目录,如果必须提交空目录,可在该目录下添加
.gitkeep
1 | # 批量给空目录添加.gitkeep文件,别忘了最后的分号 |
5. 工作区/暂存区<–>版本库
1 | # 将暂存区文件提交至版本库 |
TIP:
git commit -m
和git commit -am
的区别
git commit -m
用于提交暂存区文件;
git commit -am
用于提交已跟踪的文件,一般可理解成git add .
和git commit -m
合并,但仍有区别,如果新建文件(未跟踪过的文件)则无法提交。
TIP:
git rm --cached [filename]
和git reset HEAD -- [filename]
两个命令都是删除暂存区,区别
1 | # 该删除会脱离git管理,一般处理不想通过git管理的文件,比如临时文件等 |
6. 工作区/版本库<–>远端库
1 | # 将远端库代码拉取至版本库,不合并工作区代码,使用`git fetch [remote-name]`,一般而言采用下列命令即可 |
TIP:git fetch/git pull/git pull –rebase 区别
git pull
相当于git fetch
+git merge
,git pull --rebase
相当于git fetch
+git rebase
。
虽说git pull
相当于git fetch
+git merge
,但不推荐直接使用。一般推荐使用git pull --rebase
或使用
1 | # 先拉取代码到版本库,如master |
7. 工作区<–>储藏区
1 | # 将工作区的所有改动,放到储藏区 |
8. git 分支
1 | # 切换分支 |
TIP:git checkout 可以操作文件和操作分支,一定要注意!
1 | # 列出所有本地分支 |
9. git 标签
1 | # 列出所有的标签 |
10. 删除、撤销与回滚
1 | # 查看工作区可删除的未跟踪文件 |
1 | # 将HEAD和暂存区重置到某个commit,不重置工作区 |
TIP:HEAD的使用。HEAD为当前游标指向,即最近一次commit;HEAD^为上一次commit, HEAD^^为上一次的上一次的commit,即倒数第三次提交;HEAD~3为倒数第四次提交
1 | # 撤销(回滚)到某个commit |
11. 合并分支
1 | # 允许以fast-forward的方式合并 |
12. 分支或文件比较
1 | # 比较工作区和上一次提交的文件差异 |
三、配置与别名
1. 忽略文件提交
git中有三种方式可以忽略文件
在git项目中创建.gitignore文件(推荐)
在项目某个文件夹下创建.gitignore文件,在文件内定义相应的忽略规则,便可管理当前文件夹下的文件是否提交。
编辑git项目
.git/info/exclude
文件编辑git项目
.git/info/exclude
文件也可忽略文件,但这种只针对于跟目录定义全局.gitignore文件
通过
git config --global core.excludesfile ~/.gitignore
可定义全局的忽略文件,项目不共享仅限本机用户。
git匹配示例:
1 | # 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,但不忽略bin文件 |
2. git配置
git可以配置用户信息、配置信息、别名等信息,配置有三个不同的路径
- 系统级配置
/etc/gitconfig
,可以通过git config --system
添加 - 当前用户级配置
~/.gitconfig
或~/.config/git/config
,可以通过git config --global
添加 - 当前项目配置
.git/config
,可以通过git config
添加
1 | # 配置项目级的用户名 |
3. 别名
通过git config
可以设置别名,便于用户使用
1 | # 给checkout起别名co,可以通过git co进行分支切换 |
1 | [alias] |
其中lm表示无合并commit的日志,ll查看近10条记录,lg查看个分支关系图,ls查看日志并比较各commit,undo撤销
TIP:日志的查看可以使用
gitk &
进行查看当前分支,或通过gitk --all &
查看各个分支的情况