09 February 2017
号外号外:我的新书《现代JavaScript库开发:原理、技术与实战》出版啦!!!快点我查看
号外号外:一组小而美的JavaScript迷你库!!!快点我查看
号外号外:猿辅导招聘前端,后端,客户端啦!地点:北京!!!快点我查看

这是起底 Git 系列的第五篇,本篇我们来介绍一下 Git 基础。

安装

学习 git 前,你需要先安装 git,git 安装流程请移步这里,里面有各个平台的安装方法

基础

学习命令行工具要学会的第一步就是查看帮助文档,可以用下面的命令查看 git 的帮助信息

git help
git help xxx
git xxx --help
git xxx -h

接下来就是一些自定义信息了,比如配置用户名和快捷命令(别名)

git config --global user.name yanhaijing
git config --global user.email yanhaijing@yeah.net

git config --global alias.st status #git st
git config --global alias.co checkout #git co
git config --global alias.br branch #git br
git config --global alias.ci commit #git ci

值得一提的就是配置换行符了,windows 上的换行符和 mac 和类 unix 不一样,在跨平台时就痛苦了,为了统一,可以将提交到仓库的换行符同配置成 unix 格式

  git config --global core.autocrlf input

如果想把 git 仓库提交到服务器,可能还要配置秘钥,如果你不想每次都输入密码的话

ssh-keygen -t rsa -C yanxuefeng@baidu.com # 生成秘钥

cat ~/.ssh/id_rsa.pub # 获取公钥,配置到github 的sshkey

ssh -T git@github.com # 测试是否生效

玩转 git 的第一步,你需要有一个仓库,获取仓库总共有两种办法

git init # 初始化一个仓库
git clone url # 克隆一个已有仓库

有时候我们不想把某些文件提交到仓库里,比如编译产生的临时文件,此时.gitignore 能够发挥作用,.gitignore 的规则如下

  • # 代表注释
  • 每行是一个 path,glob 模式匹配
  • !代表取非
  • *代表 0 个或多个字符
  • ?代表一个字符
  • []代表集合

.gitattributes 这个还没想好怎么讲,挖个坑坑坑坑

git 仓库的工作流如下

git 的文件状态如下

想查看当前的仓库状态可以使用git status,这个命令能够给出很多提示信息,建议经常使用

关于 commit 的提交,每个 commit 必须是独立,完整的功能,保持适当粒度,不要过大也不要过小;关于提交信息的描述可以参考下开源届的规范,也可以看下我之前整理的提交规范,下面是一个提交的例子

Header = type: subject(feat fix style refactor)
Body = list

feat: 添加分享功能

给每篇博文添加分享功能Œ

- 添加分享到微博
- 添加分享到微信

在 git 内部一个 commit 的信息如下

但后面我们会进行如下的抽象

分支

git 中的分支非常轻量,就是对 commit 的一个引用,默认 git 会新建一个 master 分支,git 中有一个特殊的引用讲座 HEAD,他只想当前所在的位置

有时我们需要新建或删除分支

git branch test # 新家分支test
git branch –d test # 删除test分支,当前HEAD必须不能指向test分支

建好分之后,就该切换到那个分支去了

git checkout test # 切换到test分支

新建并切换分支,可以合并成一个命令,下面的命令等同于上面两条命令

git checkout –b test

在新建的分支上开发一段时间后,你可能需要将其合并到另一个分支去,而合并分支共有 4 中不同的方法,关于这四种方法的区别和场景请看这篇文章图解 4 种 git 合并分支方法

远端

一张图概括远端和本地的关系,以及相应的操作命令

其实 git 在远端是一个完整的仓库,和本地其实一样,也有 HEAD,也有 master;但我们本地为了防止冲突,都将远端的引用名字放到了 origin 下(origin 也可是别的名字)

Remote HEAD -> xxx/HEAD(origin/HEAD)
Remote master -> xxx/master(origin/master)

在.git 下面的 config 文件里面又对应规则的配置信息,fetch 哪一行,设置将远端refs/heads下的放到本地的refs/remotes/origin

[remote "origin"]
      url = git@github.com:yanhaijing/yanhaijing.github.io.git
      fetch = +refs/heads/*:refs/remotes/origin/*

对于远端最常用的操作就是更新和推送

git fetch origin # 将本地的远端和远端进行同步
git merge origin/master # 将本地的远端合并到本地分支

git pull origin # 这相当于上面两条命令

git push origin master # 将本地推送到远程分支

关于 push 的必须得说一下引用展开,下面这些命令是一样的,git 内部都会自动展开成最后一条

git push origin master
git push origin master:master
git push origin heads/master:heads/master
git push origin refs/heads/master:refs/heads/master

有时候我们可能会查看远端的信息,比如看下远端地址啥的

git remote –v # 查看全部远端的摘要信心
git remote show xxx # 查看具体远端的详细信息

有时候我们也会增加或删除远端

git remote add xxx url # 廷加一个新的远端
git remote remove xxx # 删除一个远端

日志

有时我们需要查看 git 的提交日志,可以使用git log,log 有大量参数,感兴趣的同学可以自行探索,但常用的就下面这么几个

git log -number # 显示最近几条
git log --oneline(--abbrev-commit --pretty=oneline)# 单行显示,显示简短commit id
git log --graph # 以树形展示
git log --decorate # 显示分支名等
git log --first-parent # 显示第一父元素(不显示merge进来的树形结构)
git log --all # 显示全部分支

除了git log我们还可以使用 gitk 这个工具,这是 git 2.0 以后加入的图形化工具,可以以更友好等方式查看 log 树,常用的有两个参数

gitk –all # 显示全部分支
gitk --first-parent # 显示第一父元素(不显示merge进来的树形结构)

下图是git log和 gitk 的命令复杂度和显示效果

注:如果你在 mac 下使用 gitk,可能会发现显示非常模糊,这是因为 retina 屏幕的问题,可以尝试下下面的方法

首先安装 retinizer,如果你没安装 brew 可能需要安装 homebrew

$ brew cask install retinizer

然后打开 gitk 所在的目录

$ open /System/Library/Frameworks/Tk.framework/Versions/Current/Resources/

打开 retinizer,并将 Wish.app 拖拽到 retiniaer 的界面,然后点一下那个按钮,然后就 ok 了

下面是带不带--first-parent的区别

有人用 git 的 commit 只做了台北的公交线路图,我表示给跪了,感兴趣猛戳这里

diff

diff 命令常用的命令有两个

git diff file #查看指定文件的差异
git diff --stat #查看简单的diff结果

下图总结了 diff 全部情况

常用命令总结

config
help status log
clone init
add commit
branch checkout diff
merge rebase
fetch pull push remote

总结

如果你有任何疑问的话,欢迎留言讨论;如果本系列文章对你有帮助的话,那我很荣幸,别忘了打赏哦,O(∩_∩)O 哈哈~

最后感谢你的阅读,O(∩_∩)O 哈哈~

继续学习

原文网址:http://yanhaijing.com/git/2017/02/09/deep-git-4/

微信公众号:颜海镜
关注微信公众号 颜海镜
微信支付二维码
赞赏支持 微信扫一扫