一. 输出漂亮的log --graph
使用git log --graph -2
或git log --pretty=format:"%h"
可以定制很多的输出格式,在此基础上添加自己喜欢样式,并保存到git config中下次使用就免去了每次输入一长串命令的困扰
- 全局添加
git config --global alias.lg "log --graph"
或者使用更漂亮的
- 使用年月日时间具体日期时间格式
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"
- 使用相对时间日期格式
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"
效果如下:
- 使用可读日期时间
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ad)%Creset%Cblue(%an)%Creset' --abbrev-commit --date=format:'%Y-%m-%d %H:%M'"
效果如下:
tip:如果输出太长,别忘了按q退出. 如果想只显示前几行log,可加参数 如:git lg -10
,会输出10条数据
二. 查看历史记录更改内容
git log比较有用的选项是 -p 或 --patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出)。 你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交:
git log -p -2
三. 查看历史提交简略统计信息
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 | 仅显示添加或删除内容匹配指定字符串的提交。 |
示例:
git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
五. git清除所有修改
- 首先查看git状态,是否有add或commit
git status
2.在未发生任何add或commit的情况下:
git checkout .
这条命令,只能清除所有修改的文件,但是新建的文件和文件夹无法清除,还必须使用:
git clean -df
清除所有新建的文件及文件夹
- 对于add的部分,先要撤销add:
撤销所有已add文件git reset .
或撤销特定文件git reset -- a.txt b.txt
然后再进行第一步的操作即可
六. git查看相关配置
$ git config
Config file location
--global use global config file
--system use system config file
--local use repository config file
--worktree use per-worktree config file
-f, --file <file> use given config file
--blob <blob-id> read config from given blob object
Action
--get get value: name [value-regex]
--get-all get all values: key [value-regex]
--get-regexp get values for regexp: name-regex [value-regex]
--get-urlmatch get value specific for the URL: section[.var] URL
--replace-all replace all matching variables: name value [value_regex]
--add add a new variable: name value
--unset remove a variable: name [value-regex]
--unset-all remove all matches: name [value-regex]
--rename-section rename section: old-name new-name
--remove-section remove a section: name
-l, --list list all
-e, --edit open an editor
--get-color find the color configured: slot [default]
--get-colorbool find the color setting: slot [stdout-is-tty]
Type
-t, --type <> value is given this type
--bool value is "true" or "false"
--int value is decimal number
--bool-or-int value is --bool or --int
--path value is a path (file or directory name)
--expiry-date value is an expiry date
Other
-z, --null terminate values with NUL byte
--name-only show variable names only
--includes respect include directives on lookup
--show-origin show origin of config (file, standard input, blob, command line)
--default <value> with --get, use default value when missing entry
使用方式:
git config + [Config file localtion] + [Action]
, 示例如下:
$ git config --system --list
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
credential.helper=manager
...
$ git config --local --list
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://gitee.com/.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
gitflow.branch.master=master
gitflow.branch.develop=develop
branch.develop.remote=origin
branch.develop.merge=refs/heads/develop
gitflow.prefix.feature=
gitflow.prefix.bugfix=
gitflow.prefix.release=
gitflow.prefix.hotfix=
gitflow.prefix.support=
gitflow.prefix.versiontag=
gitflow.path.hooks=C:/work/web/.git/hooks
七. 新添加的文件被忽略问题
- 经过分析,是因为在
.gitignore
文件里面将此文件的父文件夹给添加进去了,即忽略了该文件夹下的所有文件改动,所以就不会上传到远端.
解决方法:将.gitignore
文件里的规则改变一下,删除该文件夹路径规则(或修改),使此文件能够在git
控制之下. - 还有一种情况是,git默认忽略.dll .exe文件,需要手动添加
!*.dll
和!*.exe
八. 拉取代码: git pull , git merge ,git stash
- 将修改好的代码提交
git commit -am "commit something"
将代码从远端拉回
方法1:git pull
方法2:git fetch origin
+git merge origin/master
想临时不提交,并把代码拉到本地
git stash
git pull
git stash pop
九. 查看修改的内容
- 查看未暂存的修改
git diff
orgit diff HEAD
- 查看已暂存修改
git diff --cached
orgit diff --staged
十. 统计相关
1. 统计git提交次数, 展示所有人的提交次数
. 注意, 统计相关命令运用到了bash命令, 需要在bash中运行
$ git log | grep "^Author: " | awk '{print $2}' | sort | uniq -c | sort -k1,1nr
效果如下:
2. 统计时间内提交次数
$ git log --author=换成你的git名字 --since="2020-1-29" --no-merges | grep -e 'commit [a-zA-Z0-9]*' | wc -l
效果如下:
3. 统计提交行数
将展示该用户增加行数,删减行数,剩余行数
git log --author="换成你的git名字" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
效果如下:
十一. 修改已提交commit信息
1. 修改最近依次commit的信息
使用命令: git commit --amend
此时会启动安装git时的默认编辑器, 如果默认时vi则使用vi相关命令修改, 如果时其他文本编辑器(如: vscode)修改会更简单(不需要记住vi命令).
如果是vi编辑器, 记住几点就可以: 按i进入编辑模式, 开始编辑要修改的内容, 改完后按ESC键退出编辑模式,然后按:wq
保存我们编辑的信息.完成.
无论用那种编辑器修改完保存之后会看到最后的一条git提交信息已经修改了.
2. 修改最近的历史记录提交信息
例如我提交了几条信息:
这里我打算修改倒数第三条, feat: 能源相关测试
,
则使用命令:git rebase -i HEAD~3
, 此时如果用的默认编辑器是vscode, 则会自动代开, 显示如下
选择对应的commit将其改成edit后保存后
在cmd里会提示使用git commit --amend
修改之后使用git rebase --continue
在cmd里输入
git commit --amend
修改之后保存,然后输入命令
git rebase --continue
git log
后查看修改的commit已经修改成功.
十三. 撤回最近提交的commit
- 修改的内容不会丢失
git reset HEAD~
git reset HEAD~2 //数字是撤销前N次
- 修改的内容会丢失
git reset --hard HEAD^1
十二. 修改log中日期格式
默认格式如下:
Date: Mon Sep 28 09:29:45 2020 +0800
对英文不是很好且对时区没有很强概念的人来说比较晦涩难懂
方法: 修改config格式化日期
git config --global log.date format:'%Y-%m-%d %H:%M:%S'
效果:
Date: 2020-09-28 09:29:45
十三. 对git config的查看修改删除等操作说明
如果对git config命令不是很熟悉,
- 查看自带的帮助
git config --global --help
显示如下:
PS D:\work\web\els-opt\els-opt_2> git config --global --help
usage: git config [<options>]
Config file location
--global use global config file
--system use system config file
--local use repository config file
--worktree use per-worktree config file
-f, --file <file> use given config file
--blob <blob-id> read config from given blob object
Action
--get get value: name [value-regex]
--get-all get all values: key [value-regex]
--get-regexp get values for regexp: name-regex [value-regex]
--get-urlmatch get value specific for the URL: section[.var] URL
--replace-all replace all matching variables: name value [value_regex]
--add add a new variable: name value
--unset remove a variable: name [value-regex]
--unset-all remove all matches: name [value-regex]
--rename-section rename section: old-name new-name
--remove-section remove a section: name
-l, --list list all
-e, --edit open an editor
--get-color find the color configured: slot [default]
--get-colorbool find the color setting: slot [stdout-is-tty]
Type
-t, --type <> value is given this type
--bool value is "true" or "false"
--int value is decimal number
--bool-or-int value is --bool or --int
--bool-or-str value is --bool or string
--path value is a path (file or directory name)
--expiry-date value is an expiry date
Other
-z, --null terminate values with NUL byte
--name-only show variable names only
--includes respect include directives on lookup
--show-origin show origin of config (file, standard input, blob, command line)
--show-scope show scope of config (worktree, local, global, system, command)
--default <value> with --get, use default value when missing entry
在Action部分我们能看到支持的操作命令,get/replace/add/unset
对应着查看修改增加删除功能,不需要在搜索引擎中查找git命令了
- 查看本机的安装文档
git log --help
在命令行中输入后会在浏览器中自动打开对应的本地文档
十四. git 颜色及字体
- git可用颜色值
normal
black
red
green
yellow
blue
magenta
cyan
white - git字体可选
bold
dim
ul
blink
reverse
十五. git 更改当前用户名及密码
git config --system --unset credential.helper
清除以后再进行相关的推送git操作时会要求重新输入新的账号密码
如果是Windows系统也可以在控制面板-用户账户-凭据管理器中删除对应仓库的账号和密码即可输入新的账号和Person Access Token即可
十六. .gitignore文件忽略文件/文件夹及其失效解决方法
如果已写了忽略某个文件夹并提交了, 例如: 文件夹Deploy
Deploy/**/*
再添加对某个文件的忽略,如
!Deploy/.env
此时是可以起到忽略.env文件效果的, 但是如果深一层,如 Deploy/redis/config/redis.conf
添加到.gitignore中
!Deploy/redis/config/redis.conf
此时redis.conf文件的取消忽略就失效了, 猜测是.gitignore的机制导致的,
解决:
- 删除单个文件git缓存
git rm --cached Deploy/redis/config/redis.conf
或者整个目录
git rm --cached -r Deploy/redis
如果文件很多, 可以直接
git rm --cached -r .
如果提示某个文件无法忽略, 可以添加-f
参数强制忽略
git rm -f --cached Deploy/redis/config/redis.conf
- 将所有文件再添加回来
git add .
git commit -m "update .gitignore"
-
[重点]
把被忽略的某个文件强制添加回去
git add -f filename
十七、git提交规范
feat:提交新功能
fix:修复了bug
docs:只修改了文档
style:调整代码格式,未修改代码逻辑(比如修改空格、格式化、缺少分号等)
refactor:代码重构,既没修复bug也没有添加新功能
perf:性能优化,提高性能的代码更改
test:添加或修改代码测试
chore:对构建流程或辅助工具和依赖库(如文档生成等)的更改
十八、git 打标签 tag
- 添加轻量级标签(常用)
git tag v0.2
//推送标签, 只推一个
git push origin v2.1
- 显示标签
git tag
v1.0
v1.2
v2.0
//过滤标签
git tag -l 'v2.*'
v2.0
//查看标签的版本 信息
git show v2.0
- 创建标签
git tag -a v2.1 -m 'my version v2.1'
-a
是annotated的首字母,指定标签名
-m
是message的首字母, 指定标签说明, 如果没有指定-m git会启动文本编辑供你输入标签说明
- 删除标签
git tag -d v2.0
- 后期加标签
git log --pretty=oneline
//查找特定分支上的id, 打标签的时候带入即可
git tag -a v2.1 166ae0c4d3
- 推送标签
//一次推一个标签
git push origin v2.1
//一次将本地所有标签都推送到远端
git push origin --tags
十九、分支Branch操作
//本地相关
//查看分支
git branch
//查看当前分支的详情
git branch -v
git branch --verbose
//新建分支
git branch (branch name)
//切换分支
git checkout (branch name)
//合并分支(合并另一个分支到当前分支上)
git merge (branch name)
//删除分支(当前不在删除的分支上,否则会删除失败)
git branch -d (branch name)
git branch --delete (branch name)
//远程相关
//查看远程仓库的分支
git branch --remote
//拉取远程分支并同时创建对应的本地分支
git checkout -b (branch name) origin/(branch name)
//将本地分支与远程保持同步
git fetch
//将本地所有分支与远程保持同步
git fetch --all
//拉取所有分支代码
git pull --all
//删除远程分支
git push origin :(branch name)
//将本地分支初次推送到远端
git push -u origin "(branch name)"
二十、查看已提交内容的修改信息
git show
git show commitId
git show commitId fileName
二十一、gitflow
git flow 介绍
分支名 | 作用 |
---|---|
master | 主分支,用于uat发布或最终发布,绝不可直接push |
develop | 主开发分支,基于master分支克隆,只能从其它分支合并 |
feature | 功能开发分支,基于develop分支克隆,用于新功能新需求的开发 |
release | 测试(sit环境)分支,提交给测试人员进行功能测试及在本分支进行BUG修复 |
hotfix | 补丁分支,基于master分支克隆,用于uat或正式环境的版本进行BUG修复 |
- 初始化gitflow
git flow init -d
- 新功能分支
// git checkout -b feature/<feature-name> develop
git flow feature start <feature-name>
- 需要将本地代码提交到远程仓库:
// git push origin feature/<feature-name>
// git push --set-upstream origin feature/<feature-name>
// git push origin
git flow feature publish <feature-name>
- 当功能开发完毕后就将进入测试阶段:
// git checkout develop
// git merge feature/<feature-name>
// git branch -d feature/<feature-name>
git flow feature finish <feature-name>
- release 本地提交
git flow release start <release-name|1.0.0>
- release 需要将本地代码提交到远程仓库
git flow release publish < release-name|1.0.0 >
- release 待测试通过后需要发布UAT版
// git fetch,拉取最新的代码
// 将分支合并到master分支
// 生成tag
// 将分支合并到develop分支
// 删除release/<release-name>分支
// 切换回develop分支
git flow release finish < release-name|1.0.0 >
- 推送到远程仓库:
git push origin –all
git push origin --tag
- hotfix 场景
git flow hotfix start <hotfix-name|1.0.0.b1>
git flow hotfix finish <hotfix-name|1.0.0.b1>
git flow 基本使用至此完成
git developer分支合并到master分支
- 1.查看本地和远程分支
$ git branch -a
* developer
master
remotes/origin/developer
remotes/origin/master
- 2.切换到本的developer分支
$ git checkout -b developer origin/developer
如果developer分支已经存在,执行下面这步
$ git checkout developer
如查当前使用的就是developer分支,则这步不用执行。
- 3.把远程的developer分支拉取到本地,保证是最新的developer分支
$ git pull
- 4.切换到master分支
$ git checkout master
- 5.确保存master分支也是最新的
$ git pull
- 6.执行合并的关键代码,此时执行结果时将本地的developer合并到本地master分支
$ git merge developer
- 7.将合并的本地master分支推送到远程master
$ git push origin master
将代码推送到两个远程仓库
先配置
$ git remote add origin https://github.com/wwmin/***.git
$ git remote add github https://github.com/wwmin/***.git
$ git remote add gitee https://gitee.com/wwmin/***.git
后推送
$ git push github master
$ git push gitee master