Git使用手册
Git分为本地分支和远程分支,是一个分布式的版本管理系统,相对于svn的集中式管理,更加优越。
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git 与 SVN 区别
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
Git 与 SVN 区别点:
1、GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
2、GIT把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
3、GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
4、GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
5、GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git可以以http方式拉取代码,也可以用ssh方式,后者可以用ssh key免密码登录。
1. 常用命令
git clone 拷贝代码
git status 当前代码状态
git log 提交历史
git add 文件加入git
git commit -a -m "comments" 代码提交并评论
git push 代码提交到远程分支
git pull 从远程分支拉取最新代码
git fetch FETCH_HEAD指的是: 某个branch在服务器上的最新状态
git branch xxx 创建某个分支
git checkout xxx 切换到某个分支
git checkout xxx.cpp 未提交状态下恢复文件,即revert
git merge master 合并当前分支到master
如果有submodule,clone代码时注意在地址后加“–recursive”,如:
git clone ssh://aaa@qq.com:10022/zhb/zhb.git --recursive
在tortoiseGit上运行:
git submodule update
2. 回退到某个版本
先显示提交的log
$ git log
commit 4dc08bb8996a6ee02f
Author: Mark <aaa@qq.com>
Date: Wed Sep 7 08:08:53 2016 +0800
commit 9cac9ba76574da2167
Author: xxx<aaa@qq.com>
Date: Tue Sep 6 22:18:59 2016 +0800
回退到某个commit版本:
git reset --hard e377f60e28c8b84158
强制提交:
git push -f origin master
3.分支操作
(1)删除分支
删除本地分支
git branch -D br
删除远程分支
git push origin :br (origin 后面有空格)
(2)新建分支
新建并切换到本地dev分支
git checkout -b dev
本地分支与远程分支相关联
git pull origin dev
在本地新建分支并推送到远程
git checkout -b test
git push origin test
这样远程仓库中也就创建了一个test分支
4.修改全局用户名和email
git config --global user.name "张三"
git config --global user.email "aaa@qq.com"
5.子模块介绍
使用场景
当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能。
常用命令
git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块
6. 合并冲突
产生原因:
有两个开发分支:zhb1,zhb2。两个分支都会对同一个文件做修改,这样在顺序提交合并到master分支时,就会产生冲突。
需要注意的是,只有对同一文件的同一行修改时,才需要手动解决冲突,如果修改的是不同行,git merge时,会自动处理。下面我们讨论的是对同一文件的同一行修改时产生的冲突。
有一文件:confict.txt
master分支上的内容是:
DECLARE_string(zhb1);
DECLARE_string(zhb2);
zhb1分支上新增一行,并修改第一行,内容变为:
DECLARE_string(zhb1==);
DECLARE_string(zhb2);
DECLARE_string(zhb3);
Commit,push到zhb1远程分支。
zhb2分支上删除第二行,并新增两行(新增的内容与zhb1分支不相同),内容变为:
DECLARE_string(zhb1);
DECLARE_string(zhb3==);
DECLARE_string(zhb4);
Commit,push到zhb2远程分支。
先把zhb1分支合并到master,并push,没问题。
再把zhb2分支合并到master,就会出现冲突:
提示自动合并失败,查看状态,出现both modified: confict.txt字样,表明该文件合并冲突了。
如果是在windows下的TortoiseGit工具查看该文件状态,文件会出现一个惊叹号:
这时,打开文件内容如下:
<<<<<<< HEAD
DECLARE_string(zhb1==);
DECLARE_string(zhb2);
DECLARE_string(zhb3);
=======
DECLARE_string(zhb1);
DECLARE_string(zhb3==);
DECLARE_string(zhb4);
>>>>>>> zhb2
<<<<<<<,=,>>>>>>>这三个标记是冲突的格式,
<<<<<<<到=是在当前分支合并之前的文件内容
=======到>>>>>>> zhb2是在其它分支下修改的内容
我们要做的是需要在这个两个版本中选择一个,然后把标记符号也要一起删除。
TortoiseGit提供了一个可视化的工具来编辑冲突。
修改编辑区,在下方的方框中编辑最终保留代码,保存标记冲突解决:
上面解决冲突的方式是,只保留以下两行,其他都删掉(注意行号前面的+、-号):
DECLARE_string(zhb3);
DECLARE_string(zhb4);
解决完冲突后,commit并push,整个流程结束。
7. 解决non-fast-forward冲突
git提交被拒绝,提示(non-fast-forward);
解决方法:
1. git fetch origin debug
获取远程分支debug的修改
2. git merge origin debug
合并远程分支debug
3. git pull origin debug
更新本地分支
这个时候提示文件有冲突,手动解决以下就可以了。
8. TortoiseGit merge master冲突解决
1.切换到自己的分支
2.rebase master,右边upstream选择master
3.查看是否有冲突,如果有冲突,解决冲突,并且设置为reslove,冲突解决完成。
3.继续rebase,commit,提交;
4.如果提示submodule有冲突,解决冲突,选择你想要的最后提交。
5.继续rebase,提示完成;
6.push到自己的远程分支,发现未pull,无法push;
7.pull代码到本地,发现有冲突,继续修改冲突。
8.冲突解决完,push到远程分支。
9.冲突解决,merge到master。
下一篇: Java面向对象--类与对象