欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Git使用手册

程序员文章站 2024-03-15 18:41:51
...

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,就会出现冲突:
Git使用手册
提示自动合并失败,查看状态,出现both modified: confict.txt字样,表明该文件合并冲突了。
Git使用手册
如果是在windows下的TortoiseGit工具查看该文件状态,文件会出现一个惊叹号:
Git使用手册
这时,打开文件内容如下:

<<<<<<< HEAD
DECLARE_string(zhb1==);
DECLARE_string(zhb2);
DECLARE_string(zhb3);
=======
DECLARE_string(zhb1);
DECLARE_string(zhb3==);
DECLARE_string(zhb4);
>>>>>>> zhb2

<<<<<<<,=,>>>>>>>这三个标记是冲突的格式,
<<<<<<<到
=是在当前分支合并之前的文件内容
=======到>>>>>>> zhb2是在其它分支下修改的内容

我们要做的是需要在这个两个版本中选择一个,然后把标记符号也要一起删除。

TortoiseGit提供了一个可视化的工具来编辑冲突。
Git使用手册
修改编辑区,在下方的方框中编辑最终保留代码,保存标记冲突解决:
Git使用手册
上面解决冲突的方式是,只保留以下两行,其他都删掉(注意行号前面的+、-号):

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。