文章目录
- 概述
- 一、获取仓库
- 1.1 初始化仓库
- 1.2 克隆仓库
- 二、文件状态及更新操作
- 2.1 文件状态变化周期
- 2.2 检查文件状态
- 2.2.1 完整查看状态
- 2.2.2 简要查看状态
- 2.3 跟踪新文件
- 2.4 暂存已修改的文件
- 2.5 忽略文件
- 2.5.1 文件 .gitignore 的格式规范如下:
- 2.5.2 glob模式格式
- 2.6 查看已暂存和未暂存的修改
- 2.7 提交更新
- 2.8 移除文件
- 2.9 移动文件
- 三、查看提交历史
- 四、撤销操作
- 4.1 使用amend重新提交
- 4.2 取消暂存
- 4.3 撤销对文件的修改
- 五、远程仓库的使用
- 5.1 查看远程仓库
- 5.2 添加远程仓库
- 5.3 从远程仓库中抓取与拉取
- 5.4 推送到远程仓库
- 5.5 远程仓库的重命名与移除
- 5.5.1 重命名
- 5.5.2 移除
- 六、打标签
- 6.1 列出标签
- 6.2 创建标签
- 6.2.1 附注标签
- 6.2.2 轻量标签
- 6.2.3 后期补打标签
- 6.3 共享标签
- 6.3.1 共享单个标签
- 6.3.2 共享所有标签
- 6.4 删除标签
- 6.4.1 删除本地标签
- 6.4.2 删除远程标签
- 6.5 Git别名
清香白莲素还真
半神半圣亦半仙,全儒全道是全贤,脑中真书藏万卷,掌握文武半边天。
概述
本文记录Git 完成各种工作时将会用到的各种基本命令。
包括配置并初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)或提交(commit)更改、忽略指定的文件和文件模式、撤销错误操作、浏览项目的历史版本以及不同提交(commits)之间的差异、如何向远程仓库推送(push)以及如何从你的远程仓库拉取(pull)文件等操作。
**注:**本次学习过程使用的是Windows系统。
一、获取仓库
Git有两种获取仓库的方法:
- 直接初始化一个尚未及逆行版本控制的本地目录文件夹作为Git仓库;
- 克隆一个已存在的Git仓库;
1.1 初始化仓库
初始化仓库需要保证文件夹是文件夹,然后进入文件夹之后执行“git init”指令。
git init
可以通过cd指令切换到指定文件夹之中。
初始化之后会创建.git的子目录。
示例:
C:\Users\LJM>cd D:\Desktops\Test
# 注意,跨磁盘的路径切换,需要先切换到指定的磁盘,才能正确切换到指定目录,这没有先切换磁盘,所以目录没有切换成功。
C:\Users\LJM>C:\Users\LJM>D: #切换磁盘,也可使用“cd D:”指令进行切换。
D:\Desktops\Test># 初始化仓库,若是要做远程仓库一般添加参数“--bare”创建空仓库,避免后续提交报错。
D:\Desktops\Test>git init
Initialized empty Git repository in D:/Desktops/Test/.git/
1.2 克隆仓库
Git可以使用git clone指令克隆整个远程项目库,每次拉去都是完整的拉去Git仓库中的所有文件。
git clone <url> # 直接克隆仓库
git clone <url> NewName # 克隆的时候之地那个本地仓库名字
示例1,直接克隆:
D:\Desktops>cd TestClone # 进入要存放Git仓库的文件夹中D:\Desktops\TestClone>git clone D:/Desktops/Test/.git/ # 这是1.1初始化的仓库,本地文件路径也是一个URL
Cloning into 'Test'...
warning: You appear to have cloned an empty repository.
done.D:\Desktops\TestClone>
仓库直接克隆到新目录下:
示例2,克隆时自定义本地仓库名字:
D:\Desktops\TestClone>git clone D:/Desktops/Test/.git/ Test_New
Cloning into 'Test_New'...
warning: You appear to have cloned an empty repository.
done.D:\Desktops\TestClone>
克隆下来的仓库以新的名字保存。
二、文件状态及更新操作
2.1 文件状态变化周期
Git工作目录下的文件有已跟踪和未跟踪两种状态。已跟踪的文件有未修改,已修改,暂存三种状态。
- 可以通过添加文件,将未跟踪的文件进行跟踪,刚添加的文件会保存再缓存区;
- 通过提交将添加的文件提交到数据库,此时文件状态变为未修改;
- 通过移除文件将文件从已跟踪状态改为未跟踪;
- 通过编辑,未修改的文件将会变为已修改状态;
- 将已修改的的文件暂存后会将状态改为暂存状态;
- 将已修改的文件提交后,会直接将状态改为未修改;
2.2 检查文件状态
2.2.1 完整查看状态
使用status指令可以查看具体的文件状态,会将文件具体状态打印出来。
注: 使用指令时要先切换到Git仓库文件夹中才能正确识别;
示例1,非Git仓库提示错误:
提示当前目录不是一个git仓库。
C:\Users\LJM>git status
fatal: not a git repository (or any of the parent directories): .git
示例2, Git空仓库下查看状态:
提示当前是一个空仓库。
D:\Desktops\Test>git status
On branch master # 当前分支No commits yet # 尚未由提交内容nothing to commit (create/copy files and use "git add" to track)
示例3, Git空仓库下添加文件后查看状态:
D:\Desktops\Test>git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: TestAdd.txt # 待提交的文件Untracked files: # 未跟踪的文件(use "git add <file>..." to include in what will be committed)TestFile.txt
2.2.2 简要查看状态
git status -s
git status --short
- ?? 标记:未跟踪文件;
- A标记:新添加到暂存区中的文件;
- M标记:修改过的文件;
示例:
D:\Desktops\Test>git status -s
AM Test1.txt # 文件添加后又修改了,尚未提交到暂存区。
A Test2.txt
?? TestAdd.txt
?? TestFile.txt
2.3 跟踪新文件
git add filename1 filename2 ... # 添加新的文件进行跟踪
D:\Desktops\Test>git add Test1 Test2
fatal: pathspec 'Test1' did not match any filesD:\Desktops\Test>git add Test1.txt Test2.txt # 同时添加多个文件D:\Desktops\Test>git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: Test1.txtnew file: Test2.txtnew file: TestAdd.txtnew file: TestFile.txt
2.4 暂存已修改的文件
git add filename1 filename2 ... # 重新添加已跟踪的文件可以将修改的内容重新添加到暂存区,后续提交的时候一起提交。
示例:
D:\Desktops\Test>git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: Test1.txt # 这是add之后暂存的版本new file: Test2.txtChanges 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: Test1.txt # 修改之后重新查看状态,多了一个修改的状态,此时尚未暂存。Untracked files:(use "git add <file>..." to include in what will be committed)TestAdd.txtTestFile.txtD:\Desktops\Test>git add Test1.txt # 重新暂存D:\Desktops\Test>git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: Test1.txtnew file: Test2.txtUntracked files:(use "git add <file>..." to include in what will be committed)TestAdd.txtTestFile.txt
2.5 忽略文件
通过添加“.gitignore”,可以列出忽略的文件列表。
2.5.1 文件 .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
2.5.2 glob模式格式
glob 模式是指 shell 所使用的简化了的正则表达式:
- 星号(*)匹配零个或多个任意字符;
- [abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
- 问号(?)只匹配一个任意字符;
- 如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
- 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
示例:
# 忽略所有的 .a 文件
*.a# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO# 忽略任何目录下名为 build 的文件夹
build/# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
2.6 查看已暂存和未暂存的修改
git diff # 是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
git diff --staged # 比对已暂存文件与最后一次提交的文件差异。
git diff --cached # 查看已经暂存起来的变化
2.7 提交更新
使用commit指令进行提交。
git commit # 直接提交,会弹出编辑器输入备注
git commit -m "message" # 使用-m参数,可以将命令和提交信息放在同一行提交。
git commit -a -m "message" # 使用-a参数,可以不用将文件添加到暂存区,直接将所有已跟踪的文件暂存起来一起提交。
2.8 移除文件
使用rm指令进行移除。
git rm filename # 移除指定文件,后续不再跟踪。
git rm --cached filename # 不再跟踪,但是保留本地文件。
注:
- –cached指令用于移除跟踪,但是保存本地文件,这个指令对误添加的文件要移除的操作非常有用;
- 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。
示例:
git rm log/\*.log # 删除 log/ 目录下扩展名为 .log 的所有文件
git rm \*~ # 删除所有名字以 ~ 结尾的文件
2.9 移动文件
使用mv指令移动文件
git mv file_from file_to
三、查看提交历史
git log # 查看更新日志
git log -p -n # -p或者--patch 显示每次提交引入的差异(以补丁格式输出),-n 只显示最近的n次提交
git log --stat # 每次提交的简略统计信息
git log 的常用选项:
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个提交引入的差异。 |
–stat | 显示每次提交的文件修改统计信息。 |
–shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
–name-only | 仅在提交信息后显示已修改的文件清单。 |
–name-status | 显示新增、修改、删除的文件清单。 |
–abbrev-commit | 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 |
–relative-date | 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。 |
–graph | 在日志旁以 ASCII 图形显示分支与合并历史。 |
–pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。 |
–oneline | –pretty=oneline --abbrev-commit 合用的简写。 |
-<n> | 仅显示最近的 n 条提交。 |
–since, --after | 仅显示指定时间之后的提交。 |
–until, --before | 仅显示指定时间之前的提交。 |
–author | 仅显示作者匹配指定字符串的提交。 |
–committer | 仅显示提交者匹配指定字符串的提交。 |
–grep | 仅显示提交说明中包含指定字符串的提交。 |
-S | 仅显示添加或删除内容匹配指定字符串的提交。 |
四、撤销操作
4.1 使用amend重新提交
git commit --amend
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。可以运行带有 --amend 选项的提交命令来重新提交。
4.2 取消暂存
此操作会将取消文件的暂存,可能存在将已修改的文件撤销掉的风险。
git reset HEAD <file> # 取消暂存
4.3 撤销对文件的修改
使用checkout – 指令可以撤销文件的修改。
git checkout -- <file>
五、远程仓库的使用
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。
通俗的说远程仓库就是不在当前仓库位置,而在其他位置的仓库。
5.1 查看远程仓库
git remote # 列出远程服务器的简写名称
git remote -v # 显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote show <remote> # 查看某一个指定的仓库的信息。
5.2 添加远程仓库
添加一个新的远程 Git 仓库,同时指定一个简写名称:
git remote add <shortname> <url>
5.3 从远程仓库中抓取与拉取
git fetch <remote> # 拉取已更新的内容,但是不会主动合并
git pull <remote> # 自动抓取后合并该远程分支到当前分支
5.4 推送到远程仓库
git push <remote> <branch>
- remote:远程仓库服务器;
- branch:分支名字
示例:
git push origin master # 将 master 分支推送到 origin 服务器
5.5 远程仓库的重命名与移除
5.5.1 重命名
git remote rename old new
此操作会修改所有远程跟踪的分支名字,如过去引用 old/master 的现在会引用 new/master。
5.5.2 移除
git remote remove
git remote rm
注: 使用这种方式删除了一个远程仓库,所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
六、打标签
6.1 列出标签
git tag
git tag -l "v1.0.0*" # 使用-l和--list匹配满足V1.8.5相关的标签。
注: 默认使用的是列出所有标签,但是当使用-l或者–list 匹配过一次之后,就会默认使用-l和–list匹配。
6.2 创建标签
6.2.1 附注标签
git tag -a v1.4 -m "version 1.4"
可以使用git show v1.4查看具体的标签和对应的提交信息。
6.2.2 轻量标签
轻量标签不需要参数,直接添加即可。
git tag tagname
轻量标签,使用show查看时只会显示出提交信息,没有额外的标签信息。
6.2.3 后期补打标签
git tag -a v1.1(标签) 9fceb02(要打标签版本的校验和)
6.3 共享标签
6.3.1 共享单个标签
git push origin <tagname> # 推送标签到远程仓库
6.3.2 共享所有标签
使用–tags参数推送时直接推送标签。
git push origin(服务器名字) --tags
推送标签时,两种标签都会推送。
6.4 删除标签
6.4.1 删除本地标签
使用-d直接删除本地标签。
git tag -d <tagname>
6.4.2 删除远程标签
git push <remote> :refs/tags/<tagname> # 使用:前的空值替换远程仓库的标签明,进行删除
git push <remote> --delete <tagname> # 直接删除标签名
6.5 Git别名
通过config可以设置git指令的别名,操作比较多之后,可以提高操作的简便性。
git config --global alias.<shortname> command
- : 指令简写
- command:具体的指令
示例:
git config --global alias.unstage 'reset HEAD --'# 设置之后以下两条指令一致,都是取消暂存。
git unstage fileA
git reset HEAD -- fileA