GIT是世界上最先进的分布式版本控制系统
安装GIT(Windows)
https://git-scm.com/downloads(下载安装),安装默认选项勾选安装,安装之后打开git bash.exe(操作和Linux基本操作类似)文件,输入
$ git config --global user.name “Your Name”
$ git config --global user.email "email@example.com"
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库(repository)
windows创建目录不得有中文,防止乱码最好用nodepad++设置编码为utf-8进行编辑;
1、创建目录 在git bash.exe窗口中写入,mkdir catalogueName
2、进入目录,cd catalogueName
3、查看目录,pwd
4、设置为仓库,git init
5、把文件添加到版本库,用nodepad++文件编写一个name.txt文件夹放入catalogueName目录,然后git add name.txt,添加文件到提交列表,git commit -m “提交的什么类型的文件”,add只能添加一个文件,commit可以提交多个文件,-m 后面的是提交说明,方便大家阅读的;
时光穿梭机
>修改
修改文件后,在git bash.exe中输入,git status (查看仓库状态);
显示如下:
On branch master //在分布式系统中
Changes not staged for commit: //分期的进行提交
(use "git add <file>..." to update what will be committed) //改变将会提交
(use "git checkout -- <file>..." to discard changes in working directory) //改变将无视
modified: readme.txt //修改的文件名字
no changes added to commit (use "git add" and/or "git commit -a")
假如长期未修改,忘了上次修改什么地方了,只需要输入:git diff,会提示上次修改什么地方了;
步骤为
- 修改文件内容;(git status此时可用此命令监控)
- git add name.txt //将修改的文件添加
- git commit -m “修改后的”(ps:修改后的文件提交之后不能再使用git diff命令进行查看,此时就要用另一个命令git log查看每个版本的修改之处)
>回退
版本回退,git log获取修改的日志,然后每次修改有个主题,也就是每次提交 -m 后面加的说明,
commit e10529b87a4d852670fc228790b8f8ba999f32de //commit ID让版本回退用的
Author: SHR 357396211@qq.com //仓库所属作者
Date: Thu Nov 8 14:34:38 2018 +0800 //修改时间
我修改后的 //这里是 -m的内容
. git reset —hard e10529b87a//回退到上述版本,取commit ID中的前几位就可以了;(git reset --hard HEAD当前版本)
>分区
工作区和暂存区:
工作区就是电脑看到的目录
版本库(Responsity)就是目录下的.git目录,其中最重要的就是stage的暂存区,和一个git自动创建的分支master,指向master的指针为HEAD
git add name.txt 把文件保存到暂存区,然后git commit -m把文件提交到HEAD所指的master,到此对修改的文件提交流程有了一定认知,文件必须过暂存区,修改–>add–>commit–>stauts(成功)
修改–>commit–>stauts(失败)
>撤销修改
git checkout – myFirst.txt,这条命令是把修改全部撤销,分两种情况,一种是还未add到暂存区,撤销修改就回到和版本库一模一样的状态;
另一种是添加到暂存区后,又做了修改,撤销修改回到添加暂存区后的状态,也就是最近一次add或者commit之前的状态;
我个人的理解就是:
小明修改了name.txt文件,刚修改完,突然想到情况不对,git status;发现工作区文件需要改变,现在就用git checkout – name.txt;
小黄修改了文件已经添加到暂存区了,这个时候需要git reset HEAD name.txt,将文件回退到工作区,git status 查看工作区,再执行git checkout – name.txt,在查看工作区,发现工作区清空;
>删除
- 1、git add name.txt;
- 开始删除
- 2、rm name.txt;
- 3、git status;
- 4、git rm name.txt or git checkout – name.txt
远程仓库
>上传
远程仓库就是在GITHUB上面也创建一个GIT仓库,并且使这两个仓库远程同步,这样,Github上的仓库既可以作为备份,又可以让他人来协同完成;
- 在git上创建仓库; 创建之后会有三种选项,提供了代码模板;
- 本地仓库执行git remote add origin https://github.com/shihaor/shr.git(第二种,通过命令行推送),其中origin代表的是推送的远程仓库的别名,https://github.com/shihaor/shr.git这个是仓库地址;
- git push -u origin master,第一次推送的时候,加-u,代表把本地Master和远程Master关联起来,后续能简化命令;;
- 后续再次提交只需要 : 添加到暂存区,提交,git push origin master 即可;(PS:这个步骤中,打开GITHUB可能很慢,可自行百度解决方法,在c:/windows/system32/drivers/etc/hosts中添加一个连接GITHUB最快的IP地址)
>下载
在github上新建一个仓库,并且勾选自带readme.md那个选项,生成之后查看readme.md文件是否存在,然后再本地命令行中执行 git clone https://github.com/shihaor/Towice 此处换为自己的git地址;打开本地git目录,发现多了一个目录下有github上的文档;
分支管理
分支就像一个一个的平行宇宙
>创建分支
- git checkout -b dev (-b表示创建并且切换)这条命令是git branch dev 和git checkout dev这两条命令的集合
- git branch 查看有多少分支,*代表当前分支
- 在dev分支上修改name.txt文件–>add–>commit,
- git checkout master发现该分支下的节点还未进行修改,
- git merge dev 将DEV的分支同步到MASTER分支下,
- git branch-d dev删除dev分支
>解决分支冲突
新建一个分支
git checkout one;;
在分支上修改文件并提交;切换分支
git checkout master;
在分支上修改同样的文件并且提交,合并分支,
git merge one;发现报错,打开被修改文件一看,发现系统用====和------->标记出来了每个分支的新增内容,修改一致后进行提交再整合;
>合并分支
合并分支git默认的是fast forward模式,合并之后会删除分支,使用git merge --no-ff -m "123 " 表示禁用fash forward模式,在合并时生成一个新的commit,这样可以看出分支信息(get log)
>Bug分支
假如在当前工作环境出出现了Bug怎么办,又不敢大幅度的调动代码,只能创建一个BUG名字为代号的分支,但是当前工作区还没有保存怎么办,也不能提交,于是使用Git提供的stash功能,可以把工作现场保存起来,
流程就是在dev工作的时候出现了bug,又不想提交,那么就用 git stash保存工作环境,接下来确定要在哪个(master)分支上进行修复,就在哪个分支上创建临时分支,git checkout -b issue,然后修复掉bug,git add --> git commit;修复完成,切换到master分支合并并且删除,git checkout master --> git merge --np-ff -m “已经修复” issue,git checkout dev,切换回dev进行工作,dev当时的工作环境保存了起来,使用git stash list进行查看,git stash pop进行恢复并且删除stash区的任务,相当于git start apply和git drop stash两条命令的集合;
>开发过程中添加新功能
创建新功能分支:git checkout -b newValue;
创建新文件
提交:git add—>git commit
但是接到上级命令不可以使用新功能,销毁他
git branch -d newValue
提示:error: The branch ‘newValue’ is not fully merged.
If you are sure you want to delete it, run ‘git branch -D newValue’.
把–d改为-D可成功删除
>多人协作开发
查看远程仓库:git remote(git remote -v 显示更加详细的信息)
推送分支::git push 远程仓库名字 个人分支名字
假如我要在远程仓库的dev分支进行开发:
- git checkout -b dev origin/dev//获取远程仓库的dev分支信息
- git add e.txt
- git commit -m “add e”
- git push origin dev //向远程仓库推送dev分支
假如小明也向dev推送dev分支,他是推送不上去的,提示提交有冲突,需要把冲突抓到本地进行修改,git pull
会提示抓取失败,原因是没有指定本地dev和远程dev的链接,git branch -set-upstream-to=origin/dev dev
接下来再使用git pull,手动选择删除内容进行提交;
>reBase(变基)
本身多版本提交会导致很难看,很多条条杠杠,使用git rebase则会使条理清晰一点,更加好看
标签(版本号)
git tag vx.x 给当前分支打上版本号,get log 查看commitID,git tag vx.x commitID给指定ID打上版本号
git tag -a 版本号 -m “说明” commitID给指定版本指定说明
git tag -d vx.x删除标签
git push origin vx.x推送标签到远程
git push origin --tags一次性推送所有未推送的版本号
删除远程标签的步骤:1、删除本地标签:git tag -d vx.x 2、远程删除git push origin shr/tags/vx.x
参考廖雪峰老师的教程,感谢廖雪峰老师的分享