什么是git? 版本管理工具
为什么要用它? 方便大家一起工作,提高工作效率
举个例子,大家写论文的时候,会改正好多版吧,通常都是怎么做的呢?
通过命名的方式来区分,版本1,版本2,版本3,,,,等等,这个版本改了,那个版本还得改,改来改去头都大了。
程序开发中,也会遇到类似的情况。大家协同合作,每次提交的代码,需要改一点,每次都需要保存下,很让人头疼。
这个时候版本管理工具就横空出世
版本管理工具一般有两种,一种是分布式,一种是集中式
git是分布式,svn是集中式
各有优缺点。
集中式:需要一个中央服务器,需要联网
分布式:本地有仓库
git安装
Ubuntu:apt-get install git
(有的系统自带git,无需安装)
git安装完后,需要设置用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
(git config 命令的--global参数,用了这个参数,表示这台机器上所有的Git仓库都会使用和配置)
创建版本库
(创建git仓库,这是一个文件夹,这个文件夹里面所有的文件都可以被git管理)
命令:git init
方法:在文件夹下执行git init
把文件添加到版本库
前置条件:文件放到版本库中
命令:git add filename
git commit -m "beizhu"
方法:命令行输入命令 git add filename
git中对文件进行管理,只需要两步,一步add,一步commit
git add 是将文件添加到目录
git commit 是将文件更新到版本库
add 可以反复使用,添加多个文件,
commit可以一次提交很多文件
时光机穿梭
命令:git reset 版本回退
git status 查看仓库状态
git diff 工作区版本比较,未提交文件的改动
git log 查看日志
git reflog 查看历史命令
HEAD指向的版本就是当前的版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset -hard commit_id
穿梭前,用git log 可以查看提交历史,以便确定要回退到哪个版本
要重返未来,用git reflog 查看历史命令,以便确定要回到未来的哪个版本
工作区和暂存区
git中文件的操作有两个步骤,先add 后commit
为什么呢?
因为把文件添加到Git版本库,是分两部分进行的,先添加到工作区,后放到版本库
工作区和版本库
工作区是建立文件夹的地方,我们对文件的操作是在工作区
版本库里有暂存区和master,指向master的指针叫HEAD
git add是把要提交的修改放到暂存区,然后执行git commit把暂存区的修改提交到分支
管理修改
git跟踪并管理的是修改,而非文件
git diff 比较的是工作区和版本库之间的区别
撤销修改
三种情况:
1、工作区改了,未提交到版本库 命令: git checkout -- filename
2、工作区的修改提交到了暂存区,未提交到master 命令:git reset HEAD filename
3、工作区的修改提交到了暂存区,提交到master 命令:git reset -hard commit_id
删除文件
前置条件:工作区和版本库文件相同
操作:工作区中删除文件
两种情形:1、工作区中删除文件,版本库中也需要删除文件
命令: git rm filename
git commit -m “remove filename”
2、删除操作属于误删,还需要恢复
命令 : git checkout -- filename
远程仓库
注册github
按照提示,完成一个hello-world的工程
在本机生成一个私钥,然后添加到github
本地仓库与github关联,git remote add origin [email protected]:leinaolab/learngit.git
推送本地更新到远端:git push -u origin master
从远程库克隆
git clone [email protected]:leinao/gitskills.git
分支管理
创建与合并分支:
命令:
查看分支: git branch
创建分支: git branch
切换分支: git checkout
创建+切换:git checkout -b
合并某分支到当前分支:git merge
删除分支: git branch -d
git对分支的操作是通过指针来完成,十分高效,
git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在master上工作效果一样,但是更加安全
解决冲突:
当git无法自动完成合并时,就必须首先解决冲突,解决冲突后,再提交,完成合并
原因:不同分支合并,会有不一样的地方
如何操作:手动修改
命令:git merge
执行合并命令后,冲突会在文件中显示,手动在文件中修改成需要的样子
然后执行git add ,git commit ,完成合并
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward 模式
git有快速合并,也有--no-ff
分支快速合并,是直接移动指针,删除分支后,会丢掉分支信息
如果强制禁用快速合并,git会在merge时生成一个新的commit。这样,从分支历史上就可以看出分支信息
下面是 --no--ff方式的git merge:
git merge --no-ff -m "merge " dev
bug分支
应用场景:你正在处理手中的事情,这个时候需要去解决一个bug,当前工作可能要明天才能完成,但是需要两个小时内解决bug,该怎么弄呢?
解决办法:保存现在的工作状态,去解决bug,解决bug之后再回到工作
命令:git stash 、 git apply 、 git pop
步骤:
1、保存当前工作状态 git stash
2、切换到需要解决bug的分支,例如切换到master git checkout master
3、在当前分支,拉取一个分支,用来修复bug,取名issue-101 git checkout -b issue-101
4、在issue-101分支修复bug,修复完成后切换到master,并完成合并(要加参数 --no-ff)
git merge --no-ff -m "merge fix issue 101" issue-101
5、删除issue-101分支。 在master上,删除合并后的分支。git branch -d issue-101
6、恢复到先前的工作状态。 查看有哪些保存的状态,git stash list 。
两种恢复方法 :1、直接恢复到先前工作状态,保存的stash还在。 git apply 2、恢复到先前的工作状态,自动删除保存的stash。 git pop
注意事项:对stash状态的保存和恢复,只能在当前分支进行操作。
例如在master分支上保存的stash,只能在master上查看,在feature1分支上看不到该stash状态。
feature分支(开发一个新特性,最好新建一个分支)
应用场景:新建feature分支开发一个特性,完成一部分后,得知该特性被取消,该如何处理呢?
解决方法:不对该分支进行合并操作,使用强制删除命令
命令:git branch -D feature
操作步骤:
1、新建feature分支。git checkout -b feature
2、强制删除。 git branch -D feature
注意事项:不能删除自己所在的分支。例如,现在切换到feature1分支,执行命令git branch -d feature1,会提示无法删除。
多人协作
有一个问题:git 远程库中的仓库名 origin和master是什么关系和区别