输出漂亮的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'"
效果如下:
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 条提交。 |
--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:
git reset .
然后再进行第一步的操作即可
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 use given config file
--blob 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 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
- 查看已暂存修改
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已经修改成功.