Git

基础原理

Git 是一个分布式版本管理系统,可以在任何时间点,把文档的状态作为更新记录保存起来,因此可以把编辑过的文档复原到以前状态,也可以显示编辑前后的内容差异.

版本库(Repository)是记录文件或目录状态的地方,存储着内容修改的历史记录,在版本库的管理下,把文件和目录修改的历史记录放在对应的目录下.

远程版本库和本地版本库

git分远程版本库和本地版本库,远程版本库配有专门的服务器,为了多人共享而建立的数据库,本地版本库是为了方便用户个人使用,在自己机器上配置的版本库.

两种创建版本库方法:

  • 创建全新的版本库
  • 复制远程版本库

提交

若要把文件或目录的添加和变更保存到版本库,就需要进行提交

执行提交后,版本库中就会生成上次提交的状态与当前状态的差异记录 (也称为revision)

如果,提交是按时间顺序保存到版本库中的,凭借该提交和最新的文件状态,就可以直到过去的修改记录以及内容.

系统会给出一个40位的名字来指定这次提交,这样就可以在数据库中找到对应的提交

不同类别的修改 (如:Bug修复和功能添加) 要尽量分开提交,以方便以后从历史记录里查找特定的修改内容。

工作区和暂存区

git管理下,实际操作的目录被成为工作区.

在版本库和工作区之间有暂存区,索引是为了向版本库提交作准备的区域

Git在执行提交的时候,不是直接将工作树的状态保存到数据库,而是将设置在中间索引区域的状态保存到数据库。因此,要提交文件,首先需要把文件加入到索引区域中。

使用基础

安装后,输入用户名和电邮,这些信息将作为提交者信息显示在更新历史中.

1
2
$ git config --global user.name "brett427"
$ git config --global user.email "wangkangning1@foxmail.com"

新建数据库

首先在任意一个地方创建tutorial目录。然后使用init命令把该tutorial目录移动到本地Git数据库。

1
git init

提交文件

确定工作树和索引的状态git status

文件加到索引,使用git add

提交文件 git commit -m ""

查看提交记录 git log--pretty=oneline

#### PUSH到远程客户端

为了将本地数据库的修改记录共享到远程数据库,必须上传本地数据库中存储的修改记录。为此,需要在Git执行推送(Push)操作。执行Push之后,本地的修改记录会被上传到远程数据库。所以远程数据库的修改记录就会和本地数据库的修改记录保持同步。

版本回退

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。 版本回退,就使用 git reset

1
2
3
git reset --hard HEAD^
或者直接指定版本号
git reset --hard 42342342

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD改变了指向

1
git reflog 记录每一次命令!!!!!!

当不知道reset号的时候,可以用reflog去找

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

1
2
git diff    #是工作区(work dict)和暂存区(stage)的比较
git diff --cached #是暂存区(stage)和分支(master)的比较

丢弃修改

丢弃工作区的修改
1
git checkout --<filename>   # 丢弃工作区的修改

就是让这个文件回到最近一次git commitgit add时的状态。

丢弃暂存区的修改
1
git reset HEAD <filename>

使用git reset HEAD <filename>,就回到了上面选择丢弃工作区的修改的状态.

删除文件

1
git rm 并且  git commit

分支管理

概念

在版本回退中,每次提交,git都会把他们串成一条时间线,上面所有的操作,只有一条时间线,也就是主分支,即master分支,HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并.

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支.

操作

创建dev分支,然后切换到dev分支

1
2
git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于git branch dev. git checkout dev

1
git branch   # 查看当前分支 ,当前分支前面会标星号
1
git checkout master# 切换为master 分支

把dev分支合并到Master上

1
git merge dev

git merge命令用于合并指定分支到当前分支。

删除分支

1
git branch -d dev

多人协作

查看远程库信息,使用git remote -v

推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上

1
git push origin master

如果要推送其他分支,比如dev,就改成:

1
$ git push origin dev

多人协作时,大家都往Master和dev分支上推送自己的修改,

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

(origin 指远程版本库)