常见的版本管理系统 1.分布式 Git 2.集中式 CVS、SVN、VSS
分布式的优点:
- 安全性高
- 对网络没有严格的要求
- 强大的分支管理
#####基本操作#####
- 创建版本库
git init
- 添加文件到版本库,可以反复多次添加
git add
- 提交修改到版本库
git commit
- 查看工作区状态和文件是否被修改
git status
- 查看文件修改内容
git diff
#####版本回退#####
HEAD
指向当前的版本,在各个版本间切换可以使用命令git reset --hard commit_id
- 切换前,可以用
git log
查看提交历史,确定要回退的版本 - 重返未来版本时,可以用
git reflog
查看历史指令,确定要回到哪个未来的版本
#####工作区和暂存区##### 与SVN等不同,Git有一个重要的暂存区的概念
- 工作区:工作目录
- 版本库:工作区的隐藏目录
.git
版本库中存储了很多东西,最重要的称为暂存区(Stage),包含Git自动创建的第一个分支master
,以及指向master
的指针HEAD
。
把大象装到冰箱分三步,文件添加到版本库时候分两步:
- 将文件修改添加到暂存区,
git add
- 暂存区所有内容提交到当前分支,
git commit
#####手贱改错了怎么办#####
- 手贱,改乱了工作区某个文件内容,想直接丢弃工作区的修改
git checkout -- file
,作用是将工作区的内容替换为版本库的内容 - 极其手贱,并添加到暂存区,想丢弃修改,首先
git reset HEAD file
,回到步骤1,再继续操作 - 奇贱无比,已经提交了不合理的修改,参考版本回退的内容
#####远程仓库##### 远程仓库的添加:
- 要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
; - 关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
本地工作完全不需要考虑远程库的存在,没有联网可以干活
有网络的时候,再把本地提交推送一下就完成了同步。
远程仓库的克隆:
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快。
####分支管理####
######分支命令######
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
-
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。用
git log --graph
命令可以看到分支合并图 分支使用策略: 在实际开发中,我们应该按照几个基本原则进行分支管理: -
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
-
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
-
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
Git分支十分强大,在团队开发中应该充分应用。合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,相当于游戏存档,然后去修复bug,修复后,再git stash pop
,回到工作现场。
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作时
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突