Git实用配置和技巧
文章目录
git命令博大精深,做为git深度用户,这里介绍几个自己一直在用的自认为很实用的git的配置和技巧。
命令简化
通过git的配置来对命令设置别名,git的配置文件优先级为 local > global > system,其中:
- local:位于git项目目录中的.git/config,只对特定git项目有效
- global:位于~/.gitconfig,只对当前登录用户有效
- system:位于 git的安装目录 /etc/gitconfig,对系统所有用户和所有项目有效
下面是两种设置方式:
执行命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#高频命令 git config --global alias.ci commit git config --global alias.co checkout git config --global alias.st status git config --global alias.br branch #复杂命令 #美化提交记录,显示提交树 git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" #账户设置 git config --global alias.nameme 'config user.name iaming' git config --global alias.mailme 'config user.email iaming@me.com' git config --global alias.mailqq 'config user.email net.liming@qq.com' #切换远程仓库 git config --global alias.repo1 'remote set-url origin /path/to/repository1'
编辑配置
vim ~/.gitconfig
1 2 3 4 5 6 7 8 9 10
[alias] lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit --date=format:'%m-%d %H:%M' st = status co = checkout ci = commit br = branch nameme = config user.name iaming mailme = config user.email iaming@me.com mailqq = config user.email net.liming@qq.com repo1 = remote set-url origin /path/to/repository1
合并分支
合并内容,但不保留待合并分支上的历史信息,相当于把待合并分支上的多个commit合并成一个,放到当前分支。判断是否使用–squash选项最根本的标准是,待合并分支上的历史是否有意义
1
|
git merge master --squash |
合并仓库
先克隆仓库1,然后切换到仓库2,在本地合并仓库2:
1 2 3 4 |
git remote add origin2 /path/to/repository2 git fetch origin2 git pull --allow-unrelated-histories |
本地解决冲突后提交即可
同时提交两个仓库
vim .git/config
1 2 3 4 |
[remote "origin"] url = /path/to/repository1 url = /path/to/repository2 fetch = +refs/heads/*:refs/remotes/origin/* |
忽略文件属性变更
问题:因为windows和mac、linux对文件属性处理不一样,会到这跟踪混乱。
vim ~/.gitconfig
1 2 |
[core] filemode = false |
NOTE: 有安全风险或权限错误,建议脚本、二进制程序权限还是明确配置。
中文显示为Unicode编码
问题:当工程中有中文目录时,命令行里会显示为Unicode编码。解决方法:
vim ~/.gitconfig
1 2
[core] quotepath = false
或者
1 2 3
git config --global core.quotepath false git config --global i18n.commit.encoding utf-8 # 提交信息编码 git config --global i18n.logoutputencoding utf-8 # 输出 log 编码
问题:Windows决IDEA下的terminal中文Unicode编码。解决办法:
- 将settings->Tools->Terminal,将Shell path修改为:C:\Program Files\Git\bin\bash.exe
- 修改C:\Program Files\Git\etc\bash.bashrc,最后追加:
1 2 3
# 解决IDEA下的terminal中文Unicode编码问题 export LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8"
NOTE: 如果提示没有权限,请以管理员身份运行编辑修改。
HTTP方式记住密码
当使用http:方式操作git,可以设置让git记住密码,这样就可以像git:方式使用秘钥一样不用每次都输入密码:
|
|
全局忽略文件
Mac下面的.DS_Store文件非常讨厌,每个项目初始化都要配置项目.gitignore,其实我们可以设置git的全局忽略文件。
|
|
合并本地提交记录
有时候本地提交比较频繁,在push到仓库前想要把本地的历史合并为一个,这是可以考虑使用rebase命令合并最近的几次提交,在接下来的交互时,第一个commit使用 p
(使用提交),后面其他的commit全部使用 f
(使用提交,但是融合前一次提交,并丢弃提交说明日志)即可。
|
|
git reset 和 git revert
- git reset 重置,将当前HEAD指针指向某一次提交,也就意味着新指针之后的所有提交记录将被丢弃掉,是比较危险的做法。
- git revert 撤销,将提交记录中的某一次提交撤销掉,撤销操作涉及到的修改将作为一个新的提交记录追加到当前HEAD,对提交历史以及该撤销记录的上下提交都未做改动,是比较安全的做法。
假设我们有如下提交记录 git log --oneline
1 2 3 4 5 |
eeeeeee 第五次提交 ddddddd 第四次提交 ccccccc 第三次提交 bbbbbbb 第二次提交 aaaaaaa 初始化提交 |
- 废弃掉最近两次提交,即5和4不要了
- 软重置
执行命令:
git reset ccccccc
或者git reset HEAD~2
。 执行完后效果:提交记录中只有aaaaaaa、bbbbbbb、ccccccc三个,ddddddd、eeeeeee这两个提交记录被删除,但是ddddddd和第eeeeeee的修改内容保存在本地的工作区。 - 硬重置
执行命令:
git reset --hard ccccccc
或者git reset --hard HEAD~2
。 执行完后效果:提交记录中只有aaaaaaa、bbbbbbb、ccccccc三个,ddddddd和第eeeeeee这两个提交记录以及修改内容全部被删除,本地工作区也同步删除。
- 软重置
执行命令:
- 缓冲区不要了,即还未push的代码需要重新add和commit
执行命令:git reset
或者git reset HEAD
。 执行效果:本地commit但为push的内容从缓冲区恢复到工作区。 - 撤销掉第三次提交,但是5和4要保留
执行命令:
git revert ccccccc
执行完效果: 提交记录中增加了一条fffffff Revert '第三次提交'
,同时第三次提交的修改内容全部被回退,本地工作区也同步回退。