·Git的工作原理关系图:
一个文件从修改到提交的过程:
修改 ---〉工作区中进行,此时工作区的状态比暂存区,版本库区要新
添加 ---〉修改的文件被添到暂存区,工作区与暂存区的文件状态一样,都要比版本库区的状态要新
提交 ---〉暂存区中的文件被写入版本库区,此时工作区,暂存区,工作区中的文件状态时一样的
注意:工作区,暂存区都是临时存放点,不安全
版本库区是安全存放点,所有文件的版本都是控制在版本库区中的
说明:从远程git服务器克隆到本地的git库,有一个隐藏的.git目录,这个目录就是暂存区及库区的位置,千万不要删除了,除了.git目录之外的区域都是工作区。
·使用Git命令上传下载代码
1、gitconfig 配置
配置gerrit账号及邮箱
gitconfig --global user.name gerrit_account
gitconfig --global user.email 与账号绑定的邮箱
由于这里是全局配置,只需要在本地配置一次就ok了
2、gitclone 下载代码
$cd working-tree
$gitclone ssh://[email protected][代码服务器ip]:29148/projectname
注意:projectname 项目库的名称
gerrit_account 用个人的gerrit账号替换
IP:用gerrit/git的iP替换
3、从gerrit服务器拷贝钩子脚本到本地库
$scp –P 29418 -p [email protected][代码服务器ip]:/hooks/commit-msgworking-tree/projectname/.git/hooks/
这个经常是在push代码失败的时候出现要求下载的,执行该命名之后,回退push操作,再次push就能成功。
4、本地修改提交及推送到gerrit web页面
1) 确定修改哪个分支的代码,建立本地分支用于追踪远程分支
$ cd working-tree/projectname
$git branch –r
然后确定修改哪个分支的内容,比如修改主线master的代码,
就要在本地建立master分支,用于追踪远程版本库的分支。
$ git checkoutmaster (建立本地master分支,追踪远程版本库的master分支,并且切换到本地master分支)
2)修改文件内容,或者新增文件
$gitstatus (查看状态,会有提示下一步应该怎么做)
$git add 文件名称
$gitstatus
$gitcommit –m “CR编号 内容简单描述”
3)如果是删除或者重命名已受控文件或目录,即
$gitrm 文件/目录 或者 $git mv 文件1/目录1 文件2/目录2
$gitstatus (查看状态,发现文件已从工作区及暂存区删除,或者重命名后的文件已在工作区级暂存区,下一步只需提交即可)
$gitcommit –m “CR编号 内容简单描述”
4)推送本地分支的修改到gerrit服务器页面
git push origin branchname:refs/for/branchname
brachname
就是当前代码库当前本地分支,可以通过git branch 命令查看
5)代码提交者登录到gerrit页面,在走查单中添加走查人员名单
·git回退操作
1:在本地项目库中,在工作区修改或删除已受控的文件,后悔了,想要会退到之前的状态(工作区的文件回到修改之前的状态,暂存区,库区不受影响)
git checkout -- filename 回退某个文件
git checkout -- . 回退当前目录所有修改
2:在本地项目库中,修改或添加或删除了某个文件之后,执行了git add的动作之后,后悔了,想取消add的动作(工作区不受影响,库区不变,暂存区回到add之前的状态)
git reset HEAD filename
git reset HEAD .
3:在本地项目库中,修改或添加或删除了某个文件之后,执行git add ,git commit的动作之后,想取消git commit的动作,想重新commit一次(工作区,暂存区不变,库区回到commit之前的状态)
git reset --soft HEAD^
4:在本地项目库中,修改或添加或删除了某个文件之后,执行git add ,git commit的动作之后,想取消add及commit的动作,但是保留工作区的修改:(暂存区,库区回到之前的状态)
git reset --mixed HEAD^
5:在本地项目库中,修改或添加或删除了某个文件之后,执行git add ,git commit的动作之后,想取消add及commit的动作,并且抛弃工作区的修改:
git reset --hard HEAD^
·说明:如果发现第五类的回退操作有误,想回到之前的状态
·# git relog
·# 2522695 [email protected]{0}: reset: moving toHEAD^
·# git reset --hard [email protected]{0}
6: 在本地项目库中,修改或添加或删除了某个文件之后,执行git add ,git commit的动作之后,并且已经推送到远程库,如果回退远程库的此次合入呢?
在本地库通过git log找到此次提交的commit-ID(40位哈希值)
git revert -n commit-ID
git commit –m “xxxxx”
git push origin branchname:refs/for/branchname
·git冲突解决
(1)执行git fetch origin
git rebase origin/master,(请用实际的分支名称替换master)
我们看到了冲突文件......
确认冲突存在后,执行git mergetool即可启动GUI进行代码的融合:中间三个区域分别对应着LOCAL BASE REMOTE三个版本(其中,BASE为共同的基版本,LOCAL为在你合入之前已经合入的版本,REMOTE为我们合入时提示冲突的版本),最下面的区域即为解决冲突后的最终版本,保存退出。
解决好冲突文件后,将.orig文件进行删除,执行git rebase --continue命令,注意:此处mergetool已经自动为我们执行了git add
命令,无需再执行该命令。
最后进行推送,在原来的走出单中会多出一个patch包,如下所示,再次审核,通过后直接合入。
(2)针对冲突文件比较少的情况
在本地库的操作方法:假设本地库的本地分支是master分支,如果是其它分支,下面的master就要用对应的分支名称替换
cd test
git fetch origin
git rebase origin/master
·git status介绍
通过git status命令可以快速定位本地git库的状态,git status命令输出的打印信息可以指引你下一步该如何操作。
·git diff的使用
diff 不停的比对工作区、暂存区、版本库区的变化
git diff 比对工作区与暂存区的变化
git diff - -cached 比对暂存区与库区的变化
git diff HEAD 比对库区与工作区的变化
·git log介绍
‘git log‘是git中最常用的一个命令,执行之后,会显示该项目的提交历史。如果命令不加任何参数,那么就会显示目前所在分枝上,从最后一次提交开始,按时间顺序依次向前排列的所有提交历史记录。
git日志默认输出的提交历史的内容格式:
*提交的校验和
*作者信息(作者名和email地址)
*提交日期
*提交信息
多数情况下,这样输出还是比较完美的。然而,有时候你只是想看到某个分枝上的最后几条提交信息,或者某些感兴趣的数据,只要在‘git log‘命令后面加上相应的参数,它就可以做更多有意义的事情。
·gittag介绍
如何打标签:
1、在这里只介绍常用的打标签的方法:
git tag -m “标签日志” tagnamecommit-Id
具体操作:
$cd working-tree/projectname
$git branch
*master
对master分支打标签
$git log
查找版本号commit-Id
$gittag –m “标签日志” tagname commit-Id
$gitpush --tags #推送本地标签到远程,通常需要管理员在gerrit的项目库配置推送权限才可以
2、如何查看标签
$gittag –l
列出所有的表情名称
$gitshow tagname
显示标签的详细信息
$gitcheckout tagname
获取标签的代码
3、如何删除标签
$gittag –d tagname
删除本地库的标签
$gitpush origin :tagname
删除远程库对应的标签