一、简介
分布式版本控制系统
在每个用户的个人电脑上都有一个完整的版本库,不联网也可以正常使用(不能进行多人协作)。例如常用的Git
集中式版本控制系统
具有一个中央版本库,必须联网才能正常使用(如果不联网的话,连基本的版本管理都做不到)。例如常用的SVN和CVS
Git较于其他版本控制系统不同的地方是其跟踪并管理的修改
,而非文件
如何合理的建立版本库???????
Git版本库的创建和基本设置:
- 1、使用
git init
来将一个目录变成Git可以管理的仓库 - 2、使用
git config --global user.name "your name"
来配置该版本库的用户姓名 - 3、使用
git config --global user.email "email address"
来配置该版本库用户的电子邮件地址
二、简单使用
在Git中有三个概念:工作区、版本库、暂存区
工作区(Working Directory)
:就是Git将要管理的那个文件夹版本库(Repository)
:就是那个.git
文件夹暂存区
:版本库中的stage
将文件添加到Git版本库中,要分两步来执行:
- 1、用
git add filename
把文件添加进去,实际上就是把文件修改添加到stage
中 - 2、用
git commit -m "注释"
向分支提交更改,实际上是把stage
中的所有内容提交到当前分支
上
每一次commit都有对应的commit id(版本号)
在Git中,用HEAD
表示当前版本,上一个版本是HEAD^
,上上一个版本是HEAD^^
。往前100个版本可以写成HEAD~100
版本回退
:Git的版本回退速度非常快,因为在Git内部有一个指向当前版本的HEAD指针,当你回退版本的时候,该指针就在不同版本号之间移动,同时把工作区的文件更新了。所有HEAD指向哪个版本号,这个版本就是当前版本
创建Git版本库的时候,Git自动创建了唯一一个master分支
git log
和git reflog
只是记录提交到分支上的操作,并不记录add操作和工作区中的修改操作
三、Git与GitHub
库与库对应;分支与分支对应
GitHub提供7*24小时的Git仓库托管服务
,本地Git仓库和GitHub仓库之间的传输是通过SSH加密
的(也可以使用https加密)
在本地创建一个Git仓库,同时也在GitHub上创建一个Git仓库,并且让这两个仓库进行远程同步
。这样,GitHub上的仓库既可以作为备份,又可以让他人通过该仓库来协作
用git remote add origin git@github.com:网址
来形成关联(远程库的默认名称为origin
)
用git remote rm 远程库名
来删除与指定远程库的关联
用git push -u origin master
将本地库的内容推送到远程(由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程master分支关联起来,在以后的推送或拉取命令时可以简化命令git push origin master
)
第一次push会有SSH警告
用git clone 网址
将远程库克隆到本地
四、分支
分支管理的是commit(提交),不是add
- 1、
git checkout -b 分支名
:创建并切换新分支 - 2、
git branch 分支名
:创建新分支 - 3、
git checkout 分支名
:切换新分支 - 4、
git branch
:查看所有分支,当前分支会标* - 5、
git merge 分支名
:合并指定分支到当前分支 - 6、
git branch -d 分支名
:删除指定分支
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
手动解决冲突的时候,Git用<<<<<<<<<<、===========、>>>>>>>>>>标记出不同分支的内容
当两个分支都已经进行了修改,这时进行分支合并有可能会有冲突导致无法成功合并,这时需要去手动修改文件,修改完成后进行add和commit
,这时就不用再次合并了(应该是自动完成的)
用git log --graph --pretty=oneline --abbrev-commit
来看到分支合并图
在合并分支时,Git有可能会用Fast forward模式
,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式
,Git就会在merge时生成一个新的commit。这样,从分支历史就可以看出分支信息了
用git merge --no-ff -m "注释" 分支名
来禁用Fast forward模式来进行合并
分支策略:master分支是非常稳定的,也就仅用来发布新版本,平时不能在上面干活。一般在dev分支上干活
需要在哪个分支上修复bug,就在哪个分支上新建临时分支;需要开发一个新的feature,最好在dev分支上新建一个新分支来进行开发
新的分支只是新建的一个新的提交,如果只是在新的分支上进行了工作区的修改和添加到stage中,那么这些修改会影响到master分支。如果修改后提交了,那么就不会影响到master分支了(除非进行了merge)
用git remote -v
查看远程库的信息
在push、pull和clone的时候,是如何指定分支之间的关联的?????
当我们从远程仓库clone
时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程仓库的默认名称为origin
当从远程库clone
时,默认情况下,只clone了master分支到本地(默认已形成关联)
用git checkout -b 分支名 origin/分支名
将指定的远程分支clone到本地(名字建议用相同的,应该会自动形成关联
)
push
某分支上的所有本地commit到远程库,推送时要指定本地分支。这样,Git就会把该分支推送到远程库对应的远程分支上(第一次需要使用-u参数,这样会自动形成关联)
在push
失败时,解决方法是先用git pull把最新的提交抓下来,在本地合并,解决冲突后再推送
pull
失败,原因是没有指定本地分支与远程分支的关系。用git branch --set-upstream 分支名 origin/分支名
来建立分支间的关系
master分支
是主分支,因此需要时刻与远程同步dev分支
是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步bug分支
只用于在本地修复bug,就没必要推送到远程了(合并到dev分支后,再推送)feature分支
是否推送到远程,取决于你是否和你的小伙伴合作在上面开发该功能
五、Git的标签
标签和commit id
类似,只是比commit id更好记(有意义的名字),标签是一个指向某个commit的指针
标签可以用GPG
来加密
- 1、用
git tag 标签名
来打标签,默认在最新的commit上打标签 - 2、用
git tag 标签名 commit id
来为历史提交打标签 - 3、用
git tag
来查看标签 - 4、用
git show 标签名
来查看标签信息 - 5、用
git tag -a 标签名 -m 标签说明
来为所打标签添加说明文字 - 6、用
git tag -d 标签名
来删除本地标签 - 7、用
git push origin 标签名
来将本地标签推送到远程 - 8、用
git push origin --tags
来将所有还没推送远程的标签推送到远程
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要删除远程标签,要先删除本地标签,然后用git push origin : refs/tags/标签名
来删除远程标签
六、Git的stash功能
储藏功能
七、常用命令
- 1、
git status
:查看工作区的状态 - 2、
git diff filename
:使用Unix通用的diff格式来比较工作区和分支上该文件的区别 - 3、
git log
:查看历史记录,--pretty=oneline
参数可以使得显示更加简洁 - 4、
git reflog
:查看每一次历史命令 - 5、
git reset --hard 版本号
:进行版本回退 - 6、
git reset HEAD filename
:把stage中的修该撤销掉(都是针对某个文件的) - 7、
git checkout -- filename
:把工作区中的修改撤销掉(都是针对某一个文件的),文件回到最近一次git commit或git add时的状态 - 8、
git checkout filename
:切换到另一个分支 - 9、
git statue
: - 10、
git rm filename
:删除文件 - 11、
.gitignore文件
的书写 - 12、
git config --global alias.别名 原名
来设置命令别名
疑问
配置Git的时候,加上--global
参数是针对当前用户起作用的(该用户在这台电脑的所有Git仓库中都有效);如果不加,那只针对当前的仓库起作用
每个仓库的配置文件是.git/config
每个用户的git配置文件是~/.gitconfig
除了可以在命令行中设置git命令别名,也可以直接在以上两个配置文件中设置;如果设置错误,可以删掉文件重新通过命令配置
通过git rm filename
删除的文件,而且用git commit
提交了,这样还能版本回退吗?????这个过程中需要git add
吗??????