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

解决方法:

  1. 删除 .git/config 相关代码
  2. 删除工程目录下的 .gitmodules 相关代码
  3. 删除缓存的子模块 git rm –cached path_to_submodule (路径最后不要加斜线)
  4. 执行 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

git 高级用法
https://leec.me/73ffc5dd5338/
作者
Leec
发布于
2020年3月7日
更新于
2024年12月15日
许可协议