一:Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
工作原理 / 流程:

图片描述


Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

二,前置准备操作

1,安装git , 用git bash 打开

2,Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识

git config --global user.name "用户名"

git config --global user.email "邮箱"

注意:git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

3,正式操作

  1. 创建git管理的目录文件(版本库)
  2.  通过命令 git init 把这个目录变成git可以管理的仓库
  3. .git目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了

  三,正式操作

1,如何提交文件到本地仓库,查看文件修改的地方

下面先看下demo如下演示:

我在版本库testgit目录下新建一个记事本文件 readme.txt 内容如下:11111111

第一步:使用命令

git add test.txt

添加到暂存区里面去。如下:图片描述

如果和上面一样,没有任何提示,说明已经添加成功了。

第二步:

git commit -m "提交的信息注释"

用命令 git commit告诉Git,把文件提交到仓库。

图片描述

git status #查看文件是否有修改,是否需要再次提交。本质就是和上次的版本相比较修改的地方


现在我们已经提交了一个readme.txt文件了,我们下面可以通过命令git status来查看是否还有文件未提交,如下:

图片描述


说明没有任何文件未提交,但是我现在继续来改下readme.txt内容,比如我在下面添加一行2222222222内容,继续使用git status来查看下结果,如下:

图片描述


上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。

git diff 文件名

查看文件修改的地方

接下来我想看下readme.txt文件到底改了什么内容,如何查看呢?可以使用如下命令:

git diff readme.txt 如下:

图片描述


如上可以看到,readme.txt文件内容从一行11111111改成 二行 添加了一行22222222内容。

知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步(第一步是git add 第二步是:git commit)。

如下:

图片描述

2,版本的回退操作

查看提交的日志,获取对应的提交记录的版本号
git log 
git log --pretty=online

回退到某个版本
git reset hard HADE^ (回退到上个版本)
git reset hard HADE^^ (回退当上上个版本)
git reset hard HADE~n (回退到第n 个版本)
git reset hard 版本号 (回退到指定的版本号)

查看所有的版本,包括对应的回退的版本号
git reflog 

如上,我们已经学会了修改文件,现在我继续对readme.txt文件进行修改,再增加一行

内容为33333333333333.继续执行命令如下:

图片描述


现在我已经对readme.txt文件做了三次修改了,那么我现在想查看下历史记录,如何查呢?我们现在可以使用命令 git log 演示如下所示:

图片描述


git log命令显示从最近到最远的显示日志,我们可以看到最近三次提交,最近的一次是,增加内容为333333.上一次是添加内容222222,第一次默认是 111111.如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline 演示如下:

图片描述


现在我想使用版本回退操作,我想把当前的版本回退到上一个版本,要使用什么命令呢?可以使用如下2种命令,第一种是:git reset --hard HEAD^ 那么如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。那如果要回退到前100个版本的话,使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:git reset --hard HEAD~100 即可。未回退之前的readme.txt内容如下:

图片描述


如果想回退到上一个版本的命令如下操作:

图片描述

再来查看下 readme.txt内容如下:通过命令cat readme.txt查看

图片描述

可以看到,内容已经回退到上一个版本了。我们可以继续使用git log 来查看下历史记录信息,如下:

图片描述

我们看到 增加333333 内容我们没有看到了,但是现在我想回退到最新的版本,如:有333333的内容要如何恢复呢?我们可以通过版本号回退,使用命令方法如下:

git reset --hard 版本号 ,但是现在的问题假如我已经关掉过一次命令行或者333内容的版本号我并不知道呢?要如何知道增加3333内容的版本号呢?可以通过如下命令即可获取到版本号:git reflog 演示如下:

图片描述

通过上面的显示我们可以知道,增加内容3333的版本号是 6fcfc89.我们现在可以命令

git reset --hard 6fcfc89来恢复了。演示如下:

图片描述

可以看到 目前已经是最新的版本了。

3,工作区和暂存区的区别

理解工作区与暂存区的区别?
工作区:就是你在电脑上看到的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。

我们前面说过使用Git提交文件到版本库有两步:

第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。

第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。

我们继续使用demo来演示下:

我们在readme.txt再添加一行内容为4444444,接着在目录下新建一个文件为test.txt 内容为test,我们先用命令 git status来查看下状态,如下:

图片描述

现在我们先使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态,如下:

图片描述

接着我们可以使用git commit一次性提交到分支上,如下:

图片描述

4,撤销修改或删除

注意:这里撤销的内容是指对应的工作区的内容,未被提交到仓库的内容。

git checkout 文件

命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:

1.readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
2.另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
对于第二种情况,我想我们继续做demo来看下,假如现在我对readme.txt添加一行 内容为6666666666666,我git add 增加到暂存区后,接着添加内容7777777,我想通过撤销命令让其回到暂存区后的状态。如下所示:

图片描述

注意:命令git checkout -- readme.txt 中的 -- 很重要,如果没有 -- 的话,那么命令变成创建分支了。

二:删除文件。
假如我现在版本库testgit目录添加一个文件b.txt,然后提交。如下:

图片描述

如上:一般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:rm b.txt ,如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交掉,现在目录是这样的,

图片描述

只要没有commit之前,如果我想在版本库中恢复此文件如何操作呢?

可以使用如下命令 git checkout -- b.txt,如下所示:

图片描述

再来看看我们testgit目录,添加了3个文件了。如下所示:

图片描述

 参考:http://t.csdn.cn/dFQJe


 参考GIT官网:GIT-BOOK

  • GIT分支 

 git同其他的版本的控制工具比较,git保存的是数据快照的方式,轻量级。

数据快照文件的格式:commit对象 -->tree对象---->文件快照

commit对象中还包含有提交者的信息,和上次提交的指针(父对象) 

 

  •  创建分支

创建分支的本质就是创建了一个指针,指向上面的最后一次的提交对象上。

mater分支和其他的分支没有什么区别,就是仓库的默认名称。

HEAD:用来标识当前所在的分支是哪一个

 这里注意:创建分支之后要切换到对应的分支;

仓库数据相当于由提交对象链表;分支名用来标识一个链表的位置,HEAD标识你所在的分支名(分支名有点像变量名)

先在testing分支上修改,创建一个新的提交记录;

HEAD又指向之前的master所在的提交对象上,同时恢复HEAD所指向的快照内容;

分支切换之前,最好将工作空间和暂存区的修改提交,没提交,切换分支的时候有冲突,阻止切换。 

  •  GIT分支-新建与合并
// 创建一个新分支
git branch 分支名
// 切换到该分支
git checkout 分支名   

// 创建并切换
git checkout -b 分支名

 总结的开发流程:

最好不要直接在master上开发,对应的需求新建一个分支,开发完后,提交代码,切换对应的master合并代码;

合并的两种情况:

fast word

  • 分支管理 - 本地
//查看对应的分支情况  当前所在的分支之前会有*
git branch 

//可以查看每个分支最后一次的提交的情况
git branch -v 

// 查看已经合并的分支
git branch --merged

// 查看没有合并的分支
git branch --no-merged

// 删除分支
git branch -d 分支名

// 删除没有合并的分支会出错
  •  分支管理 - 远程分支

远程分支,相当于远程仓库的一个标签;

有其他人推送代码到远程仓库的该分支上,远程仓库的分支标签会移动;

同时本地也会有一个标签上次拉取远程分支是该分支处于的提交记录在哪里;

本地检测到远程的分支标签移动后,本地可以git fetch remote ,本地的标识远程分支的标签会移动,同时拉取最近的代码;

执行

git push remote branch   将本地的该分支的内容推送到远端 

注意:如果远端没有本地的这个分支名称,会在远端创建一个该分支;

命令的含义:将本地的该分支推送到远端的这个分支上,如果远端没有这个分支,会新建一个分支。 

简单的拉取远程仓库,仅仅将非master的分支,生成一个不可修改的分支;

执行

git fetch origin

git merge origin/其他非master分支

git checkout -b 本地的分支名 origin/想跟踪的分支 

跟踪分支:建立本地分支和远程分支一一对应的关联,git 可以自动去识别去哪里pull,push到那个分支;跟踪分支本质就是,切换到一个分支名,

git clone 默认跟踪的就是 origin/master分支

// 仅仅一个参数,如果远程有一个相同的分支,表示跟踪该分支
// 远程没有分支,提交push本地代码可能会将本地的分支提交到远程
git checkout otherBranch 

// 跟踪远程已经存在的分支
git checkout -b 本地分支 origin/远程分支

// 修改当前分支跟踪的分支
git branch -u origin/新跟踪的分支名称

上游分支:就是被跟踪的分支 

@{upstream} 或 @{u} 来引用上游分支

 查看所有跟踪的分支的详细数据:

 ahead 表示有几次没有提交

behind 表示有几次没有拉取

// 删除远程分支
git push origin --delete 分支名称

注意:上面的统计的数据,是根据你最近一次从服务器拉取的情况来看的;

 如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。 可以像这样做:

// 先拉取最新的所有的数据
git fetch all; git branch -vv

注意:git fetch命令仅仅是拉取数据,并不会合并数据;git merge会将最新的数据合并到当前所在的分支;这些命令没有添加分支名称,默认都是在当前分支上操作;

git pull 是上面两个命令的组合命令;但是前提是跟踪了服务器的某个分支;

  • git分支-变基

变基和pull的区别:使用rebase是git的log看起来没有很乱

相同之处:都可以将不同分支的修改进行合并

注意:变基仅仅适用一个人的开发的场景,多人合作开发的模式,执行变基操作会将主仓的提交变得奇怪,不推荐使用:

比如; 将已经提交的修改进行变基操作,但是另一个人又将变基之前的操作pull,他再次提交时,会将你变基的操作再次提交上去形成矛盾,所以不推荐;

// 切换到你想要保留的分支的修改的内容,类似于该分支的补丁
git checkout 目标分支  

// 将保留的补丁,追加到这个基本分支上
git rebase 基本分支(通常是主分支)

// 切回到基本分支,执行对应的merge操作
git checkout 基本分支

git merge 目标分支(就是对应的被打补丁的分支)

除了基本的变基操作:还可以进阶

// 将两个分支的不同的修改之处,记录成一个补丁,rebase到第三个分支上
git checkout client 

// Git 取出 client 分支,找出它从 server 分支分歧之后的补丁, 然后把这些补丁在 master 分支上重放一遍,让 client 看起来像直接基于 master 修改一样
git rebase --onto master server client

git checkout master

git merge client

  • GIT-分布式的工作流程

1,集中式开发流程:

所有的开发者可以直接clone,push和pull对应的代码;

缺点:可能会有错误的代码被提交到中心仓库

优点:不会有开发者的代码被其他开发者覆盖

2,集成管理者模式

再上种模式的基础上添加了权限;

优点:更加安全

缺点:开发流程比较复杂

 

3,提交准则:

git diff --check  // 检查空白提交

每个任务最好对应一次提交

 提交之前,先pull一下代码,否则可能无法push


 

  • 多次输入git命令的时候要输入用户名+密码:

输入下面命令:表示存储用户名和密码

git config --global credential.helper store
  • git log 查看日志文件要退出

按 q

  • 注意origin和master的区别

origin/master   远程仓库别名/分支名 

origin :是git clone时取的默认的名称;

master:git init 默认为本地取的分支名称

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐