git常见操作与实践总结
作为一名开发者,熟悉使用 git 代码管理工具是一项必备的基本技能。
git 相较 SVN 而言,其优点不言而喻。git 的功能非常强大,其包括的操作命令也非常的多,但是从实用性而言,很多命令可能我们平时也用不到,这里只记录一些经常使用的命令。
熟练使用这些操作,就可以完全得心应手的使用 git 工具了。
安装git命令
在 Linux 系统上安装,有多种方式比如 yum、apt、src 等方式
1 | # 在 centos、redhat 可以使用 yum 方式安装 |
源码安装git
有时通过二进制方式安装的 git 命令满足不了当前需求,比如系统自带的版本太低等问题。
典型的,在 go get
安装包时,会用到 git fetch --unshallow
命令,我们需要安装更高版本的 git 才支持 --unshallow
参数
具体安装方法和过程总结如下
1 | $ cd /tmp |
常见基本配置
1 | # 设置用户名和邮箱 |
--global
:为全部仓库设置生效,如果是自己的私有开发环境,可以加此参数;--local
:只为当前仓库设置生效;
初始化仓库
仓库,英文名 repository。可以简单理解成一个目录,这个目录里面的所有文件都可以被 git 管理起来,每个文件的修改、删除,git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以”还原”。
1 | $ mkdir learngit |
可以发现当前目录下多了一个 .git
的目录,这个目录是 git 来跟踪管理版本库的,千万不要手动修改这个目录里面的文件,否则就把 git 仓库给破坏了
关于文件变动跟踪
首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如 TXT 文件、网页、代码等等, git 也不例外。
版本控制系统可以告诉你每次的改动,比如在第 5 行加了一个单词 “Linux” ,在第 8 行删了一个单词 “Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从 100KB 改成了 120KB,但到底改了什么,版本控制系统不知道,也没法知道。
关于编码
因为文本是有编码的,如果没有历史遗留问题,一定要使用标准的 UTF-8
编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
代码提交
查看repo状态
1 | $ git status |
添加文件到缓存区
1 | $ git add file1.txt |
提交到版本库
1 | $ git commit -m "message" |
管理修改
丢弃工作区的修改
1 | $ git checkout -- file.txt |
丢弃暂存区的修改
1 | $ git reset HEAD file.txt |
撤销提交(版本回退)
1 | $ git reset --hard HEAD^ |
修改最后提交的commit信息
如果需要修改 commit 提交信息,可以通过 --amend
选项进行修改
1 | git commit --amend |
管理修改的举例
- 场景1
- 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
- 场景2
- 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
- 场景3
- 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
查看工作区与版本库的差异
1 | $ git diff HEAD -- file.txt |
查看提交版本日志
1 | $ git log --pretty=oneline # --pretty选项更清晰显示 |
远程库操作
克隆远程库
1 | $ git clone http://gitlab.com/chopin/gitver |
添加远程库(给本地库)
1 | $ git remote add origin git@gitlab.staff.sina.com.cn:chopin/gitver.git |
推送远程库
1 | $ git push -u origin master # 第一次推送加'-u'选项, 关联本地与origin的master分支 |
拉取远程库
1 | $ git pull <远程主机名> <远程分支名>:<本地分支名> |
在默认模式下,取回远程主机某个分支的更新,再与本地的指定分支合并。git pull 是 git fetch 后跟 git merge 的缩写。
比如,要取回 origin 主机的 next 分支,与本地的 master 分支合并,需要写成下面这样
1 | $ git pull origin next:master # 如果要与当前分支合并, 则冒号后面的部分可以省略 |
相当于:
1 | $ git fetch origin |
手动建立追踪关系:
1 | $ git branch --set-upstream master origin/next |
上面命令指定 master 分支追踪 origin/next 分支。如果当前分支与远程分支存在追踪关系,git pull 就可以省略远程分支名
1 | $ git pull origin # 如果当前分支只有一个追踪分支,连远程主机名都可以省略 |
分支管理
创建分支
1 | $ git branch b1 |
切换分支
1 | $ git checkout b1 # 切换到b1分支 |
合并分支
1 | $ git merge dev # 合并dev分支到当前分支 |
分支策略
主分支master
代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。
开发分支develop
主分支只用来分布重大版本,日常开发应该在另一条分支上完成。这个分支可以用来生成代码的最新隔夜版本(nightly)。如果想正式对外发布,就在 master 分支上,对 develop 分支进行”合并”
临时性分支
feature
:功能分支release
:预发布分支fixbug
:修补问题分支
功能分支
它是为了开发某种特定功能,从 develop 分支上面分出来的。开发完成后,要再并入 develop。
预发布分支
它是指发布正式版本之前(即合并到 master 分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从 develop 分支上面分出来的,预发布结束以后,必须合并进 develop 和 master 分支。它的命名,可以采用 release-x 的形式。
修补问题分支
软件正式发布以后,难免会出现 bug。这时就需要创建一个分支,进行 bug 修补。修补 bug 分支是从 master 分支上面分出来的。修补结束以后,再合并进 master 和 develop 分支。它的命名,可以采用 fixbug-x 的形式。