一:Git简介

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 

Git 是 Linus Torvalds 林纳斯·托瓦兹(Linux之父) 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

 

1,Git与SVN的区别

SVN是一个开放源代码的集中式版本控制系统。其优点有:易于管理,安全性更高,代码一致性非常高。

集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。缺点:无法分布式开发,工作时必须联网,速度慢。

Git 优点:可以分布式开发,可以离线工作,速度快、灵活。

 

2,Git 与 Github 和 Gitlab 的关系

Github:使用Git做版本控制的代码托管平台。

Gitlab:是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。

 

二:Git 工作区、暂存区与版本库

Git把管理的文件分为了两个区域四个状态。

工作区:当前开发程序所在目录称为工作区。
版本库:执行 【git add .】 将所有文件提交到暂存区,然后再执行【git commit -m '又一个版本'】提交到版本库的分支。

Git总结-LMLPHP

Git总结-LMLPHP

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本可以写成HEAD~100。

 

三:Git分支及管理策略

Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。

Git总结-LMLPHP

Git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化!

Git总结-LMLPHP

在dev分支上提交--->合并分支--->删除dev分支图示

Git总结-LMLPHP

Git总结-LMLPHP        Git总结-LMLPHP

 

Git管理策略:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

每个开发者创建了属于自己的分支,在自己的分支上写代码,写完后将自己的分支合并到dev分支(或dev-review分支)上;

开发新功能时,会创建新的feature分支,然后在该feature分支上工作;

修复bug时,会通过创建新的bug分支进行修复,然后合并,最后删除。

Git总结-LMLPHP

 

四:Git配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。

/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置;git config --system ,读写的就是这个文件。
~/.gitconfig 文件:用户目录下的配置文件只适用于该用户;git config --global ,读写的就是这个文件。
当前项目的工作目录中的 .git/config 文件:这里的配置仅仅针对当前项目有效;优先级最高。

第一次提交文件前需要配置个人的用户名称和电子邮件地址:

git config --global user.name "hua"
git config --global user.email 1011161696@qq.com

git config --list  查看已有的配置信息

 

五:Git bash常用命令

git init   把当前目录初始化为Git可以管理的仓库;会生成一个.git隐藏目录,是Git用来跟踪管理版本库的
git status        查看工作区当前状态
git add <file> 或 git add .    把文件( . 代表所有文件)添加到仓库暂存区
git commit -m <详细的版本描述>   把文件提交到仓库(将暂存区的文件提交到版本库的分支),生成一个新的版本

git rm <file>         从版本库中删除该文件
git diff <file>  查看文件修改情况
git checkout <file>   放弃对指定文件的修改

git log    查看提交记录,即:历史版本记录;注:只能查看当前版本及其之前的版本,无法查看其之后的版本
git reflog   查看历史版本命令记录,包含所有的提交版本及回滚版本
git reset --hard <commit-id/版本id>    回滚到指定版本

git log --oneline --graph    查看历史记录的简洁的版本;查看分支、合并情况     --reverse  逆向显示所有日志
git log --author=Linus --oneline -5     查找指定用户的提交日志
git log --graph --pretty=oneline --abbrev-commit

git branch   查看所有分支
git branch <branch-name>        创建分支,将当前分支的内容拷贝一份给新分支
git checkout <branch-name>      切换分支

git checkout -b <branch-name>    创建并切换分支

git merge <branch-name>         将指定分支合并到当前分支,可能会出现冲突
git merge --abort             合并时发生冲突,可执行此命令放弃合并
git branch -d  <branch-name>     删除分支
git branch -D <branch-name>   删除一个还没被合并过的分支

git rebase可以把本地未push的分叉提交历史整理成直线;rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

 

六:Git连接远程库

git remote add [shortname] [url]
git remote add origin <url>   添加关联远程库
git push -u origin master    第一次向关联远程库推送master分支的所有内容
git push origin <branch-name>  推送指定分支最新修改

git remote   查看当前配置有哪些远程仓库,还可加 -v 参数,这样可以看到每个别名的实际链接地址
git remote rm [别名]   删除关联的远程仓库

git clone <url>    克隆远程库,在当前文件夹下生成一个本地库,默认只提取到master分支的数据
git clone -b <tag> <url>   克隆远程库的指定版本
git clone -b <branch-name> <url>  克隆远程库的指定分支
git checkout -b dev origin/dev    在本地创建和远程分支对应的分支

git branch --set-upstream branch-name origin/branch-name   建立本地分支和远程分支的关联

git pull origin <branch-name>   从远端仓库提取指定分支的数据并尝试合并到当前分支,一定要注意:不要在master分支执行该操作,否则会把其它分支的数据合并到master分支!

等同于git pull 命令:
git fetch origin <branch-name>   从远程仓库下载新分支与数据到版本库  
git merge origin/<branch-name>   将从远程仓库下载的数据合并到当前分支,注意要将分支切换到需要合并的分支

等同于git pull 命令,但不会产生分叉的提交记录显示:
git fetch origin <branch-name>
git rebase origin/<branch-name>

Git总结-LMLPHP

 

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

ssh格式 git bash命令:ssh-keygen -t rsa -C "GitHub邮箱"        
生成SSH Key;会生成~/.ssh 目录,该目录下有id_rsa和id_rsa.pub两个文件,id_rsa是私钥,id_rsa.pub是公钥,复制该公钥到GitHub的settings里面的SSH keys中去
ssh -T git@github.com    验证连接是否成功

 

七:Git标签管理tag

Git的标签是版本库的快照,其实质是指向某个commit的指针。

Git有commit,为什么还要引入tag?
commit的id号是一串哈希字符串,不方便记忆与交流,所有引入tag,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑定

Git 的tag对应于Github上的 releases。

git tag <name>  在当前分支创建一个新标签,默认标签是打在最新提交的commit上的,注意这里有分支的区别;如 git tag v1.0
git tag  查看当前分支的所有标签

git tag <name> <commit_id>   在指定commit上打标签
git show <tagname>        查看标签信息
git tag -a v0.1 -m "version 0.1 released" 1094adb   创建带有说明的标签,用-a指定标签名,-m指定说明文字

git push origin <tagname>     创建的标签都只存储在本地,不会自动推送到远程。使用此命令推送指定标签
git push origin --tags      一次性推送全部尚未推送到远程的本地标签

git tag -d <tagname>   删除指定标签
git push origin :refs/tags/<tagname>   删除远程仓库标签,注意,需要先将本地该标签删除

 

八:解决冲突及其他补充

冲突解决办法:

两个分支修改了同一个文件,合并时会产生冲突。解决办法就是手动把有冲突的地方进行修改,使用git status 可以查看冲突的文件,然后提交。

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。解决冲突后,再提交,合并完成。

 

补充:

1,分支合并

分支合并时,默认Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev  

2,git stash

需要修复bug,当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
git stash  将未完成的开发状态单独进行保存
git stash pop  回到之前保存的未完成的开发状态,并删除备份

3,添加可忽略文件

vim .gitignore     添加可忽略文件,这些文件不会加入git版本库;Github上提供了各种开发语言相关的 .gitignore 文件

4,Github上给开源项目贡献代码

fork --> clone 到本地库--> 写代码并push到Github仓库 --> New pull request   

10-07 16:47