Git是分布式版本控制系统,一个版本控制的软件工具,用于管理文档修改和与同事协作,安装在本地电脑,对本地电脑的项目进行控制,并通过Git去和其他同事就用一个项目进行合作,或将本地文档托管到GitHub平台上开源。
主要工作功能有:创建本地库,记录、撤销、恢复文档修改、删除文件,添加到远程库、从远程库克隆、分支管理、标签管理等
GitHub是一个项目托管平台,利用Git进行处理。Git控制的项目推送到远程库后,就是在GitHub进行托管。
【个人理解】本地库(电脑)就像一个生产车间,用于生产产品,Git是记录产品变化的管理软件,并可以把这种变更同步到协同车间或远程库;远程库建在GitHub上,像一个共用的产品仓库或装配车间,其他生产车间可以复制仓库中的产品,并对产品进行深加工或技术更新,在征得同意后可以对仓库中该产品进行改变。
为了使Git控制的项目能够在GitHub上进行托管,需要向GitHub通报,具体如下:
ssh-keygen -t rsa -C "邮箱地址"
,回车ssh -T [email protected]
,输入yesgit config --global user.name "用户名"
, 然后回车 git config --global user.email "邮箱"
, 回车git init
,将该文件夹(目录)作为一个版本库(仓库),并自动生成隐藏目录.git,可以用ls -ah
看到;添加文本到版本库,分两步:
(1)文件从工作区添加到暂存区:git add 文本名或点号(全部)
(2)暂存区文件提交到版本库:git commit 文本名或点号(全部)
(3)举例子:
git add provices_postcode.py #添加到暂存区
git commit –m “对改动的说明” #添加到版本库
对版本库进行管理操作,后节详述
git remote add origin [email protected]:AirTesla/parse_exercise.git
,其中“AirTesla”是我的GitHub用户名,parse_exercise是远程库名,origin表示远程库git push -u origin master
,实际上是把当前分支master推送到远程。由于远程库是空的,第一次推送master分支时,加上了-u参数,产生两个作用:一是本地的master分支内容推送的远程新的master分支,二是本地的master分支和远程的master分支关联起来。推送成功后,远程库和本地库一样,之后的推送命令只需要git push origin master
一张简图描述了工作区、版本库、暂存库、远程库、分支的相互结构和运作机制
工作区、版本库、暂存区、分支之间的关系
git工作的流程就是:
第1步,使用git add把文件从工作区添加到版本库中的暂存区,git add命令可以多次用;
第2步,使用git commit提交代码,就是把暂存区的所有内容提交到当前分支。
综上,需要提交的文件修改通通放到暂存区(可能有多次的git add),然后,一次性提交暂存区的所有修改到当前分支(git commit)。
团队分支类似于:
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代码是要联网的)。
1、利用git软件的版本管理(回退、修改入库与跟踪、修改撤销、文件删除)
git log
或
git log --pretty=oneline
git reset --hard^(n)
其中n表示head回退的次数
git reset --hard <版本id>
,这个命令同样可以用来回退
git add <.或者文件名>
,然后git commit
-m'修改内容'
git diff HEAD -- <文件名>
git stauts
可以查看当前状态,看看暂存区是否cleargit checkout -- <文件名>
撤销在工作区的修改
git reset HEAD <文件名>
退回到工作区,让后使用上免命令撤销修改
git reset --hard <版本id>
rm <文件名>
删除工作区的文本
git checkout -- <文件名>
git rm <文件名>
+
git commit -m'delete'
删除版本库的文件,但是记录这个修改
git reflog
查询删除前的版本号,
git checkout --hard <文件名>
恢复到最近一次提交
2、分支管理(创建与合并、解决冲突、策略、Bug分支、Feature分支、多人协作)
git branch
git branch <分支名>
git checkout <分支名>
git checkout -b <分支名>
git merge <分支名>
git branch -d <分支名>
git log --graph --pretty=oneline --abbrev-commit,可以用图形的方式查看分支合并过程
git merge --no-ff -m"merge with no-ff" <文件名>
合并分支
git log --graph --pretty=oneline --abbrev-commit
查看分支历史
git stash
冻结保存当前分支工作状态,用
git status
显示暂存区clear,
git stash pop
解冻分支
git branch -D <文件名>
pwd #查看当前工作目录位置
#克隆远程库,git 自动将远程库master和本地库master 对应起来,远程库名origin
git clone git@github.com:AirTesla/NowToDo.git
cd NowToDo #切换到当前文件夹
git config user.name "Bob"
git config user.email "[email protected]"
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、标签管理(作用、创建、操作)
git checkout <分支名>
git tag <标签名>
#找到之前的提交版本
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/<标签名> #删除远程标签名