Git

# git commit 代码提交规范

提交代码或创建pull request时,建议使用规范的格式描述改动信息。

事实上并没有统一的标准要求必须怎么做,规范提交格式可以便于对提交历史进行追溯,使代码改动的历史更加清晰。

推荐格式如下(注意英文冒号后有一个空格):

<type>: <subject>
1

type是改动类别,例如以下这些:

  • feature: 新功能(或者feat)
  • fix: 修复bug
  • docs: 文档改动
  • style: 格式(不影响代码运行的变动)
  • refactor: 重构(即不是新增功能,也不是修改bug的代码变动)
  • test: 增加测试
  • merge: 代码合并
  • revert: 回滚到某次提交
  • build: 用于更新构建配置、开发工具等
  • chore: 杂项,其它与功能无关的更改

subject就是commit的简短描述,建议不超过50个字符。

个人感觉subject使用中文还是英文要看情况。例如都是公司的同事,那建议还是中文方便大家看。如果是GitHub上的开源仓库,维护者大多是国外的,那就使用英文更方便交流。

样例:

fix: 用户查询缺少username属性
docs: 补充***的文档
feature: 新增***功能
1
2
3

# 克隆 GitHub 上的项目报错

大概率是网络问题,即使本地开启了科学上网的代理,没有配置好的话也会报错。

遇到过以下报错:

  • OpenSSL SSL_connect: Connection was reset in connection to github.com:443
  • Proxy CONNECT aborted

解决方法:

查看本地科学上网代理的端口,例如:

HTTP 127.0.0.1:10809
SOCKS5 127.0.0.1:10808
1
2

给git设置全局代理:

git config --global http.proxy 127.0.0.1:10809
git config --global https.proxy 127.0.0.1:10808
1
2

此时应该已经可以正常使用git clone了。

还原git代理设置:

如果需想要还原设置,只需要使用下面的命令:

git config --global --unset http.proxy
git config --global --unset https.proxy
1
2

上面是设置全局代码,如果只想在当前仓库设置,使用下面的命令:

# 查看当前仓库的配置
 git config --local -l

# 给当前仓库设置代理
git config --local http.proxy 127.0.0.1:10809
git config --local https.proxy 127.0.0.1:10808

# 取消代理设置
git config --local --unset http.proxy
git config --local --unset https.proxy
1
2
3
4
5
6
7
8
9
10

如果使用了git的GUI工具,例如Sourcetree,修改了代理还是遇到报错,可以尝试重启Sourcetree😂。

# 丢弃本地修改,强制拉取最新

丢弃本地修改,强制拉取远程仓库最新代码。

如果本地只修改了文件,但没有commit,可以使用下面这个命令:

git checkout .
1

如果本地仓库也有提交(没有推送到远程仓库),使用下面的命令:

# 获取远程仓库代码(不是合并)
git fetch --all
# 把HEAD强制指向某分支,例如master分支
git reset --hard origin/master
1
2
3
4

# 删除所有未跟踪的文件和目录

# 删除工作区中所有未跟踪的文件和目录(不会删除已add的文件)
git clean -f -d
1
2

# 代码仓库太大,git clone 拉不下来

代码仓库太大(例如超过2GB),git clone 时容易中断或者报错。

代码仓库大可能有两个原因:

  • 存储的文件本身就大,例如存储了jar包、静态资源等文件
  • 代码仓库分支多,提交历史记录多

经过多次实践,记录一下自己体验较好的方式。

注意

强烈建议先使用SSH克隆试试,如果还是不行再尝试下面的方法。

第一步:只克隆代码仓库中某一个分支,并且是浅克隆(例如只获取最近一次的提交记录)

git clone --depth 1 -b 分支名 代码仓库链接
1

第二步:修改仓库配置

修改.git/config 文件中的配置.

因为克隆的时候指定了一个具体分支,git fetch也只会获取一个分支的内容。

修改前:

[remote "origin"]
	url = 代码仓库链接
	fetch = +refs/heads/分支名:refs/remotes/origin/分支名
1
2
3

修改后(就是把分支名改成了*):

[remote "origin"]
	url = 代码仓库链接
	fetch = +refs/heads/*:refs/remotes/origin/*
1
2
3

第三步:获取所有分支代码

执行git fetch,等待拉取结束即可。

(因为仓库较大,等待时间还是可能长一点,但已经比直接完整克隆要稳定很多了。)

# 使用Git时选择SSH协议还是HTTP协议

个人总结:只有克隆开源仓库且不提交修改时使用HTTP协议比较方便,其余场景全部推荐使用SSH协议。

参考:

# SSH协议

优点:

  • 免密登录(前提是先在本地生成 SSH 密钥对,再把公钥上传到服务器,此后用SSH协议都可以免密登录)
  • 传输速度快且比较稳定

缺点

  • 必须得使用ssh密钥对,例如在一个没有SSH私钥的电脑上想要克隆一个开源仓库都不行,此时使用HTTP协议就可以

# HTTP协议

优点:

  • 方便克隆开源仓库

缺点:

  • 可能经常要输入用户名密码(我使用Bitbucket因为异地登录账号经常被锁定,必须得在web端重新输入验证码登录,体验极差)
  • 克隆体积较大的仓库时连接不如SSH协议稳定