Git 学习笔记

一、Git简介

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命令描述图为:

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 可以显示分支状态:
    gitlog

  • $ git log --graph --pretty=oneline --abbrev-commit这个是简短形式:
    shortlog

  • 主要是 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分支

merge

不成功的结果如上图,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 git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com: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 就会显示图形化界面。

gui

(2). 在git bash里输入gitk 就会显示图形化的log界面

guilog

2. SourceTree

SourceTree

这个自己看吧,这个工具在生产环境中应该用的最多的,但是就是下载后注册需要翻墙的,这里不多介绍,Mac 版本的比较容易使用。

十、Git 教程链接

  1. 官网英文教程
  2. 官网中文教程
  3. 快速简易指南
  4. 图解多语言(含中文)教程 – 极力推荐
  5. 实战教程 – 比较长,但是很实用
苟且一下