在工作中,发现不少同学对Git的掌握非常基础,同样作为版本控制系统,使用好Git比SVN要更有挑战,需要对Git有一定的了解,才能在工作中,驾驭好Git。
本文从最简单的基础入门,讲解工作中常用的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
总结
欢迎大家阅读本文,如果你觉得本文对你有帮助,那就点赞加关注作者吧,如果对本文有任何疑问,欢迎在评论区交流。
原创不易,求分享、求一键三连
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。