Git入门
Git 下载地址:
1.为什么要进行版本管理
1).明确分工
2)提高协同,多人开发的速度
3)提高代码质量,取出僵尸代码
2.git是什么:
目前世界上最先进的分布式版本控制系统
3.历史:
作者:Linux 两周时间用C写了一个分布式管理控制系统
4.集中式和分布式版本控制的主要区别
1.集中式版本控制(svn)
完全依赖中央服务器
2.分布式版本控制
每个人的电脑就是一个服务器
远程仓库(不是必须的)的作用:数据备份 远程交互
5.git原理以及常用命令
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
工作区(work tree):存放所有当前文档。此目录下的文件才会被Git管理
本地仓库:管理并保存所有的文档变化及历史状态。
创建版本库的步骤:
1) 进入需要管理的目录
2) 执行 git init 命令
将一个文件添加到本地仓库,分两步:
3) 使用 git add <file> 命令,添加文件。可以一次添加多个文件。
4) 使用 git commit 命令,提交,一次即可。
差异比较
用git diff -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
日志查看
我们通过 git log 命令,可以查看历史的每次提交信息:
如果嫌输出信息太多,可以加上--pretty=oneline参数:
查看所有关联日志
我们可以通过git reflog命令,看到以前的每次执行动作:
指令:git reset --hard {commit id}
如果要进行版本回退或前进,一般分两步:
1) 通过git log 或 git reflog 查看操作日志吗,查找版本的commit id
2) 通过 git reset --hard <commit id> 设置HEAD到指定版本
其实版本的回退,仅仅是修改HEAD指针的位置而已,因此Git进行版本的切换,比svn要快的多!
撤销修改分两种情况:
1) 撤销工作区修改,使用git checkout -- <file>
2) 撤销暂存区修改,分两步:
a) 使用git reset HEAD <file>来撤销暂存区修改。
b) 使用git checkout -- <file>来撤销工作区修改
文件删除
使用 git rm <file>删除文件,可以使用git reset –hard 版本编号 恢复文件
总结
git init 创建版本库
git add <file> 或者git add . 添加文件
git commit –m “” 提交文件
git diff 文件比较差异
git status 查看文件状态
git log 查看此版本之前的提交日志
git reflog 查看此分支所有提交日志
git reset HEAD <file> 来撤销暂存区修改。
git checkout -- <file> 来撤销工作区修改
git rm <file>来删除文件
6.客户端工具(TortoiseGit)
小乌龟就是一个UI界面,很方便,相关操作底层走的其实都是命令行操作.
安装以及安装中文语言包
创建本地仓库
在任意目录下新建文件夹-->进入文件夹-->鼠标右键-->Git在这里创建版本库
注意:一般不勾选纯版本库
添加文件并提交
创建一个文件-->编写内容-->文件夹中右键选择TortoisGit(T)-->添加(等同于 git add)-->写日志-->提交
差异对比
修改文件-->文件夹中右键选择TortoisGit(T)-->比较差异
提交修改
文件夹中右键选择TortoisGit(T)-->Git提交->"master"
查看提交日志
文件夹中右键选择TortoisGit(T)-->显示日志
版本回退
直接在日志显示日志界面
选中要返回的提交,然后右键,选中:重置“master”到这个版本-->重置类型Hard-->确定
版本回退到回退之前的版本
文件夹中右键选择TortoisGit(T)-->选中 显示引用记录-->
找到需要回退的提交,右键,选中:重置“master”到这个版本
撤销修改
文件夹中右键选择TortoisGit(T)-->还原
7.Git分支管理原理
第一次提交--第二次提交--第三次
谁在工作区工作就指向谁(如果在第三次,那么Head-->Master(指针)指向第三次)
第四次修改
Head-->Dev分支指向第四次
第五次修改
Head-->Dev分支指向第五次
返回到第三次做修改(head指向第三次)
所以切换分支,只需要把HEAD指向另一个分支即可,所以Git分支实现了光速切换!
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并,
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支,
Git的分支管理,基本就是创建新的指针,改变HEAD指向,删除指针等操作,几乎没有文件的增删.
8.分支管理(tortoise操作)
创建分支
文件夹中右键选择TortoisGit(T)-->写入分支名称(这里我们用dav)和说明
切换分支
文件夹中右键选择TortoisGit(T)-->切换/检出-->
选择要切换的分支(dav)
在dav分支修改文件,并提交,然后切换回master
查看文件内容,发现并没有变化,因为刚才的修改是在dev完成的,master没有影响。
合并分支
文件夹中右键选择TortoisGit(T)-->合并-->选择合并的分支dav-->查看内容
解决冲突
切换到dav修改,提交
切换到master修改,提交
用master合并dav(会失败,因为发生冲突)
查看文件-->手动解决冲突(根据需求处理)
然后文件夹中右键选择TortoisGit(T)-->解决冲突-->提交
9. 分支管理git命令(命令行了解)
创建分支
git checkout -b 分支名 创建并切换到新的分支
相当于以下两条命令:
git branch dev # 创建分支
git checkout dev # 切换到具体分支
git branch 查看所有分支,当前分支前面会有一个*表示
dev分支上进行修改和提交
此时,dev分支已经比master领先了一次提交,并且HEAD指向的是dev
合并分支
使用git checkout master切换回master分支
查看内容:
发现readme并没有改变,因为刚才修改的是dev分支,此时的HEAD已经指向了master.
使用git merge dev命令将 dev分支的修改合并到master分支
删除分支
使用git branch -d dev 命令删除dev分支,dev就是具体的分支名
制造冲突
新建一个分支dev,修改分支上的文件,提交
切换master分支,修改文件,提交
解决冲突
自动合并失败,必须先解决文件冲突,才能提交
根据实际情况进行冲突解决,再次提交
可以利用
git log --graph --pretty=oneline --abbrev-commit命令来查看所有分支
最后删除分支
总结
1) 使用git branch 分支名 创建分支
2) 使用git checkout 分支名 来切换分支
3) 也可以使用 git checkout -b 分支名 来完成 创建并切换分支的操作
4) 使用git merge 分支名 来合并分支到当前分支
5) 使用git branch -d 分支名 来删除指定分支,注意:要删除一个未合并的分支。需要使用-D参数进行强制删除
10.保存工作区状态(命令行)
把当前工作区的内容进行“快照”,等待以后恢复使用
场景:
创建并切换到dev分支,修改文件,查看状态,有修改待提交。但是现在我们需要去进行紧急的BUG修复,没办法继续开发dev
使用git stash命令 保存工作区
切换回master
假设bug修复完成,然后我们再次回到dev分支去查看
通过git stash list命令来查看
有两个方法进行恢复stash内容
1) 方式1:用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
2) 方式2:用git stash pop,恢复的同时把stash内容也删了:
3) 注意,以上指令都可以在后面紧跟 stash的序号,来操作指定stash,例如: git stash apply stash@{0}
总结
git stash 保存工作区;
git stash list 查看工作区;
git stash apply stash@{编号} 恢复工作区,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
git stash pop stash@{编号},恢复工作区的同时把stash内容也删了。