之前老早就听说过git,但是一直就没怎么去了解,之前在公司里头都是用的svn版本控制工具,然后上个月换到了新公司之后,团队里使用的是git工具,然后就专门花了点时间去了解了一番,当然期间也确实碰到了不少问题,从入职到到今天应该有快一个半月了,然后下面就是我将这一个半月以来针对git的理解使用后整理出来的一个简单入门总结。
一、安装git
我的电脑是win7系统,然后从git官网下载msysgit安装包(http://msysgit.github.io/),安装流程和一般的windows软件的安装流程差不多,没什么区别。至于linux的还没研究过,安装成功后,在桌面或者文件夹的任何空白位置鼠标右击,如果出现下面的菜单,则表示安装成功。。。
二、配置git提交的用户名和邮件
这样做的目的是为了在git的log日志里面可以清楚的区分出每次的提交人是谁,以防日后出了问题能够立马清晰准确的定位出是哪个屌丝挖的坑,操作步骤,随便在哪个空白位置右键,然后——》git bash,调出git的命令控制台,输入以下命令:
$ git config --global user.name "Your Name(用户名)"
$ git config --global user.email "email@example.com(邮箱)"
注意:git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
三、生成 SSHKey
git推荐使用SSH协议传输文件(代码),当然使用https协议也是可以的,步骤:任意空白处右键调出git Bash命令控制台,输入以下命令:
$ ssh-keygen -t rsa -C "youremail@example.com"
然后一路回车,使用默认值即可,应该是需要3个回车的,设置密码为空(注意按3个回车的时候别输入其他的,不然设置的密码不为空,你就等着每次提交输入密码吧),如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。一般这个id_rsa.pub里面的内容是要配到git服务器上面的(由统一的人去管理),然后我们就可以从服务器上面拿代码和提交代码了。
======================================================================================
四、git多人协作流程(这里我们这里使用的是gerrit代码审查系统)
注:这里说明一下,我自己目前是这样操作的。然后下面的第三步和第四步其实可以合并成一步操作,使用git pull origin <branch_name>
,pull命令和fetch命令的区别主要在于pull是将远程服务器上的代码拿到本地后,然后会自动进行合并,而fetch命令则是只会拉取远程服务器上的代码,而不会主动去执行合并操作,需要我们手动再执行rebase或者merge命令进行合并,(当然这里是首次从服务器上拉取代码,本地没有做任何修改,所以基本没有任何冲突,直接使用pull即可)
我个人喜欢分开操作,这样分开操作之后,先fetch抓取最新提交的代码,然后再执行合并,此时若出现冲突,就解决冲突,冲突解决完之后再执行合并操作,其实也一样,看个人喜好。。
1、从远程服务器获取版本代码
1)、登录到gerrit服务器的web页面上,找到需要clone的版本URL地址(因为我们用到了gerrit工具,所以一般都是到gerrit上面进行管理的,当然也可以使用其他的工具,例如,gitHub,找到需要clone的url链接,我这里clone的是master主干分支,公司的项目,这里不便公开)
git clone ssh://xxx@www.dreamtech.com:12256/xxx
2)、创建新的本地分支并且切换到该新分支
git checkout -b saas origin/saas
3)、从远程获取最新提交的代码
git fetch origin saas
或者 git fetch
git fetch
是简写(git 会自动搜索和当前分支名相同的远程分支名)
4)、将本地修改与远程进行合并此时,若遇到冲突,需要先手动解决冲突(例如在eclipse中先解决冲突,再执行合并)
git rebase origin/saas
也可以 git merge origin/saas
注:rebase和merge命令都可以执行合并命令,但是也有些区别,查了下资料,网上说到rebase命令会更干净些,然后提交历史线呈线性展示,至于其他的区别目前还不清楚,想要了解的话可自行度娘。。。
======================================================================================
2、生成changID (非必须)
注意:前面已经提过了,因为我这里使用了gerrit代码审查工具,所以每个人提交的时候就必须要先生成这个changID值,如果没有这个changID,则不能到gerrit代码审核工具中进行代码审核操作了。。而gerrit代码审查工具的存在就没有意义了。
操作步骤:进入到工作空间(workspace)中的仓库目录(比如说mlds),然后调出git bash控制台,输入如下命令:
http://scp -p -P 29418 username@xxxxxxxxxxxxx:hooks/commit-msg .git/hooks/
注意:关于这个东西应该不是统一的,我这里只是提下这么一个东西,流程一般是这样的,,就是说你这边修改了代码,想要push到远程服务器,一般的操作是先push到gerrit服务器中,然后在gerrit代码审核工具里面进行代码审核,评分,最后再将审核通过后的代码合并到远程服务器的分支中。。完毕
3、本地做过修改之后,再提交到远程服务器
1)、查看本地有哪些文件做了修改
git status
2)、将本地的修改先添加到暂存区
git add -A (这个是将所有的本地修改添加到暂存区)
或者git add file (这个是单个的文件的添加操作)
3)、将暂存区中的内容提交到本地仓库
git commit -m "注释"
4)、获取远程仓库中的最新提交,以防发生冲突
git fetch origin saas
或者简写 git fetch
5)、将本地修改的代码与远程仓库中的代码进行合并,此时,若遇到冲突,需要先手动解决冲突(例如在eclipse中先解决冲突,再执行合并)
git rebase origin/saas
6)、将本地仓库中的代码push推送到远程仓库中
这里需要注意:
我们也可以直接用命令 git push origin saas
将代码直接push到远程代码仓库,但是由于现在我们这边是使用了gerrit代码审查工具,所有不能直接这样推送,必须使用git push origin head:refs/for/saas
这个命令将代码推送到gerrit服务器上,然后我们再登录到gerrit中(会有一个web页面供我们操作)进行审核之后,执行最后合并,此时如果报错的话 有可能是因为你的changID 没有生成,使用这个命令生成changID,再次强调,这个不是统一的。。
http://scp -p -P 29418 username@xxxxxxxxxxxxx:hooks/commit-msg .git/hooks/
其中的username改成自己的,然后执行
git push origin head:refs/for/saas
7)、登录到gerrit服务器中,进行代码审核,然后执行合并(这一步先不管,专人统一审核,合并提交代码到远程中央仓库)
五,撤销修改
1、场景一:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,使用
git checkout -- filename
2、场景二:当你不但改乱了工作区的某个文件的内容,而且还提交到了暂存区(在本地执行了commit提交,但是
还没有commit提交到远程服务器)时,想丢弃修改,分两步:
第一步使用命令 git reset HEAD filename
,就回到了场景一
第二步再按照场景一的步骤操作
3、场景三:已经提交了和不合适的修改带版本库时,想要撤销本次修改,则可以使用版本回退,但是前提是还没有推送push到远程库
六、版本回退
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
穿梭前,用git log
可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog
查看命令历史,以便确定要回到未来的哪个版本。
七、git stash 用法
关于Git Stash的详细解释,适用场合,这里做一个说明:
当前工作区内容已被修改,但是并未完成。这时Boss来了,说前面的分支上面有一个Bug,需要立即修复。可是我又不想提交目前的修改,因为修改没有完成。但是,不提交的话,又没有办法checkout到另外的分支。此时用Git Stash就相当于备份当前工作区了。然后在Checkout过去修改,就能够达到保存当前工作区,并及时恢复的作用。
之后,另一个版本的bug修复完毕之后,再使用checkout切换回之前的分支,然后再使用git stash pop
命令或者git stash apply
命令就又可以恢复回来了,此时才真心感觉到了git的强大之处,有木有一种很牛逼的感觉,哈哈。。。。。。。。。。。
git stash
备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop
从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list
显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear
清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
八、git如何放弃所有本地修改
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH #返回到某个节点,不保留修改。
git reset --soft HASH #返回到某个节点。保留修改
至此,完毕,以上的内容就是我这一个半月以来使用git工具和对git的理解使用整理出来的所有的总结,虽然很简单,内容也不多,但是我相信对入门还是有些帮助的,希望能够帮到某些人,毕竟我用的时间不长,理解的也不是很深入,这些内容也都只是根据自己的一个理解和使用,然后加上百度了一些资料所总结出的东西。倘若我的这篇博客有幸被大神们看到,对于我而言也是荣幸之至,可能文中的某些地方与大神们的理解还是有些出入,也有可能某些内容不是很准确,或者有可能还是错的等等等等,然后还烦请大神们能够指出,以免我误人子弟,不胜感激!!!
后续:
上面的内容只是一个简单的入门教程,旨在让大家以最简单的方式开始接触和使用git,若有想进一步了解git的同学,可以参考下面给出的链接:
1.Git 简单使用教程(廖雪峰的文章,非常喜欢,就是看他的文章入门的,比我这个要详细的多,比较系统的使用教程,建议看下)
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
2.Git官方手册(git官方打造,想要全面了解和使用git的同学必看,中文版的哦)
3.Git 工作流程(其实git官方手册上面,这网页就单独拿出来分析和讲解,建议看下)
http://kb.cnblogs.com/page/152176/
4、Git 版本控制流程图(git版本控制的流程图,建议了解下)