第一步,认识Git
Git是分布式版本控制系统,一个版本控制的软件工具,用于管理文档修改和与同事协作,安装在本地电脑,对本地电脑的项目进行控制,并通过Git去和其他同事就用一个项目进行合作,或将本地文档托管到GitHub平台上开源。
主要工作功能有:创建本地库,记录、撤销、恢复文档修改、删除文件,添加到远程库、从远程库克隆、分支管理、标签管理等
GitHub是一个项目托管平台,利用Git进行处理。Git控制的项目推送到远程库后,就是在GitHub进行托管。
【个人理解】本地库(电脑)就像一个生产车间,用于生产产品,Git是记录产品变化的管理软件,并可以把这种变更同步到协同车间或远程库;远程库建在GitHub上,像一个共用的产品仓库或装配车间,其他生产车间可以复制仓库中的产品,并对产品进行深加工或技术更新,在征得同意后可以对仓库中该产品进行改变。
第二步,Git和GitHub关联托管代码
为了使Git控制的项目能够在GitHub上进行托管,需要向GitHub通报,具体如下:
(1)在GitHub官网上注册一个用户;
(2)安装Git软件
-
(3)打开Git Bash软件,配置Git
-
- 创建SSH key,命令行输入
ssh-keygen -t rsa -C "邮箱地址"
,回车 - 输入保存密钥的地址,可以使用默认,直接回车
- 设置密码,生成密钥,可以不设置密码,两次回车,界面会显示密钥存放的地点,包含两个个文件:id_rsa(私有密钥)、id_rsa.pub(公有密钥),用记事本打开公有密钥,复制内容;
- 关联GitHub网站,打开GitHub网站的设置(settings),找到SSH keys,点击Add SSH key,将公有密钥复制到其中
- 验证是否关联,输入命令
ssh -T git@github.com
,输入yes - 告知GitHub你的用户名和密码,以作关联:
输入:git config --global user.name "用户名"
, 然后回车
输入:git config --global user.email "邮箱"
, 回车
- 创建SSH key,命令行输入
-
(4)在本地电脑上创建版本库
-
- 在文件点击右键选择Git Bash Here,打开新界面;
- 命令行输入
git init
,将该文件夹(目录)作为一个版本库(仓库),并自动生成隐藏目录.git,可以用ls -ah
看到; - 在该目录下创建或放入文件
-
(5)在文本库中对文本进行增删改查
-
添加文本到版本库,分两步:
(1)文件从工作区添加到暂存区:git add 文本名或点号(全部)
(2)暂存区文件提交到版本库:git commit 文本名或点号(全部)
(3)举例子:
git add provices_postcode.py #添加到暂存区
git commit –m “对改动的说明” #添加到版本库
对版本库进行管理操作,后节详述
-
(6)版本库与远程库进行同步
-
- 创建远程库,登陆GitHub,右上角加号里边,点击“New repository”,创建新的远程库,输入库名,添加README.md,这个库有两个作用,一可以克隆,二是与本地版本库关联
- 关联本地版本库,在本地的parse_exercise(自己创建)仓库下运行命令
git remote add origin git@github.com:AirTesla/parse_exercise.git
,其中“AirTesla”是我的GitHub用户名,parse_exercise是远程库名,origin表示远程库 - 本地库的所有内容推送到远程库:用git push命令,第一次推送命令
git push -u origin master
,实际上是把当前分支master推送到远程。由于远程库是空的,第一次推送master分支时,加上了-u参数,产生两个作用:一是本地的master分支内容推送的远程新的master分支,二是本地的master分支和远程的master分支关联起来。推送成功后,远程库和本地库一样,之后的推送命令只需要git push origin master
第三步,理解Git内部工作机制
一张简图描述了工作区、版本库、暂存库、远程库、分支的相互结构和运作机制
工作区、版本库、暂存区、分支之间的关系
- 工作区:电脑目录,即工作目录
- 版本库:工作区下隐藏目录.git,是git的版本库,版本库里边包含两部分:一个是暂存区,另一个是主分支master(每次提交的形成的时间轴)
- 暂存区:工作区要提交的文件修改全部放在暂存区,然后一次性提交到主分支
- 分支:为了保证主分支进程的安全,也为了多个成员之间的协作,建立独立分支用于个体开发,开发完毕将自己的分支合并到主分支。
- 注意:需要知道的是Head、主分支master、自建分支、主提交节点四个之间的关系,Head指向哪个,哪个分支就是当前工作分支,通过git branch可以检查;主分支master指向主提交节点,自建分支指向个人的提交点;当个人任务完成后通过git merge命令合并分支。
git工作的流程就是:
第1步,使用git add把文件从工作区添加到版本库中的暂存区,git add命令可以多次用;
第2步,使用git commit提交代码,就是把暂存区的所有内容提交到当前分支。
综上,需要提交的文件修改通通放到暂存区(可能有多次的git add),然后,一次性提交暂存区的所有修改到当前分支(git commit)。
团队分支类似于:
第四步,理解Git架构
架构图[1]
功能特性
git的功能特性:
从一般开发者的角度来看,git有以下功能:
1、从远程服务器上克隆clone完整的git仓库(包括代码和版本信息)到自己的机器(单机)上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把远程服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者的角度看,git有以下功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向远程服务器(公共的)提交结果,然后通知所有开发人员。
优点:
1、适合分布式开发,强调个体。
2、远程服务器(公共的)压力和数据量都不会太大。
3、速度快、灵活。
4、任意两个开发者之间可以很容易的解决冲突。
5、离线工作。(当然提交远程服务器或者从远程服务器fetch代码是要联网的)。
第五步,git工作细节[2]
1、利用git软件的版本管理(回退、修改入库与跟踪、修改撤销、文件删除)
-
(1)版本回退与前进
-
<1>查看历史版本:
git log
或git log --pretty=oneline
<2>回退到某个历史版本:git reset --hard^(n)
其中n表示head回退的次数
<3> head指向特定修改git reset --hard <版本id>
,这个命令同样可以用来回退
<4>查看操作历史,同时可以找到不同修改版本的id,git reflog
(2)修改入库与跟踪
-
- 文档修改过后需要经过两步才能入库,只完成一步无法入库,即先
git add <.或者文件名>
,然后git commit
-m'修改内容' - git 可以跟踪修改过程,commit命令只会提交add过的版本,如果要查看工作区和版本库的修改有什么不同可以使用
git diff HEAD -- <文件名>
- 用
git stauts
可以查看当前状态,看看暂存区是否clear
(4)修改撤销
- 文档修改过后需要经过两步才能入库,只完成一步无法入库,即先
-
分成三种情况:
<1>在工作区为提交。使用命令git checkout -- <文件名>
撤销在工作区的修改
<2>add到暂存区但没有commit。首先使用命令git reset HEAD <文件名>
退回到工作区,让后使用上免命令撤销修改
<3>完全提交到版本库。使用版本回退的命令git reset --hard <版本id>
(5)文件删除 -
<1>
rm <文件名>
删除工作区的文本
恢复文件:git checkout -- <文件名>
<2>git rm <文件名>
+git commit -m'delete'
删除版本库的文件,但是记录这个修改
恢复文件:用git reflog
查询删除前的版本号,git checkout --hard <文件名>
恢复到最近一次提交
2、分支管理(创建与合并、解决冲突、策略、Bug分支、Feature分支、多人协作)
-
(1)创建与合并分支
-
<1>查看分支:
git branch
<2>创建分支:git branch <分支名>
<3>切换分支:git checkout <分支名>
<4>创建并切换分支:git checkout -b <分支名>
<5>合并到当前分支:git merge <分支名>
<6>删除分支:git branch -d <分支名>
(2)解决分支冲突
<1>发生冲突的原因:在主分支master和新建分支中分别修改了文本,并分别提交了版本库,在合并时候会现实冲突
<2>打开文本,会列出冲突的部分,修改后,提交到版本库,再次合并
<3>
-
<1>合并分支通常使用fast forward模式,删除分支后,会丢掉分支信息
<2>使用普通合并模式,强制关闭fast forward模式,删除分支后,保留分支信息
<3>git merge --no-ff -m"merge with no-ff" <文件名>
合并分支
git log --graph --pretty=oneline --abbrev-commit
查看分支历史
(4)Bug分支 -
就是说,当前任务没有完成,但是又要做紧急任务怎么办,办法就是冻结保存当前任务进度,创建Bug分支或临时分支,处理临时问题,然后再进入冻结的任务,继续工作
<1>git stash
冻结保存当前分支工作状态,用git status
显示暂存区clear,git stash pop
解冻分支
(5)Feature分支
-
<1>需要开发一个新功能时候,需要创建一个Feature分支,然后合并到主分支master,最后删除分支;
<2>如果开发新功能停止,删除分支时候,如果不经过合并,删除时候会失败提示修改将丢失,需要强行删除git branch -D <文件名>
(6)多人协作
- <1>从远程库中克隆项目
git log --graph --pretty=oneline --abbrev-commit,可以用图形的方式查看分支合并过程
(3)分支管理策略
pwd #查看当前工作目录位置
#克隆远程库,git 自动将远程库master和本地库master 对应起来,远程库名origin
git clone git@github.com:AirTesla/NowToDo.git
cd NowToDo #切换到当前文件夹
git config user.name "Bob"
git config user.email "bob@example.com"
git branch #查看分支
:
<2>checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
git checkout -b dev origin/dev
<3>先对文档做出修改,提交到版本库,然后推送到远程库
git add <修改添加>
git commit -m'修改说明'
git origin push dev #推送dev分支
如果有提交冲突推送失败,先用git pull
把最新的提交从origin/dev中抓取下来,然后本地合并解决冲突,再推送
git pull
#如果失败,并提示本地分支与远程分支没有链接,可执行
git branch --set-upstream dev origin/dev
git pull #再次同步
#同步后解决冲突,参见“解决冲突”部分
#冲突解决后,再次提交,push origin dev
3、标签管理(作用、创建、操作)
-
标签的作用是代替commit号,方便记忆
标签创建、管理:
-
<1>切换到需要打标签的分支:
git checkout <分支名>
<2>给最新提交的commit上打标签:git tag <标签名>
<3>给之前提交的commit上打标签:
#找到之前的提交版本
git log --pretty=oneline --abbrev-commit
git tag <标签名> <版本名> #追加标签名
git show <标签名>查看版本
git tag -a <标签名> -m'标签说明'
git tag -s <> -m"私钥标签说明"
git push origin <标签名> #远程推送标签
git push origin --tags #推送全部标签
git -d <标签名> #删除标签名
git push origin:refs/tags/<标签名> #删除远程标签名