git remote -v
git remote update origin --prune
git reflog
- # 如果需要在原有的 commit 中新增提交文件,则需要执行以下命令,否则不需要执行
- git add [待提交文件]
-
- # 更新 commit 注释信息
- git commit --amend
- # 普通删除
- git branch -d [本地分支名]
-
- # 强制删除
- git branch -D [本地分支名]
git push origin --delete [远程分支名]
- # 普通删除
- git branch -d <本地分支名>
-
- # 强制删除
- git branch -D <本地分支名>
git config --global gui.encoding utf-8
- git config user.name
- git config user.email
- git config --global user.name ""
- git config --global user.email ""
- git switch <新分支>
- git checkout <旧分支> -- <指定文件的路径>
将当前未提交的修改暂存,去别的分支修改代码
- # 将当前分支未提交的代码暂存
- git stash
- git stash save "注释信息"
-
- # 切换的别的分支
- git switch/checkout [其他分支名]
-
- # 在别的分支修改代码
-
- # 回到自己的分支
- git switch/checkout [自己的分支名]
-
- # 将之前暂存的代码恢复
- git stash apply
-
- # 将恢复的暂存从队列中删除
- git stash drop
- # 查询所有的 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
git stash 命令会把以下修改存储到一个新的堆栈中(堆栈中的内容(stash)可以被所有的分支访问)
git stash 命令不会存储下列文件
工作区:项目所在目录(除 .git 文件夹外的其余目录和文件)
暂存区:也称索引(index),英文叫做 stash 或 index,一般存在于 .git 目录下的 index 文件;当执行 git commit 操作时,暂存区的目录树会写到版本库中,所以也可以理解为 git commit 提交的是暂存区中的内容
git stash -u
git stash -u 命令会存储以下文件
git stash -a
git stash -a 命令会存储以下两种文件
在开发过程中,有时候可能在执行完 git commit 之后发现代码有问题,需要撤销提交,或回滚回之前的任意版本,这时候就需要使用 git reset 命令了
- git reset [参数] [commit id / head]
-
- 参数:
- --mixed 重置 HEAD,INDEX;保留 工作区;默认参数
- --soft 重置 HEAD;保留 INDEX,工作区;让仓库恢复到 git commit 之前的状态
- --hard 重置 HEAD,INDEX,工作区
工作区:项目所在目录,即 .git 目录的同级目录(不包括 .git 目录);也可以理解为项目根目录下除 .git 目录的所有目录及文件
INDEX:也称暂存区,英文叫做 stage 或 index;一般存在于 .git 目录下的 index 文件;当执行 git commit 操作时,暂存区的目录树会被写到版本库中,所以也可以理解为 git commit 提交的是暂存区中的内容
HEAD:HEAD就是 ./git/HEAD 文件,它存储着当前工作目录所处的某次 commit;HEAD 是对 commit 的引用,默认是上一次的 commit(提交的 commit,切换仓库,回滚版本,切换 tag 会改变 HEAD)
版本库:项目根目录下的 .git 目录就是版本库
- # 回退到目标 commit id 时的状态
- git revert [commit id]
-
- # 回退到 head 指针指向的提交
- git revert HEAD
-
- # 回退到 HEAD 指针 n 次之前的提交
- git revert HEAD~n
-
- # 不产生新的提交
- git revert -n
-
- # 当回滚记录是由多个分支 merge 产生时,需要指定回滚的父节点
- git revert -m [指定回滚的父节点]
git show [分支名]:[目录路径]
git show [分支名]:[目录路径]
git show [40 位对象名]
- git grep [options] "关键字" [分支名 | commit id | tag |
| ] -
分支、commit id、tag、及其完整路径 路径 -
-
- # 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 非
对象名
在 git 中任何一个文件的任何版本,都有一个对象名,即一个文件有几个版本,就有几个对象名;每一个对象名都是对象做 SHA1 哈希计算得来的
对象
每个对象包括三个部分:
类型 ==> blob(用来存储文件数据,通常是一个文件)、tree(用来管理 tree 或 blob)、commit、tag
大小
内容
可以这样说:git base 是 git 中最精华、最难、最危险的命令,没有之一,用一句话总结就是——危险与收益共存!!!
想要理解 git rebase 是用来做什么的,可以百度、谷歌搜索一下 git merge 和 git rebase 的区别;简单来说 git rebase 也是起到 合并 的作用;只不过它的这个合并不仅可以合并不同分支、不同 commit id 的代码,还可以合并 commit id 本身,而且自由度之高,超乎你的想象
变基:改变当前分支的基础版本(父版本);即将提交到某一分支上所有的修改都移至另一分支上
- # 拉取最新主干分支代码
- git fetch master
- # 切换到自己的分支
- git switch/checkout branch
- # 将主干分支的最新代码同步到自己的分支上,并将本地分支新增的 commit 放到最新的主干分支的最后面
- git rebase master
- git rebase -i [开始 commit id] [结束 commit id]
- # 1. 开始 commit id 和 结束 commit id 属于前开后闭区间,即 (开始 commit id, 结束 commit id];意思是开始 commit id 需要取 待合并 commit id 集合中最早的 commit id 的前一个 commit id
- # 2. 结束 commit id 通常被省略(禁用),因为该命令默认表示选取 开始 commit id 到最后的一个 commit id,如果结束 commit id 写错,会导致结束 commit 之后的所有 commit 全部被删除,即 (结束 commit id, 最后的 commit id] 被删除
-
-
- git rebase -i [开始 commit id]
| 参数 | 简写 | 含义 |
|---|---|---|
| pick | p | 保留该 commit |
| reword | r | 保留该 commit,但需要修改该 commit 的注释 |
| edit | e | 保留该 commit,但需要停下来修改提交文件(不仅仅要修改提交注释) |
| squash | s | 将该 commit 合并到前一个 commit |
| fixup | f | 将该 commit 合并到前一个 commit,但不要保留提交的注释信息 |
| exec | x | 执行 shell 命令 |
| drop | d | 丢弃该 commit |
一、A、B 为分支
git log A..B 找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 B分支最新commit点 的提交记录全部列出
git log A...B 找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 A分支最新commit点 以及 c点 到 B分支最新commit点 的提交记录以提交时间为顺序全部列出
git log A.. 若当前分支是 B,则等价于 git log A..B
git log ..A 若当前分支是 B,则等价于 git log B..A
二、a、b 为commit点
1. 若 a,b 本来就是同一子分支的两个 commit 点,不是因为 merge 而合并到同一个分支
git log a..b 等价于 git log a...b,会将 a 到 b 之间的所有 commit 点列出
2. 若 a,b 本来不是同一子分支的两个 commit 点,是因为 merge 而合并到同一个分支
1️⃣ 找到 a commit点 合并前所属子分支 A分支,并将 a commit 点作为 A分支 的最后一个 commit点,即逻辑上删除 A分支 a commit点 之后的其余所有 commit 点
2️⃣ 找到 b commit点 合并前所属子分支 B分支,并将 b commit 点作为 B分支 的最后一个 commit点,即逻辑上删除 B分支 b commit点 之后的其余所有 commit 点
git log a..b 找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 B分支最新commit点 的提交记录全部列出
git log a...b 找到 A分支 和 B分支 最近的公共点 c点,然后把 c点 到 A分支最新commit点 以及 c点 到 B分支最新commit点 的提交记录以提交时间为顺序全部列出
3️⃣ 若出现待补全的情况,即 a.. 或 ..a,则将当前分支(a 所属分支 A,b 所属分支 B;一般为A、B合并后的总分支 A'(A合并B)或B‘(B合并A) 记为 C)C自动填补至空缺位:
git log a.. 等价于 git log A..C
git log ..a 等价于 git log C..A
注意:
1. 凡是出现空缺位的,无论另一方是 commit 点 还是 分支名,空缺位自动由当前合并后的分支名填补
2. C 分支包含的 a、b commit点 顺序根据 commit 时间排序
3. 3️⃣ 所出现的情况为最终为 合并前的 A或B 分支 与 合并后的 C分支 的比较
- # 添加注释
- git config branch.<分支名>.description "注释"
- git branch --edit-description <分支名>
-
- # 查看注释
- git config branch.<分支名>.description
在 git 安装目录下的 /etc/gitconfig 配置文件中添加如下代码
- # 自定义脚本标签
- [alias]
- # 格式 1
- # <命令名> = !sh -c '[命令]'
- # 该写法中,-c 是标准的 linux shell 命令,表示将目标字符串转化成一个完整的命令来执行;因此 [命令] 中需要包含 git 关键字
- # 格式 2
- # <命令名> = [命令]
- # 该写法中,会把 [命令] 拼接到控制台的 git,所以不需要 git 关键字
- # 举例子,为分支名(输入参数)添加注释
- adddesc1 = !sh -c 'git branch --edit-description'
- adddesc2 = branch --edit-description
- git [命令命]
-
- git adddesc1
- git adddesc2
1️⃣ 在 git 安装目录下的 usr/bin 目录下新建自己的命令脚本 test.sh (可随意命名)
2️⃣ 用 linux shell 语法编辑 test.sh
- #! /bin/bash
-
- # ...(脚本代码)
3️⃣ 在 git 安装目录下的 /etc/gitconfig 配置文件中添加如下代码
- # 自定义脚本标签
- [alias]
- <命令命> = !sh <脚本名>
- mycmd = !sh test.sh
git mycmd