Git 用法总结
GUI 客户端软件其实也是调用的 git 接口,有时候 git 命令操作起来更方便
全局设置
用户信息,包含用户名和 email
git config --global user.name calvin
git config --global user.email [email protected]
编辑器
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
现在要把7efebeb
和c2e9a92
合并为一个,使用命令:
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 = [email protected]
公司的 git config 定义在~/.alibaba.gitconfig
:
[user]
name = Jack
email = [email protected]
~/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地址