在软件工程师的工具列表中,Git
肯定是少不了的,作为分布式版本控制系统,Git
在目前非常流行,可以说,掌握 Git
的使用是工程师的基本功。而且,Git
也会为我们带来诸多的便利,根本离不开它。本文会记录一些常用的 Git
命令,不仅可以自查,也可以帮助读者。
另外,说明一下,关于远程仓库的选择,目前有多种多样,例如:GitHub
、GitLab
、Gitee
【码云】、coding
等等,读者自行选择。其中,最流行的莫过于 GitHub
,在全球非常受欢迎,被微软收购后也没有大家想象的那么可怕,反而更加开源了,现在都可以免费使用 3 个私有仓库了,可见微软还是愿意拥抱开源世界的。
本文中的远程仓库地址格式会以 GitHub
的 HTTPS
协议为准,即:
1 | https://github.com/your_user_name/your_project_name.git |
需要用户输入用户名、密码。
当然,还有一种格式是 SSH
协议的,即:
1 | git@github.com:your_user_name/your_project_name.git |
需要用户在本地生成秘钥,读者使用时可以自行选择。
下载安装
为了使用 Git
,本地肯定要先安装好,在次不再赘述,请读者根据自己的操作系统类型选择合适的版本。Git
客户端下载官方网站:git-scm 。
这里需要注意 回车换行符 的标准选择问题,需要先了解回车符【Carriage Return】、换行符【Line Feed】这两个概念,在计算机出现之前,为了解决打字机换行时的字符丢失问题,研发人员发明了这两个符号,回车符号告诉打字机把打印头定位在左边界,换行符号告诉打字机把纸向下移一行。
但是后来计算机出现后,科学家觉得用两个符号浪费存储空间【当时的存储硬件很昂贵】,保留一个符号就可以,这时候分歧出现了,也就导致现在的多种局面:在 Mac
系统里,每行结尾只有回车符 CR
,即 \\r
;在 Unix
系统里,每行结尾只有换行符 LF
,即 \\n
;在 Windows
系统里,每行结尾有回车换行两个符号 CR LF
,即 \\r\\n
。
这就会导致一个问题,在不同操作系统之间传输文本文件,打开后行会错乱,或者行尾多了不可见符号。
而通过 Git
管理项目时,一般都是代码文件、配置文件,远程仓库如果是 Unix
系统,那么文本文件的每行末尾都是换行符。而当我们本地开发时,用的是 Windows
系统或者 Mac
系统,而且伴随着代码更新、代码推送,多种符号会相互混在一起,就会显得很混乱。不过不用担心,在 Git
中可以设置回车换行符号的标准,在安装客户端时,选择当前操作系统对应的标准,那么每次在 pull
、push
时,Git
会自动转换回车换行符号,保证一致性,这样在跨操作系统编辑文件时也不用担心这两个符号的问题。
初始化
对于新建的本地文件【以及文件夹】来说,需要初始化并关联到远程仓库【例如在 GitHub
新建了一个空白项目】,然后才能方便管理这个项目,可以按照如下流程操作:
1 | # 进入项目目录 |
如果本地的文件夹已经是一个标准 Git
项目,并且没有关联到任何远程分支,则直接关联即可,可以按照如下流程操作:
1 | # 关联到远程仓库 |
需要注意,如果远程仓库已经初始化【例如在 GitHub
上面新建一个包含 README
文件的项目】,本地仓库也已经初始化【执行 init
】,此时关联后进行提交或者拉取更新会失败。git pull
返回错误 fatal: refusing to merge unrelated histories
,提示仓库混乱【本地、远程是两个不同的仓库】,不能拉取;而 git push
则返回 error: failed to push some refs to xx
,也不能提交。
此时不用担心,可以使用参数 git pull origin master --allow-unrelated-histories
来拉取远程仓库的内容,并合并所有内容,紧接着就可以提交本地的变更了。
检出仓库
如果本地目录是空白的,还没有任何项目,则需要从远程仓库克隆项目到本地,可以按照如下流程操作:
1 | # 从远程仓库克隆项目,或者说是检出代码 |
添加提交更新
如果更新了代码,或者新增了文件,需要提交更新,这样才能与别人合作开发项目,可以按照如下流程操作:
1 | # 添加文件,对于新增的文件而言 |
拉取更新
如果在和别人合作开发的过程中,需要拉取别人的变更到本地,可以按照如下流程操作:
1 | # 拉取更新 (如果遇到代码冲突会麻烦,往下看) |
管理分支
如果在开发过程中多人协作,肯定会有多个分支,此时涉及到管理分支的问题,可以按照如下流程操作:
1 | # 新建分支并切换过去 |
当然,此种情况有可能也会遇到代码冲突问题,参见 拉取更新 小节,需要手动解决冲突。
冲突解决
参见 拉取更新 小节,需要手动解决冲突。
更换关联远程分支
如果本地代码,已经关联了远程分支,但是想更换远程分支,例如想从 GitHub
切换到 GitLab
,或者想在不同的项目之间切换。则需要先解除对远程分支的关联,再关联到新的远程分支,可以按照如下流程操作:
1 | # 解除对远程仓库的关联 |
强制更新覆盖本地修改
有些时候我们只想要 Git
远程仓库的代码,而对于本地的项目中修改不做任何理会【即本地的修改不提交,放弃不要了】,这时候就需要用到 Git pull
的强制覆盖,可以按照如下流程操作:
1 | # 拉取远程最新的版本,或者使用 git fetch origin 也行 |
保存用户名密码
Git
可以将用户名、密码和仓库链接保存在硬盘中,而不用在每次 git push
的时候都输入密码。保存密码到硬盘只要一条命令就可以:
1 | git config credential.helper store |
当 git push
的时候输入一次用户名和密码后,就会被记录下来,以后不用再次输入。但是,这样保存的密码是明文的,保存在用户家目录的 ~/.git-credentials
文件中,读者可以查看内容,使用:
1 | cat ~/.git-credentials |
由于这种方式密码是明文存储在文件中的,所以不安全,还是推荐大家使用 SSH
的方式。
此外,如果想手动设置用户名、邮箱,可以按照如下流程操作:
1 | # 如果项目的环境众多,就不要带 --global 参数,否则全局的参数设置会影响到其它 Git 项目 |
管理标签
在软件开发的过程中,创建标签是很有必要的,可以跟踪当前的开发进度,出问题也能及时回退。可以按照如下流程操作:
1 | # 创建标签,标签名字为 1.0.1,commit_id 是当次提交唯一标识 |
一些建议
在使用 Git
的时候,会有一些隐藏的小功能,可以增加使用体验,下面列出几个:
- 自带的图形化工具,使用
gitk
命令即可 - 设置彩色的内容输出,使用
git config color.ui true
设置 - 查看历史记录时,只显示一行注释信息,使用
git config format.pretty oneline
设置 - 添加文件时,如果想使用询问交互的模式,使用
git add -i
,其实就是加了一个-i
参数
此外,在使用 Git
相关的命令时,由于需要反复操作,时间久了会觉得很麻烦,因为每个命令都很长,由多个单词组成,每次都敲一遍还是很低效的。那么有没有什么好办法呢?其实可以合理利用 Linux
系统的别名特性,把自己常用的命令收集起来,分别给它们创建别名,这样在使用时只要简单敲几个字母就行。
我一般是在家目录下的 .bashrc
文件中指定别名,这样每次登录时会自动加载,可以直接在会话终端使用,关于 Git
的别名内容如下:
1 | alias gp='git pull' |
设置别名后,直接使用 gp
就相当于调用了 git pull
,这就很方便了,其它命令也是类似的效果,读者可以根据自己的需要灵活设置。
资源推荐
下面列出一些常见的资源、网站、工具等信息,可能对读者有帮助:
git-tower
工具,可视化管理,官网:git-towersourcetree
工具,可视化管理,官网:sourcetreeappGitHub desktop
工具,可视化管理,官网:desktopGit
社区参考书:book.git-scmGitHub
帮助文档:help.github- 像
Git
一样思考:think-like-a-git