rebase
算冒充大神的必备技能了,移花接木之术,可以任意整理分支树。嫌弃分支树枝枝蔓蔓,一定要学会此招。
git rebase <branch or commit> # 将修改以指定的分支或修改重新应用一下
git rebase -i <branch or commit> # 同上,交互式,可在交互界面里对需要的commits进行修改、压缩、丢弃以及调整顺序等
git pull <remote> <branch> --rebase # 拉取远程代码时使用rebase替代merge操作,本地若有远程没有的修改,则被本地修改rebase到远程代码上。
导出纯代码和浅克隆
很多场景,我们不需要完整的代码仓库,不需要commit历史,我就要最新的或某分支某tag的纯代码而已。
## archive命令就是将纯代码打包(默认tar,可以另指定zip等)
git archive master | tar -x -C /somewhere/else # 等于将代码导出到另一个地方
git archive master | bzip2 >source-tree.tar.bz2 # 代码打包后再压缩下
git archive --format=zip --output /full/path/to/zipfile.zip master # 以zip压缩包导出
## 克隆tag/branch时使用浅克隆
git clone --branch tag-v0.1 --depth 1 git@git.home.nas:gitrepo/hellogit.git
# --depth 1 只取回一次提交记录,同时也生效--single-branch
# 将浅克隆的shallow repo转换为完整repo仓库
git fetch --unshallow origin master
submodule子仓库
对,我们git也可以将别的仓库引用为本仓库的子仓库。比如要创建一个封装类型的工程时,比如直接用git管理golang的vendor模块时,等等。
# 全新克隆时直接将子仓库也全部克隆来
git clone --recurse-submodules https://github.com/wadefelix/YourProjectName
# 若已有项目代码仓库,但其中尚未将子仓取下来时,用下面的
git submodule init
git submodule update
git代理
代码需要穿墙打洞才能取下来或者加速时。
# 设置全局使用git代理,也可以是其它端口啊(不仅限定用443)
git config --global https.proxy https://git-proxy-server:443
git代理配置其实也是在文件里的~/.gitconfig,直接编辑这个文件也可以,它的内容:
[https]
proxy = https://git-proxy-server:443
那怎么搭建代理服务器呢?好咧,常用的nginx就可以,配置文件
server {
listen 80;
listen 443;
resolver 192.168.0.1;
proxy_connect;
location /{
proxy_pass https://$http_host$request_uri;
proxy_set_header Host $host;
}
}
管理登录信息
可以设置保存用户名密码的,命令
git config credential.helper store
设置完毕后,~/.gitconfig配置文件会有:
[credential]
helper = store
保存用户名和密码后~/.git-credentials
文件内容:
https://username:password@git-server
对,明文的,请斟酌。
分支删除
分支用多了,这个算是小儿科了,简列几条:
git fetch -p # 跟随远程删除分支的操作删除本地分支
git fetch -P # 跟随远程删除分支的操作删除本地tag
# 用branch和push分别删除本地分支和远程分支的操作你肯定会,对不对?
git branch --delete <branch>
git push origin --delete <branch>
git后悔药
- 工作区的代码想撤销:
git checkout -- <file>
- add到暂存区的代码想撤销:
git reset HEAD
或git unstage
- 提交到本地仓库的代码想撤销:
git reset --hard <版本号>
- 把刚刚的提交撤回到暂存区:
git reset --soft HEAD~1
- revert某此修改(会新增一条commit执行反向修改而已):
git revert $id
- 回滚后反悔怎么办?:
git reflog
记录了我们的每一次命令( commit、merge 等信息), 根据这命令来查出我们的历史 commit id,然后git reset
即可 - 另外,
git rebase -i
也可以撤销之前的提交。edit
修改,drop
丢弃,squash
合并压缩