最近工作中用到了git,但是之前真的只是听到过,但是没有实际的用过。在百度了很多资料后。参照廖雪峰官方网站的Git教程,结合我实际用到的一些东西,整理了一些新手的使用指南。
在这里首先你要知道到git是开源的版本控制系统,可以帮我们管理我们的项目。我们先来理解一下这个版本控制系统的概念。
一、什么是版本控制系统
将我们的项目比作一个超长的文档,每一个开发人员负责其中的一个章节,或者说两个开发人员负责同一个章节。写的时候每个人肯定要分开写的,那怎么放到一起呢?一份份的复制粘贴?粘贴后其中一个人改了呢?要再重新的复制粘贴,然后再发给每个人吗?那我要是想删除一部分呢?或者说某个章节我想还原成以前的版本呢?难道我们都要不停的查找和复制粘贴,然后还要去通知每一个参与其中的人重新拷贝一份?那拷贝之前别人做的改动呢?
可以看到这是非常麻烦的一个事情,那现在有了一个叫git的东西,可以记录每一个人的更改,还可以管理每一个人写出来的东西,帮你去整合到一起,不需要我们不停的拷贝才能达到每个人看到的都是最新的完成的东西。想回去看某一次的改动,只要到软件里去产看一下更改的记录就可以了。
二、版本控制系统的门派
版本控制系统不只有git这一个,还有CVS和SVN等,那么为什么现在越来越多的人愿意用git呢?这是因为git与他们不是一个门派的。git是分布式的版本管理系统,而CVS和SVN是集中式管理系统。
2.1 集中式版本控制系统
集中式的版本控制系统需要一个中央服务器,版本库集中存放在这个服务器上,而我们工作的时候都是在自己的电脑上,所以我们开始干活之前要再服务器上获取最新的版本才能开始工作,工作完,再把自己做的东西传到服务器上。
但是这么做,会有很大的缺点和局限性。首先,是工作起来额硬性条件要求--网络,因为要和服务器进行交互,所以必须要在联网的状态下才能工作。但是这就对你的网速要求很高了,如果网速慢或者传送文件太大,那么就需要很长的时间做这些上传和下载的功能。其次,由于是集中式管理,那么每个人的电脑上的代码肯定不是大家都更新过的,最多是你从服务器上获取的代码库,和你自己最新的改动,那么一旦中央的控制器出了问题,所有人都没办法工作了,无法获取到新的版本库,也无法提交工作的内容。
2.2 分布式版本控制系统
分布式版本控制系统不需要中央服务器,代码库就在每个参与人员的电脑上,这一点就解决了集中式版本控制系统的两大重要问题。第一个是联网问题,代码库就在自己的电脑上所以我们不需要联网去获取代码库,联网提交工作内容。再有就是,既然代码库就在自己的电脑上,那么即使一台电脑出了问题,也不会影响其他人的工作。
那么分布式管理系统怎么来完成多个人员的协作的呢?比如电脑A和电脑B同时对一个文件进行了改动,这是只要将各自改动的部分推送给对方就可以了。
这里提一下:理论上是两台电脑之间相互推送修改就可以,但是在我们的实际工作中,由于两个人可能处在不同的网络环境,无法相互访问,或者其中一台电脑没有开机工作,所以在实际的工作中,我们一般会有一台充当‘中央服务器’的电脑,这个电脑知识方便大家交换修改的成果,没有这台电脑也没有关系的。
三、 git 实际使用
3.1 git项目创建
在进行git的学习操作之前,我们需要自己创建一个git项目。不要在你的电脑上直接执行,尤其是你的电脑上有公司的项目的时候。这里简单教大家弄一个git的项目地址出来,就是我们的版本库。
首先你需要注册一个gitHub账号,注册登录之后进到这个页面。牢记你的用户名和密码
选择Start a project 按钮,输入你的项目名称,记住不要写中文,不要犯常识错误。
创建成功后,按下复制按钮。就可以复制项目地址了。
其实我们在这里是相当于搭建了一个git服务器,在后面会为大家详细的讲解。因为我个人觉得这样更有助于大家快速上手。
3.2 git安装。
请大家自行百度。根据电脑的系统来。
3.3 实际使用
上面的章节中我们已经说了怎么去创建一个实际的git项目环境。
现在打开我们的命令行工具,进到一个文件夹(你想在你的本地放置文件库 的地方)
执行第一个git命令
1)git init 再文件夹里创建git版本库
2)克隆项目git clone url (这个url就是拷贝的项目地址)
执行完成你会发现你的文件夹下多了一个文件夹,名字就是你的git项目名称。(这里先不用管里面的说项目是空的)
执行cd 文件名 进入克隆下来的文件目录
2)添加文件 git add fileName
现在在你克隆下来的项目文件里新建一个index.html 文件
然后执行 git add index.html 现在我们已经将文件添加到仓库里,但是注意现在只是将这个文件添加到一个叫暂存区的地方。
3)提交 git commit -m '注释'
这里引号里的内容是对你提交文件的注释,方便我们以后查找。这一步是将我们的文件提交到了仓库(版本库,后面还会讲解)。
4)上传到服务器 git push
将我们前面两部步提交到版本库的修改上传到远端服务器,就是我们的gitHub创建的项目地址。这时候看下我们gitHub项目。
在这里我们还要说的一点是,在add的时候我们可以同时添加很多文件之后再执行commit命令
git add file1 file2
3.4 git add 的实用用法
在实际的项目总,我们可能会对多个文件进行改动,或者是新建了文件等,我们想提交修改,要怎么做呢?
这时候有人说,git add 然后写一大串的文件名不就行了,但是这么做一个是浪费时间,还有就是我们很可能会少些、拼错文件名,造成不必要的麻烦,那么这个时候,git 为我们提供了一些方便快捷的方法。
git add -A // 添加所有改动
git add * // 添加新建文件和修改,但是不包括删除
git add . // 添加新建文件和修改,但是不包括删除
git add -u // 添加修改和删除,但是不包括新建文件
3.5 git status 和 git diff
我们提交过一个文件之后很可能胡对其进行修改,现在我们在index.html文件里再输入一些新的东西。
现在有一个命令可以让我们随时掌握我们当前仓库的状态,例如:文件是否被改动过,有没有准备提交的文件,就是 git status
最后一行提示我们没有准备提交的的文件,需要我们执行git add 。
还有一种情况是,我们很久没有改动文件了,不知道上次做了什么修改,这个时候我们有一个可以查看上一次文件改动的命令 git diff 查看的文件名就是different(不同)的意思。
3.6 版本回退
这里的版本回退是指,我们很可能误操作了一些我们不想做的操作,或者改动提交之后,产品跑过来告诉你还是之前的样子更好,虽然这个时候我们很像揍他,但是怎么办呢?难道要回想之前的代码,删掉现在的重新写?在git中我们不必这么做,记得我们的commit命令吗?这个命令帮我们记住了我们么每一次的修改,我们可以通过这个命令恢复最近的一个commit恢复。这就是版本回退,下面来看下版本回退是怎么实现的把。
3.6.1 查看日志 git log
这个命令可以显示我们从最近一次到最早一次的提交日志
这里显示了我们从一开始到现在执行的所有提交命令,就是commit的时候进行的记录,这时候知道注释是多重要的事情了吧。(提示,退出这个操作按q就可以了)
可以将每一个改动显示到一行,给git log 后面加上--pretty=oneline就可以了
3.6.2 git reset
现在我么来学习怎么回到之前的版本:
1)先知道我们当前是哪个版本 ,用 HEAD 表示。
2)回到上一个版本是HEAD^,上上个是HEAD^^,以此类推,但是太多个我们不能准确计数,可以简写成HEAD~100
3)执行版本回退 git reset --hard HEAD^
文件就可以回到上一步的状态。注意:这里只是你本地的状态改变了。版本库里的状态改变了。如果push了这个操作是不可以达到目的的。
那么现在问题来了,我后悔了怎么办?产品又告诉你,还是后来的好,呵呵,现在是不是头疼。
不要担心,我们的git是很仁义的。
我们每一次的commit 都是有一个id的 ,就是git log 里面每个commit后面显示的一串字符
现在找到这个id 有两种情况
第一:命令行一直没关那我可以直接找到那一步的id 78705e8
第二:我关掉了命令行窗口,甚至关掉了电脑。这时候有一个命令
git reflog 记录每一次的命令
这时候最前面的一列就是id,找到对应的id ,可以看到这里显示的id没有那么长,这样就够用了,不用写完整的id,当然也不能只写1或2个字。只要能够表示到这个唯一的id就好。
现在有了id我们就可以找回我们想要的版本了。
四、git工作机制
4.1工作区和暂存区
前面说git add的时候,稍微提了下暂存区,但是没有细说。这一节我们来说说这个概念。首先要告诉你的是暂存区也是GIT相比较其他的版本控制系统(如svn)的不同的概念。
4.1.1 工作区
我们说的工作区,就是我们自己电脑里可以看到的目录。
4.1.2 暂存区
其实在这个工作区里面有一个隐藏的目录.git,之前已经教过大家怎么看了。这个东西并不是我们的工作区,这是GIT的版本库。
在GIT的版本库里为我们存了很多的东西。其中最重要的就是这个暂存区(stage)。还有git为我们自动创建的一个分支master,以及指向master的一个指针叫HEAD。
之前我们将文件往git的版本库里添加的时候,分了两部:
第一步:git add 把文件添加进去,之前说过这时候是放在了这个暂存区里,还没有真的放在版本库中。
第二部:git commit 提叫更改,这时候就把暂存区的内容提交到了当前的分支。
在创建Git的版本库时,Git自动为我们创建了唯一一个master分支,所以我们执行commit命令的时候就是提交到了master就是提交到了这个分支上。
4.2 管理修改
这里的管理修改是什么意思呢?是指git的又一个比其他版本控制系统优秀的地方,git跟踪并管理的是修改,而不是整个文件。
接下来我们来解释这一点。
我们先来对我们的READMEA做一个修改,向里面添加一行内容,然后执行git add *,然后我们再修改一下我们的README文件,现在直接提交 git commit -m ‘change’。这时候我们通过git status看下状态
你会发现我么第二次的修改没有被提交上,这是为什么呢?
我们来看一下我么 的操作流程:修改1 =》git add =》修改2 =》git commit
现在记住,git管理的是修改,使用git add命令是将修改1的修添加到了暂存区,而不是将整个文件添加进去,当我们第二次修改的时候,我们没放在暂存区,所以提交的时候只提交了第一次的修改。
不信的话我们来看下工作区和版本库里最新版本的区别: git diff HEAD -- README
想提交第二次的修改可以使用再次的git add
4.3 撤销修改 git checkout -- 和 git reset HEAD file
现在我们原来有一个index.html文件,但是现在我们不需要了就把他删除了,我们git status一下
提示我们有一个文件被删除了,可是我们后悔了,
git 提示我们git checkout -- file可以丢弃工作区的修改
现在我们执行下 git checkout -- index.html,执行完成后你会发现你的工作区中index.html文件又回来了
但是注意,当我们把删除提交到git add 暂存区,还没commit得时候这种方法就不行了,要把暂存区的修改撤销掉 git reset HEAD file 放回工作区。之后再撤销工作区的修改
撤销修改总结:
1)只改了工作区的文件或文件内容的时候,想丢弃工作区的修改,直接git checkout -- file
2)改了工作区的文件或文件内容,并且添加到了暂存区,想丢弃修改需要两步,
第一步:git reset HEAD file 撤销暂存区修改,回到上一情况
第二部:撤销工作区修改
3)已经提交到了版本库,commit 就要使用 git reset --hard HEAD^或者git reset --hard id
这些都是没有推送到远程库(没有执行git push)才可以。
4.4 删除文件
如果我们真的想在版本库中删除一个文件,在工作区中删除后,要先执行 git rm file 然后再git commit
五、分支管理
我们知道在实际的开发过程中,我们肯定是很多人同时开发,如果每个人都在同一条分支上,当你的工作刚刚完成了50%,上传到远程服务器可能会导致项目无法运行,妨碍其他人的开发。不上传又担心会丢失项目文件,这个时候git为我们提供了一个很好的功能,就是分支管理。为每个人创建不同的分支,大加在开发过程中切换到不同的分支,将自己的工作提交到不同的分支上,最后当工作完成时,再将分支合并。
5、1 创建合并分支
所有的分支的最终指向都是咱们之前提到过的master。现在我们实际运行一下吧。
1、创建分支并切换到分支:git checkout -b 分支名称。这里相当于是创建分支: git branch 分支名称 和切换分支:git checkout 分支名称
例如:现在我要创建一个名为dev的分支执行 git checkout -b dev 命令,就可以为我们创建这个分支并切换到这个分支中。
2、查看当前分支 git branch。这条命令会为你展示出所有的分支,你所处的当前分支,前面会有*标识。分支创建切换完成后,我们提交和推送到远端服务器的代码和之前的一样。直接运行git branch就可以,不需要加任何路径。
3、合并分支 git merge 分支名称。要合并分支首先要切换回master分支 git checkout master,然后在master分支上合并你所做的分支工作,git merge dev。
4、删除分支 git branch -d 分支名称。合并完成后,我们可以放心大胆的删除dev分支,git branch -d dev。
5、2 解决冲突
首先我们先通过一个例子来理解一下什么是冲突,再来说怎么解决。
1)我们准备一个分支 dev,并且换到我们的新分支上 ,git checkout -b dev
2)现在我们将index.html文件的内容区最后一行加上<div>A and B </div>
3)然后在分支上提交 git add * ==> git commit -m 'dev commit'
4) 切换回主分支master ,git checkout master
5)现在将index.html内容区最后一行加上 <div>A & B </div>
6)提交 git add * ==> git commit -m 'master commit'
7)现在我们来合并分支 git merge dev
这时候我们发现我们无法合并分支,冲突了.
我们可以直接查看我们的index.html文档,这时候就可以看到冲突的代码了。
现在我们已经看到了冲突,知道了冲突是如何造成的,那么现在我们就来解决这个问题。
在这里为你标记出来了分支的不同,这时候直接冲突的地方改成一致的就可以了。上图中的代码直接改为 <div>A and B </div> ,然后再次git add * ==> git commit -m 'master commit' ,这时候再合并分支就没有问题了。
上面说的是一个文件又冲突的时候我们可以直接找到文件修改,那么文件很多,改动的文件也多,不知道哪个冲突了怎么办呢?
当发生冲突的时候使用 git status 就可以告诉我我们冲突的文件啦!这时候我们根据提示去找文件就可以看到冲突的地方并进行修改了
六、在分支上解决bug
我们都知道,在开发的过程中是经常会有,我么通常会在git的分支上解决bug,创建一个临时的分支,解决完bug合并分支,然后删除分支。如果说你正在开发其他的东西,还没有开发完不能提交,这时候我们可以将开发分支工作先存储起来。修改完在回来开发。但是这些说的都是有没有提交的修改,如果提交了直接切换分支工作就可以。
1)保存当前分支的工作 git stash
2)回到master分支,创建修复bug的分支。
3)修复完成,合并修复bug分支,删除修复bug的分支
4)切换到工作分支,调出工作区 git stash apply ,删除存储 git stash drop。可以合并为1条命令git stash pop 。
有多次存储,然后会恢复指定工作区的方法,就是存储后查看存储区的工作列表git stash list,然后恢复指定的存储 git stash apply stash@{0},不建议这么做。
强行删除没有合并的分支: git branch -D 分支名称
七、.gitignore
在实际工作的时候,有些文件可能不需要上传,比如我们的一些配置文件,或者有些文件是不允许别人进行改动的,就是说其他人改动了也不会被提交上。这时候git提供了一个特殊的.gitignore文件,我们可以叫他为配置忽略文件,就是将你需要被忽略的文件名添加进去。
作为一个新手,看到到这里,应该就可以应对工作上的问题了。想深入了解git的话,推荐看廖雪峰的git教程。https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
网友评论