git学习笔记(一):初识

楼主以前一直使用的是SVN,没接触过git,但最近项目有用到,还是整理下吧~

1、什么是git?

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。

比较常见的版本管理工具比如SVN,比较不同的是SVN属于集中式的版本控制系统,而git则属于分布式版本控制系统。集中式版本控制系统必须联网才能工作,即必须连接上“中央服务器”,每个人开发的版本的提交到这台“中央服务器”;而分布式版本控制系统则不是,每个节点有自己的本地仓库。

简单来说,git和SVN的区别如下:

这两个工具主要的区别在于历史版本维护的位置:

Git本地仓库包含代码库还有历史库,在本地的环境开发就可以记录历史

而SVN的历史库存在于中央仓库,每次对比与提交代码都必须连接到中央仓库才能进行

这样的好处在于:

1)、自己可以在脱机环境查看开发的版本历史

2)、多人开发时如果充当中央仓库的Git仓库挂了,任何一个开发者的仓库都可以作为中央仓库进行服务

(不过开发者仓库一般不直接充当中央库,但你可以随时创建一个新的中央库然后同步就立刻恢复了中央库)

git的“中央仓库”跟每个人的仓库是一摸一样的,仅仅用于方便交换修改。

2、安装git

安装完毕以后,在桌面右键Git Bash就可以进入git的操作界面,是Linux风格的。

我们需要做以下初始化的工作。也可以叫做“自报家门”:

git config --global  user.name "your name" 告诉git你的用户名

git config --global  user.email "your email" 告诉git你的邮箱

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

3、git中的几个重要概念



 (PS:图是盗的)

工作目录:即存放本地代码的目录,比如eclipse的workspace,就是我们执行git命令所在的目录;

暂存区:可以理解成一个"提交任务".Git暂存区是Git最成功的设计之一,暂存区是一个介于工作区和版本库的中间状态.当执行提交的时候,实际上是将暂存区的内容提交到版本库中.

本地仓库:我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。这个仓库是存在在每个开发人员的本地的;

远程仓库:这个很好理解,位于“中央服务器”,是我们做好工作后最终推送版本的仓库。

4、创建版本库(repository)

1)创建一个git的版本库目录,如在F盘新建一个HelloGit的目录;

2)在该目录下,运行:git init 会生成一个.git的隐藏目录



 该隐藏目录就类似SVN中的.svn目录。此后该目录下所有的文件都能被git管理,我们用的所有命令也都是在这个目录下了~

3)测试:在该目录下建一个文本文件,如README.txt

4)把新建的文件纳入版本库管理:git add README.txt

5)尝试提交README.txt并加注释:git commit -m "你自己的注释内容"——提交到本地仓库

注:git add可以运行多次加多个文件,(也可以用git add .),然后再一次性git commit

5、文件的增、改、删和git status的紧密关系

说白了,我们用版本控制系统无非是针对文件的“增、改、删”来打转!而且对于git而言,这些视作“修改”,git管理的是修改。

这个命令绝对是git中最实用,使用最频繁的命令。运用它我们可以查看目前的版本状态。下面我们从文件操作的角度来查看不同时刻运行改命令的效果,可以代入我们平常对代码的操作来理解~

1)增:新建了一个文件以后,用git status命令,可以看到如下显示结果:



 注意输出是"Untracked files",顾名思义是“未被跟踪的文件”,而且文件名是“红色”的。根据上面讲到的“暂存区”概念,我们再用命令git add hello.txt 把这个"Untracked file"加入到暂存区,再用git status来查看:



 此时文件名变成绿色的,接下来我们再从暂存区中提交它:git commit -m "注释内容" hello.txt,注意此时提交的是由暂存区->本地仓库,还没到远程仓库。

再运行git status命令,可以看到:



 可以看到“nothing to commit, working directory clean”的提示,这表明已经提交成功了。

小结下以上在本地库新建一个文件到提交到本地仓库的流程:工作目录new一个文件->add到暂存区->commit到本地仓库。

2)改:修改一个文件

我们不妨对hello.txt文件进行修改,然后用git status命令查看状态:modified:  hello.txt(注意此时文件被标上红色了):



这里再插播一个命令:git diff——用于查看文件在工作区 和暂存区的具体区别:



 

把修改后的文件加入到暂存区后,运行git status可以看到:



 同时,用git diff可以看到工作区和暂存区没什么差了。。

但是,再插播一个命令:git diff --cached——用于查看暂存区和本地仓库的区别,运行该命令,可以看到:



 然后我们再commit,再用git status和git diff、git diff --cached看看:



 可见修改已被提交到本地仓库中,暂存区和本地仓库当中也没差了。

3)删:删除一个文件

删除本地一个文件以后,我们同样走工作区->add到暂存区->commit的流程:



 用git status可以看到被删除文件的不同时刻的状态。

(关于删除的恢复等会在后面的部分讲到~)

小结:本部分从三种常见的操作来认识git status命令的强大作用。以及涉及到了git diff和git diff --cached命令,如下:

用git commmit -m "注释内容"将暂存区的文件提交到当前分支~,再用git status来查看。此时暂存区就没有文件了。

git diff    #是工作区(work dict)和暂存区(stage)的比较,在修改后未git add操作时,这个会有内容,而git diff --cached没内容

git diff --cached    #是暂存区(stage)和分支(master)的比较,

git diff HEAD 文件名 #是工作区和版本库(本地仓库)中的比较。

在修改并git add后,git diff没内容但是,git diff --cached会有内容~~~,只有当git add ->git commit操作之后,git diff --cached才没内容!

6、版本回退

写代码的时候,你常常会提交后发现是一个失误,或者说误删等等操作。这就需要回到“上一个版本”,本部分就是为了探讨版本的回退问题。

首先,我们肯定会对一个文件进行多次修改提交,如何看到自己提交的历史呢?这就需要我们用到git log或git log --pretty=oneline(简化模式)来看,如:



 注意到每个commit后面会跟一个字符串,这个字符串就是用来标识该次提交的,可以理解为commit id。commit id是版本回退的依据和核心。

在git中,我们用HEAD来表示当前版本,HEAD^表示上一个版本,HEAD^^则表示上上一个版本(当然不能无限延伸下去,最主要还是靠commit id啦~)

1)想要回到上一个版本:git reset  --hard HEAD^

2)想要回到之前某一个版本:git reset --hard 311dd6b9(只需commit id的前几位);

3)假如后悔回退了版本,想要回到“未来”:git reflog 查看之前所有的历史提交,再用命令git reset commitid

注:版本的回退都是针对“提交而言”,所以要注意以下场景:

修改了2个文件,但只提交了一个其中1个文件,另1个并没有提交,那么用git reset  --hard HEAD^后,2个文件都会回到之前的状态,虽说另一个文件并没有被提交!简言之,reset是回到指定的提交状态,此次不管文件的修改提交与否,都会回到“上一次”(或者说指定某一次)时的提交状态!听起来超无辜的,因为那些修改后没被提交的文件的修改也作废了。

说到这,不得不再次注意,commit是把“暂存区”的文件提交到“本地仓库”!假如你对一个文件修改了2次,但只有其中一次被add了,如:第一次修改 -> git add -> 第二次修改 -> git commit

用git diff HEAD 文件名可以看到第二次修改并没有被提交到版本库当中。

 

 只需记住:git commit永远是针对“上一次”的add对象而言的,so,我们可以这样:

第一次修改 -> git add -> 第二次修改 -> git add ->git commit 或是

第一次修改 ->  第二次修改 -> git add . ->git commit  (加.表示所有被修改的文件!)

7、修改撤销

前面有说,git管理的是“修改”——增、删、改

1)修改的撤销

我们常常会有这些情形:

情景一:修改了一个本地文件,还没来得及add到缓存区,但是想撤销,这好办啊:这样可以直接手动恢复到修改保存之前的状态或使用:git checkout -- filename

情景二:修改了也add到暂存区了,不用担心你还没提交到版本库呢!第一步:用git reset HEAD filename即可把提交到暂存区的修改“撤销”,然后再用情景一的处理办法处理;

情景三:加入到暂存区并提交到版本库了,没关系,参考版本回退部分即可~

2)增加的撤销

这种情况比较少见,不过也不是没有,针对已经添加到版本库里面的文件,用git rm filename即可把版本库中的改文件删掉,此时工作区的文件也会被删除,这个过程是不可逆的。

3)删除的撤销

针对误删而言,因为此时本地中被删除了,但是版本库(或暂存区)还帮我们保存着,用git checkout -- filename即可恢复误删的文件~



 

8、工作区和暂存区?

形象理解:货架就像工作区,暂存区就像购物车,(没到付款的时候你都不确定购物车里的东西全部都是要的,每拿一件商品就付一次款,那才麻烦大了)。而本地仓库就像收银台!将心仪商品放入购物车相当于add,结账的过程相当于commit!

工作区:能看到的工作目录,如自己创建的learngit目录被git init命令执行过的。

版本库:工作区里面的隐藏目录.git,就像SVN的隐藏目录.svn一样

暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

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

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

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

============================常用命令========================================

 git clone git@<ip>:<project_name>  从ip上克隆项目到本地库

git checkout 分支号 选择某个分支号,并基于它来操作  --克隆完以后再切换分支,才能被import到开发工具当中

git branch 查看当前分支

git branch -al 查所有分支

git pull origin 分支号 从某个分支号,先 git fetch 远端的 branch,然后与本地的 branch 做 merge

git status 查看状态

git add. 查看所有被修改或删除文件的信息添加到索引库(暂存区),做快照

git commit -m "注释"   提交并添加注释(可以指定想要提交的某个文件,没指定的话代表需要提交所有暂存区里面的文件)

git push origin 分支号 提交到远程仓库

猜你喜欢

转载自raising.iteye.com/blog/2331960