楼主以前一直使用的是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中的几个重要概念
工作目录:即存放本地代码的目录,比如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 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 分支号 提交到远程仓库