git 高级用法
git clone
下载指定文件名
git clone ssh://git@10.10.0.4:28/motu_application/network/libgb28181.git filename
指定分支下载源码
git clone -b dev ssh://git@10.10.0.4:28/motu_application/network/libgb28181.git
git config
查看当前配置
# 查看当前用户配置
git config -l
git config --global
# 查看当前仓库配置
git config --local -l
# 查看当前系统配置
git config --system -l
笔记:local > global > system
设置姓名、邮箱、log 日期类型
git config --global user.name "lichen"
git config --global user.email "lichen@xxx.com"
git config --global log.date format:%Y-%m-%d %H:%M:%S
git tag
打 tag
当前 commit 打 tag
git tag -a V1.0 -m "tag备注"
指定 commit 打 tag
git tag -a v1.1 9fceb02 -m "tag备注"
查看 tag
查看所有 tag
git tag
过滤查看
git tag -l "V1.0.\*"
查看指定 tag
git show V1.0
提交 tag
git push origin V1.0
切换到 tag
git checkout V1.0
删除tag
删除本地
git tag -d V1.0
删除远程
git push origin :refs/tags/V1.0
git fetch & git merge
从远端服务器同步代码
安全的同步方式如下,下面三条命令可以用一条命令 git pull origin master
搞定
git fetch origin master
git log -p master ..origin/master
git merge origin/master
一个分支的代码同步至另一个分支
master 分支同步至 b1 分支
git checkout b1
git merge master
git push origin b1
git apply
生成 patch
git diff b926a7a7 3e3ce757 > 1.patch
合入 patch
git apply 1.patch
git format-patch & git am
生成 patch
最近的一次提交生成 patch
git format-patch HEAD^
最近的两次提交生成 patch
git format-patch HEAD^^
指定某一个 commit 生成 patch
git format-patch -1 c98e065122147880840cce02203d6421999ec879
从某个 commit 到当前 commit 生成 patch
git format-patch c98e065122147880840cce02203d6421999ec879
从 A 到 B 生成 patch
git format-patch be79698c...b926a7a7
合入 patch
git am ~/*.patch
git submodule
克隆带子模块的仓库
git clone ssh://git@10.10.0.4:28/lichen/all.git --recursive
添加子模块
# 此命令做三件事
# 1. 克隆工程到本地
# 2. 创建/修改.gitmodules标记submodule的具体信息
# 3. 更新.git/config文件,增加submodule的地址
git submodule add ssh://git@10.10.0.4:28/lichen/repository1.git submodule1
# 提交
git commit -m "添加子模块submodule1"
git push origin master
更新子模块
# 切换子模块分支
cd submodule1
git checkout master
cd submodule2
git checkout master
# 拉取所有子模块代码
git submodule foreach git pull
# 更新子模块代码
cd submodule1
vim r1.txt
# 先提交子模块
git add r1.txt
git commit -m "update r1.txt"
git push origin master
# 再提交主模块
git add submodule1
git commit -m "update submodule1"
git push origin master
删除子模块
# 进入.git/config删除子模块相关代码
vim .git/config
# 进入.gitmodules删除子模块相关代码
vim .gitmodules
# .gitmodules添加到暂存区
git add .gitmodules
# 删除子模块缓存
git rm --cached submodule1
# 删除子模块目录
rm -fr sumodule1
# 提交
git commit -m "删除子模块submodule1"
git push origin master
更改子模块信息
# 修改 .gitmodules 和 .git/config 两个文件中的 URL 值
vim .gitmodules
vim .git/config
# 同步
git submodule sync
# 提交
git commit -m "modify submodule1"
git push origin master
子模块常见问题
问题一:git submodule add 时报错 A git directory for xxx is found locally with remote(s): origin
解决方法:
- 删除 .git/config 相关代码
- 删除工程目录下的 .gitmodules 相关代码
- 删除缓存的子模块 git rm –cached path_to_submodule (路径最后不要加斜线)
- 执行 git submodule sync –recursive 更新到本地的配置文件
问题二:git submodule add 时报错 Pathspec xxx is in submodule
解决方法:删除缓存的子模块git rm –cached path_to_submodule(路径最后不要加斜线)
git cherry-pick
功能
将某个提交从一个分支转移到另一个分支
选项 | 说明 |
---|---|
-n | 只更新工作区和暂存区,不产生新的提交 |
-x | 在提交信息的末位增加一行(cherry picked from commit …),推荐使用 |
用法示例
转移某个 commit
git cherry-pick <CommitHash>
转移两个 commit
git cherry-pick <CommitHashA> <CommitHashB>
转移 (A,B] 之间的所有提交,其中 A 必须早于 B
git cherry-pick <CommitHashA>..<CommitHashB>
转移 [A,B] 之间的所有提交,其中 A 必须早于 B
git cherry-pick <CommitHashA>^..<CommitHashB>
清理远程分支
git remote prune origin
git log
简述
显示提交日志。该命令采用适用于 git rev-list 命令的选项来控制显示的内容和方式,以及适用于 git diff-* 命令的选项来控制每次提交带来的变化的显示方式。
可选项
选项 | 说明 |
---|---|
–follow | 持续列出文件重命名后的历史记录(仅适用于单个文件)。 |
–no-decorate, –decorate[=short|full|auto|no] | 打印出显示的任何提交的参考名称。如果指定了 ==short==,则不会打印 ref name 的前缀 refs/heads/、refs/tags/ 和 refs/remotes/。 |
自定义显示
显示作者和提交者
git log --pretty=full
显示作者和提交者,并显示作者修订日期和提交日期
git log --pretty==fuller
指定作者
git log --author="lichen"
指定多个作者
git log --author="lichen" --author="Tom"
指定提交者
git log --committer="lichen"
格式化输出
git log --pretty=format:"[占位符]"
占位符 | 说明 |
---|---|
%H | 提交对象(commit)的完整哈希字串 |
%h | 提交对象的简短哈希字串 |
%T | 树对象(tree)的完整哈希字串 |
%t | 树对象的简短哈希字串 |
%P | 父对象(parent)的完整哈希字串 |
%p | 父对象的简短哈希字串 |
%an | 作者(author)的名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 –date= 定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者(committer)的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式显示 |
%s | 提交说明 |
修改远程仓库的url
git remote set-url origin <new-url>
git config 配置大全
修改日期显示格式
修改当前仓库 log date 格式
git config log.date iso-strict-local
全局设置log date格式
git config --global log.date iso-strict-local
自定义显示格式
git config --global log.date format:'%Y-%m-%d %H:%M:%S'
格式化选项 | 说明 |
---|---|
%A | 星期几的英文全称,例如 Saturday |
%a | 星期几的英文缩写,例如 Sat |
%B | 月份的英文全称,例如 November |
%b | 月份的英文缩写,例如 Nov |
%C | 年份缩写,例如 20 |
%c | 不清楚具体作用,测试显示 Mon 16 Nov 2020 10:35:04 AM GMT |
%D | 月/日/年,其中年份缩写,例如 11/16/20 |
%d | 日缩写,例如 16 |
%e | 日缩写,例如 16 |
%F | 年-月-日,例如 2020-11-16 |
%G | 年份,例如 2020 |
%g | 年份缩写,例如 20 |
%H | 不清楚具体作用,测试显示 10 |
%h | 月份缩写,例如 Nov |
%I | 不清楚具体作用,测试显示 10 |
%j | 今年过了多少天,包括当天,例如 321 |
%k | 不清楚具体作用,测试显示 10 |
%l | 不清楚具体作用,测试显示 10 |
%M | 分钟,例如 35 |
%m | 月份数字形式,例如 11 |
%n | 换行 |
%P | 上午或者下午的英文缩写小写,例如 am |
%p | 上午或者下午的英文缩写大写,例如 AM |
%R | 小时:分钟,例如 10:35 |
%r | 时:分:秒 上午/下午英文缩写大写,例如 10:35:04 AM |
%S | 秒,例如 04 |
%s | Unix 时间戳,例如 1605494104 |
%T | 时:分:秒,例如 10:35:04 |
%t | 制表符 |
%U | 今年过了几周,例如 46 |
%u | 星期几的数字形式,例如 1 |
%V | 不清楚具体作用,测试显示 47 |
%W | 今年过了几周,例如 46 |
%w | 星期几的数字形式,例如 1 |
%X | 时:分:秒 上午/下午英文缩写大写,例如 10:35:04 AM |
%x | 月/日/年,例如 11/16/20 |
%Y | 年份,例如 2020 |
%y | 年份缩写,例如 20 |
%Z | 空 |
%z | 时区,例如 +0800 |
%% | % |
git stash
将本地修改保存在一个储藏室中。如果你想要记录工作目录和索引的当前状态,同时想保持一个干净的工作目录,可以使用此命令。
git stash push
执行此命令会将你的本地修改保存起来,并将工作目录恢复到和 HEAD
提交一致的状态。
git stash
不加任何参数时就是执行 git stash push
,此时不能加任何其它参数。
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message <message>] [--] [<pathspec>...]]
参数 | 说明 |
---|---|
-p 或 –patch | 进入交互式模式,可以选择一个文本文件的每一处改动是否 stash,注意二进制文件(例如库)不支持这个参数。 |
-k 或 –keep-index 或 –no-keep-index | 如果加了 –keep-index 这个参数,所有已经 git add 的文件不会 stash。-p 默认会带上 –keep-index。 |
-q 或 –quiet | 静默模式,只报告错误。 |
-u 或 –include-untracked | 未被 git 追踪的文件也将被 stash。 |
-a 或 –all | 未被 git 追踪的文件和 .gitignore 忽略的文件都将被 stash。 |
-m 或 –message,后面跟描述信息 | stash 说明信息,如果不加此参数,那么默认描述信息是 “WIP on 分支名: 最新一次提交的 sha256 的前八位 最新一次提交的说明”。 |
<pathspec> | 需要 stash 的文件路径,如果不添加路径,那么默认 stash 已修改的文件。 |
git stash list
列出储藏室中的所有条目。其中 stash@{0} 是最新的条目,stash@{1} 是第二条,以此类推。
git stash list [<options>]
参数 | 说明 |
---|---|
<options> | 可选项请参考 git log。 |
git stash drop
删除储藏室中的一个条目。
git stash drop [-q|--quiet] [<stash>]
参数 | 说明 |
---|---|
-q 或 –quiet | 静默模式,只报告错误。 |
<stash> | 需要删除的 stash 索引,例如 stash@{0},可以简写成 0,如果不加此参数,那么默认删除 stash@{0},即最新的一个条目。 |
git stash show
显示储藏室某个条目的修改。
git stash show [<options>] [<stash>]
参数 | 说明 |
---|---|
<options> | 支持 git diff 的所有参数。 |
<stash> | 需要显示的 stash 索引,例如 stash@{0},可以简写成 0,如果不加此参数,那么默认显示 stash@{0},即最新的一个条目。 |
git clean
从工作目录中删除未追踪的文件。
git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>...
参数 | 说明 |
---|---|
-d | 递归清理那些未被追踪的目录,如果<path> 已经指定了递归清理路径,那么 -d 将会失去作用。 |
-f 或 –force | git 配置 clean.requireForce 为 true 的情况下,git clean 不会删除任何文件或目录,带上此参数或者 -i 可以删除。 |
-i 或 –interactive | 进入交互式清理模式。 |
-n 或 –dry-run | 实际上不删除任何东西,只是显示会做什么。 |
-q 或 –quiet | 静默模式,只报告错误。 |
-e<pattern> 或 –exclude=<pattern> | 在标准的忽略规则之外,使用给定的排除模式,可参考 .gitignore。 |
-x | 不使用标准的忽略规则,但仍然使用 -e 规则,此参数允许删除所有未跟踪的文件,一般用来创建原始干净的工作目录。 |
-X | 只删除被 git 忽略的文件,对于想从头开始构建但需要保留手动创建的文件很有用。 |
<path> | 需要递归清理的路径。 |
强制将分支指向某个提交点
将 main 分支指向 commit-hash 这个提交点
git branch -f main commit-hash
基于某个 commit 创建分支
git checkout -b new_branch 1c43c8e28933e469f0857b9c0ba9b9e8e5760d25
常见问题
git log 中文乱码解决方法
Linux 环境
export LESSCHARSET=utf-8
Windows 环境
新增一个系统环境变量 LESSCHARSET,值为 uft-8
git status 中文乱码解决方法
git config --global core.quotepath false
git 对已经提交过的文件添加到 .gitignore
git pull
git rm -r --cached .
git add .
git commit -m "add .gitignore"
git push