Skip to main content

Git 用法总结

· 6 min read

GUI 客户端软件其实也是调用的 git 接口,有时候 git 命令操作起来更方便

全局设置

用户信息,包含用户名和 email

git config --global user.name calvin
git config --global user.email calvin@example.com

编辑器

Linux 环境下默认是 nano 编辑器

git config --global core.editor /usr/bin/vim

这个最好设置一下,因为下面的rebase等命令会需要用来编辑文本

gitignore

git config --global core.excludesfile /Users/zhangwen/.gitignore_global

github 开源了一个收集各个语言、系统环境相关的gitignore

设置代理

git config --global http.proxy socks5://127.0.0.1:1086
git config --global https.proxy socks5://127.0.0.1:1086
git config --global http.sslverify false

指定域名代理:git config --global http.https://github.com.proxy socks5://127.0.0.1:1086

合并多个提交

使用命令rebase。假设有三段提交历史,如下:

commit 7efebeb

commit c2e9a92

commit 4f4c6f8

现在要把7efebebc2e9a92合并为一个,使用命令:

git rebase -i 4f4c6f8

-i的参数表示不需要合并的提交,然后会自动进入 vim 的编辑界面:

 pick c2e9a92 设置数据的基类
pick 7efebeb 修改model

## Rebase 4f4c6f8..7efebeb onto 4f4c6f8 (2 command(s))

有几个命令需要注意:

  • pick 使用这个提交,缩写 p
  • squash 使用这个提交合并到前一个提交,缩写 s
  • drop 丢弃提交,缩写 d

现在把第二行的pick改成s,然后保存退出:wq。然后会自动进入编辑新 commit 记录的界面,非#开头的内容都当做历史记录,然后保存退出:wq,自动提交成功了。

取消合并使用命令:

git rebase --abort

获取最新的 tag

tag 一般是版本号,经常需要使用最新的版本号当做文件名的一部分,命令如下:

git describe --tags --abbrev=0

删除 github 的 tag

网站上没有提供操作按钮,只能使用命令行操作在本地删除之后,再推送到服务器:

git tag -d [tag]
git push origin :[tag]

如果不行的话,第二条命令改成下面这种:

git push origin :refs/tags/[tag]

找回提交到分支HEAD里的代码

HEAD是指当前分支,每次checkout改变分支,它就会指向哪里。有时分支没有名字,此时就变成detached(游离)状态的。

经常在 submodule 里面,当你直接在 submodule 修改代码并提交后,再切换回master,刚刚提交的代码不见了,而且HEAD分支也不见了。

但刚刚提交的代码还在 git 里面,并没有丢失,此时可以用git reflog查看提交记录,找到刚刚的提交记录,假设为247e11b,执行下面的命令即可:

## 切换到 247e11b,此时是 detached
git checkout 247e11b
## 把 detached 分支保存下来,命名为 diff 分支
git checkout -b diff
## 切换到 master 分支
git checkout master
## 合并 diff 到 master
git merge diff

针对不同的项目配置不同的 name 和 email

GitHub 项目和公司的项目一般会有不同的姓名和邮箱,要自动区分不同域名的 git 地址,一般会选择创建两个 ssh key,然后分别在服务器里面配置。

现在发现一个 git v2.13 之后的新功能,includeIf可以根据不同的目录,加载不同的配置文件,官方文档点击链接

~/.gitconfig里面增加如下格式配置:

[includeIf "gitdir:~/to/group/"]
path = /path/to/xxx.gitconfig

上面这段配置的意思是:在 "~/to/group/"目录下的所有 git 项目,自动加载"/path/to/xxx.gitconfig"的配置,重复的会被后面的覆盖掉。

假如默认是 GitHub 的账号,~/.gitconfig的用户名和邮箱配置如下:

[user]
name = github_name
email = user@github.com

公司的 git config 定义在~/.alibaba.gitconfig

[user]
name = Jack
email = jack.ma@alibaba.com

~/projects/github/是开源项目目录,~/projects/alibaba/公司的项目目录,那配置参数如下:

[includeIf "gitdir:~/projects/alibaba/"]
path = ~/.alibaba.gitconfig

注意点:

  • 目录最后一定是/结尾
  • 如果要忽略目录的大小写,比如 Windows 下,gitdir:~/to/group/换成gitdir/i:~/to/group/即可

多个 remote 配置

添加单独的 remote 仓库

git remote add origin 你的Gitlab仓库地址
git remote add github 你的Github仓库地址

在同一个 remote 里面再加一个地址

git remote set-url --add origin 你的Gitee地址