Git
Git
基础原理
Git 是一个分布式版本管理系统,可以在任何时间点,把文档的状态作为更新记录保存起来,因此可以把编辑过的文档复原到以前状态,也可以显示编辑前后的内容差异.
版本库(Repository)是记录文件或目录状态的地方,存储着内容修改的历史记录,在版本库的管理下,把文件和目录修改的历史记录放在对应的目录下.
远程版本库和本地版本库
git分远程版本库和本地版本库,远程版本库配有专门的服务器,为了多人共享而建立的数据库,本地版本库是为了方便用户个人使用,在自己机器上配置的版本库.
两种创建版本库方法:
- 创建全新的版本库
- 复制远程版本库
提交
若要把文件或目录的添加和变更保存到版本库,就需要进行提交
执行提交后,版本库中就会生成上次提交的状态与当前状态的差异记录 (也称为revision)
如果,提交是按时间顺序保存到版本库中的,凭借该提交和最新的文件状态,就可以直到过去的修改记录以及内容.
系统会给出一个40位的名字来指定这次提交,这样就可以在数据库中找到对应的提交
不同类别的修改 (如:Bug修复和功能添加) 要尽量分开提交,以方便以后从历史记录里查找特定的修改内容。
工作区和暂存区
git管理下,实际操作的目录被成为工作区.
在版本库和工作区之间有暂存区,索引是为了向版本库提交作准备的区域
Git在执行提交的时候,不是直接将工作树的状态保存到数据库,而是将设置在中间索引区域的状态保存到数据库。因此,要提交文件,首先需要把文件加入到索引区域中。
使用基础
安装后,输入用户名和电邮,这些信息将作为提交者信息显示在更新历史中.
1 | git config --global user.name "brett427" |
新建数据库
首先在任意一个地方创建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 | git reset --hard HEAD^ |
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD改变了指向
1 | git reflog 记录每一次命令!!!!!! |
当不知道reset号的时候,可以用reflog去找
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
1 | git diff #是工作区(work dict)和暂存区(stage)的比较 |
丢弃修改
丢弃工作区的修改
1 | git checkout --<filename> # 丢弃工作区的修改 |
就是让这个文件回到最近一次git commit
或git add
时的状态。
丢弃暂存区的修改
1 | git reset HEAD <filename> |
使用git reset HEAD <filename>
,就回到了上面选择丢弃工作区的修改的状态.
删除文件
1 | git rm 并且 git commit |
分支管理
概念
在版本回退中,每次提交,git都会把他们串成一条时间线,上面所有的操作,只有一条时间线,也就是主分支,即master分支,HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,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 | git checkout -b 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分支上推送自己的修改,
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin branch-name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
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 指远程版本库)