如何高效地使用 Git

cover

Git 是一个免费且开源的 版本控制 系统,是目前最为流行的 源代码管理 工具,本篇文章从 Git 的基本指令到进阶操做,包含了使用 Git 的过程当中遇到的大部分大小问题

基本操做

初始化设置

设置用户名和邮箱前端

$ git config --global user.name "用户名"
$ git config --global user.email "邮箱"

- 其中,--global 是全局设置,若是想对特定项目使用不一样配置,可取消该参数
- git config 还能够设置其余选项,由于平时不怎么用,因此详细能够参考 git config --help

查看配置node

$ git config --list

# 查看 Git 的某一项配置
$ git config user.name

建立 SSH Keygit

$ ssh-keygen -t rsa -C "邮箱"

# 而后会在用户主目录下,发现 .ssh 目录,其中包含 id_rsa 和 id_rsa.pub 两个文件
# id_rsa.pub 是 SSH Key 公钥,将其添加到 github 的 SSH keys 中,就能够将本地仓库推送到远程仓库了

建立本地仓库,进行基本源代码管理

# 初始化仓库
$ git init

# 将源代码提交到暂存区
$ git add .

# 提交暂存区的源代码
$ git commit -m "本次提交说明"

# 查看当前状态
$ git status
$ git status -sb  // 查看 branch 和 short status

# 查看提交历史
$ git log

将本地代码同步至远程仓库

# 克隆
$ git clone 仓库地址

# 远程仓库
$ git remote

# 分支
$ git branch 分支名    // 建立
$ git checkout 分支名  // 切换

# 合并
$ git merge 分支名

# 拉取更新
$ git fetch 主机名 分支名    // 不合并
$ git pull 主机名 分支名    // 合并

# 推送
$ git push 主机名 分支名

# 打标签
$ git tag -a 版本号 -m "版本说明"

进阶操做

忽略 SSL 证书错误

经过 HTTPS 访问 Git 远程仓库时,若是服务器的 SSL 证书未通过第三方机构签署,那么 Git 就会阻止这一操做github

$ env GIT_SSL_NO_VERIFY=true git clone 仓库地址
$ cd 仓库名称
$ git config http.sslVerify "false"

- 使用 env 命令保证了忽略证书错误只应用于这次克隆

储藏

当有未提交的修改,执行 切换分支拉取更新 须要仓库状态保持 clean 的一些操做时,可使用 git stash 将目前的修改临时储藏起来web

# 储藏
$ git stash

# 查看储藏
$ git stash list

# 应用最近储藏并删除
$ git stash pop

# 应用指定储藏不删除
$ git stash apply [储藏名]

# 移除储藏
$ git stash drop 储藏名

撤消操做

对于 工做区暂存区 的修改,咱们不能保证上次操做是完美的,git 就是这么强大,提供了不少 反悔 的操做vim

# 丢弃暂存区的文件,放回工做区
$ git reset HEAD 文件

# 丢弃工做区的修改
$ git checkout -- 文件

- 修改后没添加到暂存区,则撤销到 git commit 时的状态
- 修改后添加到暂存区,则撤销到 git add 时的状态

# 覆盖上次提交
$ git commit --amend [-m "本次提交说明"]

版本回退

# 回退到以前的某次提交
$ git reset --hard commit_id

- HEAD 指向当前版本
- git log 能够查看提交历史,以便肯定要回退到哪一个版本
- git reflog 能够查看命令历史,以便肯定要回到将来的哪一个版本

# 撤销一个已经提交
$ git revert commit_id

- 并无从项目历史中移除这个 commit, 而是生成一个新的 commit

分支

Git 有不少优势,其中 分支使用方便 就是很显著的一条,建立仓库的时候,master 是默认的分支,通常,咱们会建立其余的分支在上面进行开发,完后再将它们合并到主分支上来服务器

# 建立开发分支
$ git branch dev

# 建立并切换到开发分支
$ git checkout -b dev

# 切换回主分支
$ git checkout master

# 快速检出上一个分支
$ git checkout -

# 查看全部分支
$ git branch -a

# 查看合并到当前分支的分支列表
$ git branch --merged

# 查看还没合并到当前分支的分支列表
$ git branch --no-merged

# 删掉临时分支
$ git branch -d fix

# 将开发分支推送到远程仓库
$ git push origin dev

# 重命名分支
$ git branch -m dev develop

# 删除远程分支
- $ git push origin --delete 分支名
- $ git push origin :分支名

标签

软件要发布一个新的版本的时候,咱们一般给它打个 tagapp

# 打标签
$ git tag [-a] 标签名 [-m 附注信息 某次提交的id]

# 推送标签到远程仓库
$ git push origin 标签名
$ git push origin --tags    // 推送全部标签

# 删除本地标签
$ git tag -d 标签名

# 删除远程标签
$ git push origin --delete 标签名
$ git push origin :refs/tags/标签名

提交

# 花式查看提交
$ git log --pretty=oneline  // 只显示一行
$ git log --abbrev-commit   // 只显示 SHA-1 的前几个字符
$ git log --graph           // 显示 ASCII 图形表示的分支合并历史
$ git log --relative-date   // 使用较短的相对时间显示
$ git log --name-only       // 仅在提交信息后显示已修改的文件清单
$ git log -n                      // 显示最近的 n 条提交
$ git log --author=fengshangwuqi  // 仅显示指定做者相关的提交
$ git log --grep                  // 仅显示含指定关键字的提交

# 没有任何改动的提交
git commit -m "a no chnage commit" --allow-empty

主要用于一下情形:
- 标记新的工做或一个新功能的开始
- 记录对项目的跟代码无关的改动
- 跟使用你仓库的其余人交流
- 做为仓库的第一次提交,由于第一次提交后不能被 rebase

git pull 与 git pull --rebase 的区别

$ git pull = git fetch + git merge
$ git pull --rebase = git fetch + git rebase

git merge 与 git rebase 的区别

# 相同点
整合的最终结果所指向的快照是同样的

# 不一样点
## 提交历史不一样
- merge 会生成一个新的 commit 节点,提交历史忠实地记录了实际发生过什么
- rebase 不会产生额外的 commit 节点,提交历史反映了项目过程当中发生了什么
## 冲突处理策略不一样
- merge 碰见冲突后会直接中止,等待手动解决冲突并从新提交后,才能再次 merge
- rebase 碰见冲突后会暂停当前操做,开发者能够选择手动解决冲突,而后 git rebase --continue 继续,或 --skip 跳过,或 --abort 中止

# 注意事项
## 推荐 git merge 结合 --no-ff 一块儿使用
- git merge 默认是 fast forward(快速合并),适用于分支 B 从分支 A 从 checkout 出来后,分支 A 没有 commit
- 若是分支 B 被 checkout 出来后,分支 A 也有修改,那么就无法快速前进合并,会额外创建一个 merge commit,对分支 A 和分支 B 作一个合并操做,即 --no-ff,它的好处是保持了分支的结构

其余

忽略特殊文件

对于 操做系统自动生成 的文件,编译生成 的中间文件,以及带有 敏感信息 的配置文件等,咱们不想追踪,也不想放进咱们的远程仓库中,这时,咱们建立一个 .gitignore 文件来忽略上述文件,下面是一个前端工程忽略的文件参考ssh

# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed
*.DS_Store

# testing
coverage

# Dependency directory
node_modules

# Bower
bower_components/
dist

# WebStorm文件
*.idea/

# vscode文件
.vscode/

# Emacs
.tern-port
.#*
*#
*~

# vim
.agignore

# 敏感信息
default.yml

Commit message 指南

好的 Commit message 能够提供更多的历史信息,方便 快速浏览和查找,还能够直接生成 Change log,通常至少包含 typesubject,type 是 commit 的类别,subject 是 commit 的简短描述curl

## type

- feat:添加新功能
- fix:修补缺陷
- docs:修改文档
- style: 修改格式
- refactor:重构
- perf:优化
- test:增长测试
- chore:构建过程或辅助工具的变更
- revert:回滚到上一个版本

除此以外,有兴趣的同窗还能够添加 gitmojivalidate-commit-msg 等更多内容

使用 Commit 信息关闭 Issue

若是某个提交修复了一个 Issue,当提交到某个分支时,提交信息里可使用 fix/fixes/fixed, close/closes/closed 或者 resolve/resolves/resolved 等关键词,后面再跟上 Issue 号,这样就会关闭这个 Issue

$ git commit -m "fix: ..., fix #1, #2"

这将会关闭 Issue #1 和 #2,而且在 Issue 讨论列表里关联引用此次提交

若是想连接 其余仓库的 Issue,则使用 {user}/{repo}#ISSUE_NUMBER

快速添加许可证文件

在建立一个仓库时,Github 会为你提供一个预置的软件许可证列表

clipboard.png

若是此时没有选择,后来能够经过 web 界面 create new file,输入 LICENSE,点击右侧的 choose a license template 来添加

clipboard.png

一些不错的 github 插件

  • Octotree:提供项目目录
  • GitHub Plus:提供每一个文件的大小和下载连接
  • GitHub Hovercard:悬停在用户头像或仓库地址上时,经过悬浮框提供更多信息
  • Sourcegraph for GitHub:提供 IDE 上经常使用的功能操做
  • Awesome Autocomplete for GitHub:提供更强大的智能搜索
  • Isometric Contributions:更友好地展现提交记录

Git.io

Git.io 是 Github 的 短网址 服务

io

你能够经过 Curl 命令以普通 HTTP 协议使用它

$ curl -i https://git.io -F "url=https://github.com/..."
HTTP/1.1 201 Created
Location: https://git.io/abc123

$ curl -i https://git.io/abc123
HTTP/1.1 302 Found
Location: https://github.com/...

Gists

Gists 方便咱们管理代码片断,没必要使用功能齐全的仓库

Gists

Gist 能够很是方便地获得便于嵌入到其余网站的 HTML 代码

并且,Gists 能够像任何标准仓库同样被克隆,你能够像 Github 仓库同样去修改和更新 Gists,只不过,Gists 不支持目录,全部文件都添加在仓库的根目录下

使用快捷键

github 仓库页面 提供了一些 快捷键 方便你们快速导航,按 ? 能够查看当前页面支持的 快捷键列表

keyboard

使用表情符

咱们在 Pull Requests, Issues, commit, Markdown 文件中能够加咱们喜欢的表情,使用方法以下

:name_of_emoji:

好比 :joy: 会返回一个

更多表情,可参考 emoji-cheat-sheet

其中,可能经常使用的表情有

  • :tada:
  • :sparkles:
  • :bug::
  • :white_check_mark::
  • :wrench:
  • :ok_hand:
  • :construction_worker:
  • :whale:
  • :clap:

总结

关于 Git,若是还有 更有意思的内容或问题,欢迎在评论中交流

相关文章
相关标签/搜索