一、Git 基础命令
1. 查看远程分支地址
git remote -v
2. 更新远程所有分支
git remote update origin --prune
3. 查看所有历史版本信息
git reflog
4. 更新上一次 commit 信息
# 如果需要在原有的 commit 中新增提交文件,则需要执行以下命令,否则不需要执行
git add [待提交文件]
# 更新 commit 注释信息
git commit --amend
5. 删除本地分支
# 普通删除
git branch -d [本地分支名]
# 强制删除
git branch -D [本地分支名]
6. 删除远程分支
git push origin --delete [远程分支名]
7. 配置 gitk 客户端 utf-8 编码(防止中文乱码)
git config --global gui.encoding utf-8
二、git stash 命令
1 用途
将当前未提交的修改暂存,去别的分支修改代码
2 步骤
# 将当前分支未提交的代码暂存
git stash
git stash save "注释信息"
# 切换的别的分支
git switch/checkout [其他分支名]
# 在别的分支修改代码
# 回到自己的分支
git switch/checkout [自己的分支名]
# 将之前暂存的代码恢复
git stash apply
# 将恢复的暂存从队列中删除
git stash drop
3 常用命令
# 查询所有的 stash 记录
git stash list
# 将最近的一次暂存恢复,并且从队列中删除
git stash pop = git stash apply + git stash drop
# 将指定序号 x 的 stash 恢复
git stash apply stash@{x}
# 将指定序号 x 的 stash 删除
git stash drop stash@{x}
# 清空所有的 stash 记录
git stash clear
# 查看堆栈中最新保存的 stash 和当前版本的目录差异
git stash show
# 查看堆栈中最新保存的 stash 和当前版本的详细差异
git stash show -p
# 查看指定的 stash x 版本和当前版本的目录的差异
git stash show stash@{x}
# 查看指定的 stash x 版本和当前版本的详细差异
git stash show stash@{x} -p
4 细节描述
git stash 命令会把以下修改存储到一个新的堆栈中(堆栈中的内容(stash)可以被所有的分支访问)
git stash 命令不会存储下列文件
- 工作区中新增的文件(untracked files)
- 被版本库忽略的文件(.gitignore 中定义的忽略文件)
5 基础概念
工作区:项目所在目录(除 .git 文件夹外的其余目录和文件)
暂存区:也称索引(index),英文叫做 stash 或 index,一般存在于 .git 目录下的 index 文件;当执行 git commit 操作时,暂存区的目录树会写到版本库中,所以也可以理解为 git commit 提交的是暂存区中的内容
git stash -u
git stash -u 命令会存储以下文件
- 工作区中新增的文件(untracked files)
git stash -a
git stash -a 命令会存储以下两种文件
- 工作区中新增的文件(untracked files)
- 被版本库忽略的文件(.gitignore 中定义的忽略文件)
三、git reset 命令
1 使用背景
在开发过程中,有时候可能在执行完 git commit 之后发现代码有问题,需要撤销提交,或回滚回之前的任意版本,这时候就需要使用 git reset 命令了
2 命令详解
git reset [参数] [commit id / head]
参数:
--mixed 重置 HEAD,INDEX;保留 工作区;默认参数
--soft 重置 HEAD;保留 INDEX,工作区;让仓库恢复到 git commit 之前的状态
--hard 重置 HEAD,INDEX,工作区
3. 关键词详解
工作区:项目所在目录,即 .git 目录的同级目录(不包括 .git 目录);也可以理解为项目根目录下除 .git 目录的所有目录及文件
INDEX:也称暂存区,英文叫做 stage 或 index;一般存在于 .git 目录下的 index 文件;当执行 git commit? 操作时,暂存区的目录树会被写到版本库中,所以也可以理解为 git commit 提交的是暂存区中的内容
HEAD:HEAD就是 ./git/HEAD 文件,它存储着当前工作目录所处的某次 commit;HEAD 是对 commit 的引用,默认是上一次的 commit(提交的 commit,切换仓库,回滚版本,切换 tag 会改变 HEAD)
版本库:项目根目录下的 .git 目录就是版本库
四、git revert 命令
- reset 命令是回溯到指定的d commit 版本,指定的 commit 版本之后的操作会被删除,并且不会产生新的 commit 记录,如果要推送到远程服务器,需要用 -f 强制推送;
- revert 是在当前 head 的基础上,反向修改成目标 commit 版本,将修改结果作为一个新的 commit 提交,版本会递增,不会影响之前提交的内容
1 常用命令
# 回退到目标 commit id 时的状态
git revert [commit id]
# 回退到 head 指针指向的提交
git revert HEAD
# 回退到 HEAD 指针 n 次之前的提交
git revert HEAD~n
# 不产生新的提交
git revert -n
# 当回滚记录是由多个分支 merge 产生时,需要指定回滚的父节点
git revert -m [指定回滚的父节点]
五、git restore 命令
- git restore --staged [文件路径]? ? ? ? 撤销在暂存区提交的文件,将文件状态改为不受版本库控制
- git restore [文件路径]? ? ? ? 使在工作区但不在暂存区的文件撤销更改(内容恢复到没修改之前的状态);如果文件还在暂存区,该命令无效,需要使用 git restore --staged 命令将文件从暂存区移至工作区
- git rm -r --cached [. | 文件 | 目录]? ? ? ? 清除 git 缓存区的缓存数据,不改动工作区的文件内容;但是本操作(删除操作;即工作区不删除,但是版本库会删除,并且停止版本控制)会随着 commit,push, merge request 被带到本地版本库、远程版本库
六、 git diff 命令保留
- git diff? ? ? ? 比较的是工作区和暂存区的差异;即尚未缓存的改动
- git diff --cached? ? ? ? 比较的是暂存区和最新本地版本库的差异;即已被缓存的改动;也可写作 git diff --staged
- git diff --HEAD? ? ? ? 比较的是工作区和最新本地版本库中 HEAD 指针指向的 分支/commit id/tag/... 的差异
七、git commit 命令
- git commit -a? ? ? ? 相当于 git add + git commit
- git commit --amend? ? ? ? 撤销上一次提交,并将暂存区文件重新提交,编辑器会弹出上一次提交的信息,可以修改你想要提交的注释信息
- git commit --amend -m? ? ? ? 撤销上一次提交,同时 -m 指定修改的提交信息
- git add [文件] + git commit --amend? ? ? ? 不仅修改提交信息,并且更改提交文件
八、git 查找、阅读任意分支、版本的文件
1 显示任意分支下的指定目录
git show [分支名]:[目录路径]
2 阅读任意分支下的指定文件
git show [分支名]:[目录路径]
git show [40 位对象名]
3 检索、查找包含指定内容文件所在分支及其具体路径
git grep [options] "关键字" [分支名 | commit id | tag | <tree> | <pathspec>]
<tree> 分支、commit id、tag、及其完整路径
<pathspec> 路径
# options 可选参数
--cached 搜索暂存区中的文件,而不是搜索已经在版本库并被跟踪的文件
--no-index 搜索当前目录中不被 git 版本控制的文件
--exclude-standard 不支持搜索忽略文件,仅在 --untracked 存在时生效
--full-name 显示目标文件的完整路径
--heading 按文件分行显示匹配内容
--break 在不同的文件之间加空白行来隔开
-i
--ignore-case 忽略大小写
-w
--word-regexp 只匹配字符边界
-E
--extended-regexp 匹配正则表达式
-F
--fixed-string 使用固定字符串模式,禁用正则表达式
-v
--invert-match 取反,显示不匹配的行
-q
--quit 不输出匹配的行
-n 显示行数
-c 列出匹配的文件,并统计有多少个匹配
-h
-H 每个匹配结果均显示文件名
--and 与
--or 或
--not 非
4 阅读指定文件
对象名
在 git 中任何一个文件的任何版本,都有一个对象名,即一个文件有几个版本,就有几个对象名;每一个对象名都是对象做 SHA1 哈希计算得来的
对象
每个对象包括三个部分:
类型 ==> blob(用来存储文件数据,通常是一个文件)、tree(用来管理? tree 或 blob)、commit、tag
大小
内容
1 常用命令
- git ls-files-s [目录]? ? ? ? 显示指定目录下所有对象的 sha1 哈希对象名
- git hash-object [文件]? ? ? ? 显示指定文件的 sha1 哈希对象名
- git cat-file -t [对象名]? ? ? ? 显示对象的类型
- git cat-file -s [对象名]? ? ? ? 显示对象的大小
- git cat-file -p [对象名]? ? ? ? 显示对象的内容
|