Git 常用技术

一. 输出漂亮的log --graph

使用git log --graph -2git log --pretty=format:"%h"可以定制很多的输出格式,在此基础上添加自己喜欢样式,并保存到git config中下次使用就免去了每次输入一长串命令的困扰

  • 全局添加
git config --global alias.lg "log --graph"

或者使用更漂亮的

  1. 使用年月日时间具体日期时间格式
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"
  1. 使用相对时间日期格式
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 lg
  1. 使用可读日期时间
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 -p -2

三. 查看历史提交简略统计信息

git log --stat
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清除所有修改

  1. 首先查看git状态,是否有add或commit
    git status

2.在未发生任何add或commit的情况下:
git checkout .
这条命令,只能清除所有修改的文件,但是新建的文件和文件夹无法清除,还必须使用:
git clean -df
清除所有新建的文件及文件夹

  1. 对于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

七. 新添加的文件被忽略问题

  1. 经过分析,是因为在.gitignore文件里面将此文件的父文件夹给添加进去了,即忽略了该文件夹下的所有文件改动,所以就不会上传到远端.
    解决方法:将.gitignore文件里的规则改变一下,删除该文件夹路径规则(或修改),使此文件能够在git控制之下.
  2. 还有一种情况是,git默认忽略.dll .exe文件,需要手动添加!*.dll!*.exe

八. 拉取代码: git pull , git merge ,git stash

  1. 将修改好的代码提交
git commit -am "commit something"
  1. 将代码从远端拉回
    方法1: git pull
    方法2:git fetch origin + git merge origin/master

  2. 想临时不提交,并把代码拉到本地

git stash
git pull
git stash pop

九. 查看修改的内容

  • 查看未暂存的修改 git diff or git diff HEAD
  • 查看已暂存修改 git diff --cached or git diff --staged

十. 统计相关

1. 统计git提交次数, 展示所有人的提交次数

. 注意, 统计相关命令运用到了bash命令, 需要在bash中运行

$  git log | grep "^Author: " | awk '{print $2}' | sort | uniq -c | sort -k1,1nr

效果如下:


统计git提交次数

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. 修改最近的历史记录提交信息

例如我提交了几条信息:


git commit log

这里我打算修改倒数第三条, feat: 能源相关测试,
则使用命令:git rebase -i HEAD~3, 此时如果用的默认编辑器是vscode, 则会自动代开, 显示如下

vscode显示git

选择对应的commit将其改成edit后保存后
在cmd里会提示使用git commit --amend修改之后使用git rebase --continue

git commit --amend

在cmd里输入git commit --amend
image.png

修改之后保存,然后输入命令git rebase --continue
git rebase --continue

git log 后查看修改的commit已经修改成功.

十三. 撤回最近提交的commit

  1. 修改的内容不会丢失
git reset HEAD~
git reset HEAD~2  //数字是撤销前N次
  1. 修改的内容会丢失
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命令不是很熟悉,

  1. 查看自带的帮助
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命令了

  1. 查看本机的安装文档
git log --help

在命令行中输入后会在浏览器中自动打开对应的本地文档

十四. git 颜色及字体

  1. git可用颜色值
    normal
    black
    red
    green
    yellow
    blue
    magenta
    cyan
    white
  2. 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的机制导致的,
解决:

  1. 删除单个文件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
  1. 将所有文件再添加回来
git add .
git commit -m "update .gitignore"
  1. [重点]把被忽略的某个文件强制添加回去
git add -f filename

十七、git提交规范

feat:提交新功能
fix:修复了bug
docs:只修改了文档
style:调整代码格式,未修改代码逻辑(比如修改空格、格式化、缺少分号等)
refactor:代码重构,既没修复bug也没有添加新功能
perf:性能优化,提高性能的代码更改
test:添加或修改代码测试
chore:对构建流程或辅助工具和依赖库(如文档生成等)的更改

十八、git 打标签 tag

  1. 添加轻量级标签(常用)
git tag v0.2
//推送标签, 只推一个
git push origin v2.1
  1. 显示标签
git tag
v1.0
v1.2
v2.0
//过滤标签
git tag -l 'v2.*'
v2.0

//查看标签的版本 信息
git show v2.0
  1. 创建标签
git tag -a v2.1 -m 'my version v2.1'

-a是annotated的首字母,指定标签名
-m是message的首字母, 指定标签说明, 如果没有指定-m git会启动文本编辑供你输入标签说明

  1. 删除标签
git tag -d v2.0
  1. 后期加标签
git log --pretty=oneline
//查找特定分支上的id, 打标签的时候带入即可
git tag -a v2.1 166ae0c4d3
  1. 推送标签
//一次推一个标签
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容