一、Git简介
Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何大小项目的版本管理。与 CVS 相比,它不是把版本库放在集中的存储服务器,而是每个开发者电脑上都是一个版本库,无须联网就可以管理代码版本,并且分支管理更高效,切换更快捷方便,已经成为现在开发者主流版本控制工具。
二、前言
Git 仓库初始的创建通常有两种方式,一种是自己本地创建项目,再链接到远程仓库。另一种是先创建远程仓库,再将远程仓库克隆 ( git clone
) 到本地。接下来我就分别从这两个方式讲解。
三、本地仓库创建
初始化仓库:
1 2 3 |
mkdir gitstudy cd gitstudy git init |
加入暂存区:
1
|
git add hellogit.txt
|
或者
1
|
git add -A 或者 git add . // 是添加全部文件
|
将文件加入历史版本:
1
|
git commit -m "add hellogit file" // -m是该版本的说明语句
|
与远程仓库链接:
1
|
git remote add origin https://gitcafe.com/jiyiren/gitstudy.git
|
提交到远程仓库:
1 2 |
git push -u origin master // -u 第一次提交让git记住本地仓库与远程仓库 //的连接,以后可以不要 |
四、远程仓库先创建
创建远程仓库,可以到 github 或者 gitcafe 或者 gitosc 等
将远程仓库克隆 ( clone ) 下来,本地就会有对应的文件夹仓库
1
|
git clone https://gitcafe.com/jiyiren/gitstudy.git
|
修改后加入暂存区,提交到历史版本,再推送到远程
1 2 3 |
git add -A git commit -m "modify hellogit file" git push origin master |
五、版本管理
1. 说明
我们有两个仓库,一个本地仓库,一个远程仓库,两个仓库互相关联。本地仓库为了开发代码,远程仓库为了记录版本和保存正确的代码。Git 的主要功能都应该在我们本地仓库里使用,那 Git 具体怎么管理代码的呢?这要先从本地仓库的划分说起。本地仓库也就是开发的文件夹里,分为工作区,暂存区和历史版本区,工作区就是我们实际操作的区域,暂存区就是git add后文件进入的暂存状态,历史版本区是 git commit
后文件记录在历史版本里的区域。我们的 git push
就是向远处推送 历史版本区 的内容,工作区 和 暂存区 为我们的版本回退提供方便。
2. 重要命令解释
主要说明 Git 中使用频率很高的几个命令。
(1). git status
$ git status
查看当前的工作区的状态,通常有三种状态:
- 一种是工作区干净: nothing to commit, working directory clean, 无需更新操作版本;
- 一种是使用了git add之后,显示Changes not staged for commit(提示有已添加但是未提交的修改)
- 一种是新添加文件后,显示 Untracked files(提示有未跟踪的文件)
(2). git diff
$ git diff
命令描述图为:
- 这个命令的理解点就是在参照物,也就是对比双方是谁。
$ git diff
图片中 1 标号内容,该句将 工作区的修改与暂存区对比。例如:$ git diff mtest.txt
$ git diff --cached
图示 2 标号,这句则是将
暂存区与本地历史版本区中的最新版本 对比。例如:$ git diff --cached mtest.txt
$ git diff HEAD
图示 3 标号,这句是将 本地工作区(包含了暂存区内容)与本地历史版本区里的最新版本 对比。如:$ git diff HEAD -- mtest.txt
, 此处文件名要用--
分隔,前后都有空格。- 图示 4 和 图示 5 分别为两个历史版本 id 对比和本地与分支的对比。这个用的都比较少。
(3). git log
git log
主要显示提交版本历史记录
$ git log
或者$ git log --pretty=oneline
可以显示我们提交版本的记录,按照从近到远的版本显示。$ git log --graph --pretty=oneline
可以显示分支状态:
$ git log --graph --pretty=oneline --abbrev-commit
这个是简短形式:
- 主要是
git log
结合多种参数显示各种结果具体参数请看 git log参数
(4). git reset
git reset --hard <版本>
回退版本,有两种方式,一种是相对回退,我们都知道 HEAD 默认指向当前分支的最新历史版本,而 Git 给了我们一种以 HEAD 方式的相对语句就是 HEAD^
这个代表当前版本的上一个版本,HEAD^^
代表当前版本的上上一个版本,可以一直加 ^
向上的箭头来回退版本。当然如果回退个数很多比如100个,那个写100个 ^
也麻烦,所以有缩写就是HEAD~100
。
1 2 |
git reset --hard HEAD^ //回退到上一个版本 git reset --hard HEAD~100 //回退到上100个版本 |
另一种方式是绝对回退,上面的命令 $ git log --pretty=oneline
可以显示历史提交版本的 commitid, 当然很长,但是记录前面 7 个数字就可以了标识一个版本了。
1
|
git reset --hard 3628164 // 回退到3628164..的版本
|
(5). git reflog
git reflog
这个是命令历史记录。当我们回退到上一个或者几个版本时,我们用 $ git log
命令查看的只能显示是当前版本以及当前版本之前的,那比当前版本还新的版本我们就看不到了,那怎么办?git reflog
就可以显示我们所有操作的命令历史,注意与 git log
的区别,git log
是版本历史记录,git reflog
是命令历史记录。从这个里面就可以找到最新版本的 commitid
,就可以回退到任意一个版本。
(6). git checkout/reset
这两个命令也有撤销修改的功能,其实回退版本也相当于撤销修改了,但是有特别的几个命令比较常用,这里讲下。
git checkout -- filename
这个是将工作区下的文件恢复到暂存区下的状态,取消本地未暂存的修改,暂存区不请空,也就是如果你后来的修改将被撤销。如:$ git checkout -- mtext.txt
。git reset HEAD filename
这个是将 暂存区的修改恢复到本地工作区,暂存区将清空。如:$ git reset HEAD mtext.txt
。
六、分支与合并
下面列出最常用的分支操作,以及命令解释。
查看分支:
1 2 3 |
git branch //查看本地分支 git branch -r //查看远程分支 git branch -a //查看所有分支(包括本地和远程) |
创建分支:
1
|
git branch develop //创建develop分支
|
切换分支:
1
|
git checkout develop //切换到develop分支
|
创建并切换分支:
1
|
git checkout -b mdeve //创建并切换到mdeve分支
|
删除分支:
1
|
git branch -d mdeve //删除mdeve分支,强行删除用-D
|
合并分支默认 ff 模式:
1
|
git merge mdeve //合并mdeve分支到当前分支
|
默认合并方式是 Fast-forward,也就是将要合并的分支直接向当前分支提交。没有提交信息
解决冲突:
很多时候用Fast-forward方式直接提交是不成功的,因为有冲突存在,所以我们要手动解决冲突
1
|
git merge feature1 //合并feature1分支
|
不成功的结果如上图,Git用 <<<<<
这个箭头表示 HEAD 当前分支,====
这个为分隔线,>>>>>>
这个为 feature1 分支里的内容,只要手动删除这三处并自己选择内容作为最终结果。
合并分支禁ff模式合并:
1
|
git merge --no-ff -m "merge no ff" dev //采用no ff模式合并并添加了信息提示
|
Fast-forward 模式合并直接向当前分支提交,这种模式下如果删除掉分支,就会丢掉分支信息
如果用 no ff 这种模式合并, Git 就会在 merge 时生成一个新的 commit, 这样就可以从分支历史里查看出分支信息了。
暂存临时现场:
1
|
git stash //把工作现场存储起来,使得工作区干净如初
|
主要用于在自己工作到一半,没法提交,然后又有新的 bug 要修复,就用这个命令保存现场,然后切换到 bug 分支,修复。
恢复临时现场:
1 2 3 4 |
$ git stash list //查看临时工作区保存记录 stash@{0}: WIP on dev: 6224937 add merge//这是临时工作区记录列表 $ git stash apply stash@{0} //恢复刚刚的临时工作区 $ git stash drop stash@{0} //删除刚刚的临时保存记录 |
上面的命令已经可以恢复并删除保存记录了,但是语句比较多,还有一种方法直接恢复到最近一次的临时现场:
1
|
git stash pop //既恢复工作区又删掉了保存记录
|
七、多人协作(重点)
1. 说明
这是 Git 工具最常见的使用环境,也是开发者正是开发中的工作环境,一个团队离不开多人协作。
2. 讲解
查看远程信息:
1 2 3 4 5 |
$ git remote //查看远程库的信息 origin $ git remote -v //查看更详细信息 origin [email protected]:michaelliao/learngit.git (fetch) origin [email protected]:michaelliao/learngit.git (push) |
推送分支:
1 2 |
git push origin master //推送主分支 git push origin mdev //推送mdev分支 |
抓取分支:
这里模拟多人协作,假如你自己和一个 A 同学协作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
A同学: $ git clone url.. //先从仓库克隆 $ git branch //查看分支,默认只有master分支,但是远程是有dev分支的 $ git checkout -b dev origin/dev //所以要本地创建dev并与远程相连接 $ git commit -m "add something by A" //A同学修改了东西并添加入版本库 $ git push origin dev //上传到远程仓库 我自己: $ git commit -m "add something by me" //此时我自己也修改了一些东西, //并与A同学该的相同地方 $ git push origin dev //此时推送将推送失败,提示先git pull $ git pull //于是你也就git pull,提示失败,本地dev未与远程连接 $ git branch --set-upstream dev origin/dev //再按照提示将本地分支与远程连接 $ git pull //再次git pull,成功,但是出现冲突,解决冲突 $ git commit -m "merge&add something" //提交冲突,至此就完成了多人协作 |
分支链接 ( 重要 ):
$ git checkout -b dev origin/dev
这个是新建本地分支为 dev 并与远程的 dev 相关联
$ git branch --set-upstream dev origin/dev
这个是我之前新建了分支,但是没有关联到远程分支,这里是将已有的分支关联到远程分支。
八、标签
打标签两种方式:
1 2 3 4 5 6 7 |
$ git branch //查看分支 *dev master $ git checkout master //切换到要打标签的分支 Switched to branch 'master' $ git tag v1.0 //用git tag name来打标签,默认打在最新提交的commit上 $ git tag //查看所有标签 |
还可以如下打标签,按照 commit id 来打标签,如下:
1 2 3 4 |
git log --pretty=oneline --abbrev-commit//查看commit历史,找到要打标签的id号 git tag v1.0 622493 git tag //查看标签列表(按照标签名列出) git show v1.0 //查看v1.0标签的详细信息 |
删除分支和推送分支:
1 2 3 4 5 6 |
git tag -d v0.9 //删除标签0.9,创建的分支默认都在本地,不会自动推送到远程。 git push origin v1.0 //将标签1.0推送到远程 git push origin --tags //一次性将全部未推送的标签推送到远程 //要删除远程标签,有点麻烦的 git tag -d v0.9 //先从本地删除标签 git push origin :refs/tags/v0.9 //然后再从远程删除标签 |
九、图形化界面
1. Git 自带图形化界面的
(1). 在 git bash 里输入 git gui
就会显示图形化界面。
(2). 在git bash里输入gitk
就会显示图形化的log界面
2. SourceTree
这个自己看吧,这个工具在生产环境中应该用的最多的,但是就是下载后注册需要翻墙的,这里不多介绍,Mac 版本的比较容易使用。
十、Git 教程链接
- 官网英文教程
- 官网中文教程
- 快速简易指南
- 图解多语言(含中文)教程 – 极力推荐
- 实战教程 – 比较长,但是很实用