git命令博大精深,做为git深度用户,这里介绍几个自己一直在用的自认为很实用的git的配置和技巧。

命令简化

通过git的配置来对命令设置别名,git的配置文件优先级为 local > global > system,其中:

  • local:位于git项目目录中的.git/config,只对特定git项目有效
  • global:位于~/.gitconfig,只对当前登录用户有效
  • system:位于 git的安装目录 /etc/gitconfig,对系统所有用户和所有项目有效

下面是两种设置方式:

  1. 执行命令

     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'
  2. 编辑配置
    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编码

  1. 问题:当工程中有中文目录时,命令行里会显示为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 编码
  2. 问题: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:方式使用秘钥一样不用每次都输入密码:

1
git config --global credential.helper store

全局忽略文件

Mac下面的.DS_Store文件非常讨厌,每个项目初始化都要配置项目.gitignore,其实我们可以设置git的全局忽略文件。

1
2
echo ".DS_Store" >> ~/.gitignore
git config --global core.excludesfile ~/.gitignore

合并本地提交记录

有时候本地提交比较频繁,在push到仓库前想要把本地的历史合并为一个,这是可以考虑使用rebase命令合并最近的几次提交,在接下来的交互时,第一个commit使用 p (使用提交),后面其他的commit全部使用 f (使用提交,但是融合前一次提交,并丢弃提交说明日志)即可。

1
git rabase -i HEAD~2

git reset 和 git revert

  1. git reset 重置,将当前HEAD指针指向某一次提交,也就意味着新指针之后的所有提交记录将被丢弃掉,是比较危险的做法。
  2. 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 '第三次提交' ,同时第三次提交的修改内容全部被回退,本地工作区也同步回退。