文章目录
参考
Git官网的介绍 强烈推荐
Git要点简述
- Git 更像是一个小型的
文件系统
(意味着支持很多对文件的操作,比如文件对比diff
,文件移动mv
)- 保存每次提交时文件快照,而非差异(这意味着,不用大量的运算,就可以快速地找到每个副本)
- 本地数据库拥有完成的提交记录,一般不受网络问题影响(集中式版本控制工具,没有本地仓库,不便捷,也不安全)
- Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名(更快捷,也避免了文件重名的麻烦)
- Git中文件状态和术语(有多种表述,可以综合参考下面的泳道图和示意图)
表示文件状态的术语有:untracked
, unmodified
, modified
, staged
, commited
untracked
:文件未被追踪即没有加入Git;
unmodified
:新的文件或者提交更新后未被修改的文件;
modified
:已经修改但是未保存(或者说是缓存)的文件
staged
:修改已经保存但是未提交的文件。
commited
: 已经提交更新的文件(但一般不标记这个,而是unmodified,体现提交过程的周期重复性)
获取帮助
# 获取快捷参考
$ git add -h
usage: git add [<options>] [--] <pathspec>...
-n, --dry-run dry run
-v, --verbose be verbose
...
# 获取详细信息
## <vert>替换为git命令的核心动词,比如add.
$ git help <verb>
$ git <verb> --help
## 不适用于windonws 命令行
$ man git-<verb>
## 例:
F:\WORKSPACE\VSCode-Portable\[Coding]\C\Algorithm_C_CODING>git help add
## 这将在你的默认浏览器上打开Git安装目录里的html文件。
查看信息
# 查看git版本信息
$ git --version
git version 2.33.0.windows.2
# 查看用户名
$ git config user.name
Poorjack
# 查看邮箱设置
$ git config user.email
luozhansang@outlook.com
## 如果要从github上clone仓库,不用户名和邮箱与github上的一致,只需要在github上的SSH设置和自己的公钥
# 查看详细的信息
$ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.email=xxxx
user.name=xxxx
查看/指定Git默认的编辑器
$ git config --global core.editor
"C:\Users\LUOZH\AppData\Local\Programs\Microsoft VS Code\Code.exe" --wait
可以让
code
在CMD里表示vscode,但需要先设置环境变量
初始化新仓库添加新文件
创建文件夹A,点击进入,在此处打开cmd或者gitBash(在cmd中运行git命令需要配置git变量环境
)
cd /d 路径 # 在cmd中输入命令进入到新创建文件夹
git init
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
git add <file_name1> [<file_name2> ...]
# 可以一次添加多个文件
# 例:(一般在本地创建仓库后,都推荐以下命令进行初始化)
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
从现有仓库克隆
git clone url [你希望的新的项目名]
- url可以是https或者ssh的,以github为例:
- [ ]表示其中的内容是选填的的,注意[ ]本身是不需要的.
在软件工程一般的语法格式中[]里内容是选填的,< >里的内容是必填的。
可能需要创建ssh令牌并在对应托管平台配置。
例如,从github上clone仓库,就要在github的ssh设置中填上自己的公钥。
git仓库和文件状态
Git是分布式的版本管理工具,在云端(就是github等托管平台)有一个仓库,在用户本地有一个仓库(如果是多人协作,就是每人本地都一个仓库)。本地分为工作区和存储区(暂存区/版本库)。一份文件有4中状态:
-
untrackde
文件意味着文件不在git项目中或者为忽略了(这需要在项目的.gitignore
文件中配置) -
标记
unmodified
和modified
的文件都在本地工作区(就是在文件管理器可以看见),staged
文件已经进入了暂存区(英文就是stage
)。对本地仓库commit后,就会加入本地仓库。此时文件又回到unmodified
的状态。综上加入git的文件在unmodified
,modified
,staged
三中状态中变化(git restore <file>
可以将文件从git中忽略?)。
master
即表示本地仓库的主分支
index
是暂存区
检查文件状态
# 获取详细信息
git status
# 获取简短信息
git status -s
例如:
F:\WORKSPACE\VSCode-Portable\[Coding]\C\Algorithm_C_CODING>git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: hello.c
no changes added to commit (use "git add" and/or "git commit -a")
on branch master
提示当前分支是主分支
changed not staged
意味工作区有文件被更改,但未放入暂存区。
可以使用git add / git commit -a 文件名
命令将文件的从modified
变为staged
changes to be commit
意味着文件放入暂存区,但未放入本地仓库(版本库)。
在vscode体现如下:
git add README.md
变为:
在VScode中工作区中发生了更改的文件放在
Changes
一栏下,加入暂存区的文件放在Staged Changes
一栏下。
git add <file> 命令有多种用途,包括添加文件加入Git项目,也包括将文件加入本地仓库。
比较文件差异
git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。也就是当前文件和上一个modifide
文件件的差异。
若文件全部保存到本地仓库,则该命令不会有任何输出。
按q退出(也适用于其他Git命令)
git diff --cached
# 查看工作区和上次快照的差异
git diff --staged
# 查看暂存区和上次快照的差异
看已经暂存起来的文件和上次提交时的快照之间的差异
删除文件
一个常见的情景是:某个文件已经被加入到stage,但是它并不被需要。(cached和staged同义,缓存区就是暂存区)
git rm --cached <file_name>
删除多个文件时,可是使用通配符(以反斜杠转移)
# 通配符一般有三钟类型:
## 1.匹配任意一个字符
## 2.匹配任意0~∞个字符,
## 3.匹配给字符
git rm \*~
提交更新
提交更新前,最好确保所有文件都已经暂存(放入本地仓库)
git commit -m '你的对本次提交的注释'
# 例:
F:\WORKSPACE\VSCode-Portable\[Coding]\C\Algorithm_C_CODING>git commit -m '在命令行里加注释'
[master 7506fa3] '在命令行里加注释'
1 file changed, 8 insertions(+), 1 deletion(-)
在VSCode中如果直接敲git commit的话可能出现一些意味的情况,因为Git好像是默认为每次提交添加注释的。在VSC中有commit的GUI图标,也是一定要写注释的。如下:
点击✓提交到版本库(本地仓库)
git commit -a
# 跳过git add命令,直接将工作区更改添加到暂存区,再添加的版本库。
.gitignore文件语法
.gitignore文件(以下简称.git)告诉git那些文件不必提交。
一般地,在.git上的文件就不必提交。
但为了避免写上每个文件的文件名,我们需要一些通配法则。
例如:*.exe
表示所有文件名以.exe结尾的文件。
# 这是一个.gitignore文件
## 所有exe文件不提交
*.exe
## 所有数字开头的文件不提交
[0-9].txt
- 每行仅写
*.exe
或者注释,不要将注释写在其后- 不要将
*.exe
和[0-9].txt
写在同一行
字符统配规则
字符 | 功能 | 备注 |
---|---|---|
* | 匹配0~∞多各任意字符 | |
[ ] | 匹配任何一个列在方括号中的字符 | [0-9]是一种简写,表示匹配所有 0到9之间任意某个的数字 |
? | 匹配一个任意字符 |
补除规则
字符 | 功能 | 备注 |
---|---|---|
! | 不忽略该(类)文件,即是它在包含着其他的忽略规则着 | !lib.a 表示跟踪所有的 lib.a,即便前面忽略了 .a 文件 |
!
放在文件名前:
是doc/!readme.txt
而不是!doc/readme.txt
文件夹递归规则
字符 | 功能 | 备注 |
---|---|---|
/<dic_name> | 仅忽略当前目录下的该文件夹 | 忽略文件夹就会忽略文件夹内所有内容 |
<dic_name>/ | 忽略任何目录下的该文件夹 | 任何目录也是在当前目录即工作目录的范围内的 |
文件递归规则
字符 | 功能 | 备注 |
---|---|---|
doc/*.txt | 忽略doc目录下的txt文件,但不忽略其子目录下的txt文件 | 非递归忽略 |
doc/**/*.pdf | 忽略doc目录及其子目录下的pdf文件 | 递归忽略 |
后两种规则可以视为统配法则的拓展:
使用*
,?
,[ ]
可以让我们用少量的字符表示许多文件名有某一规律的文件。实际上,绝对文件名包含文件路径,例如,C:\Users\LUOZH\Desktop\readme.txt
,文件夹和文件的递归规则就相当于路径上的‘通配法则’。
注意:git是起源于linux的,在linux上用如
\n
的转义字符表示换行,就用正斜杠(就是除号的另一种写法),/
作为路径间的分隔符,这是不同于windows的。