Git是什么
Git 是目前世界上最先进的分布式版本控制系统
工作原理
Workspace: 工作区
Index / Stage: 暂存区
Repository: 仓库区(或本地仓库)
Remote: 远程仓库
SVN与Git的最主要的区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后再开始干活,干完后,需要把自己做完的代码推送到中央服务器。集中式版本控制系统是必须联网才能工作。
Git是分布式版本控制系统,每个人的电脑就是一个完整的版本库。工作的时候就不需要联网了,因为版本都是在自己电脑上。既然每个人的电脑上都有一个完整的版本,那么多人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需要把各自的修改推送给对方,就可以互相看到对方的修改了。
如何操作
创建版本库
什么是版本库?版本库又名仓库,英文名 repository,你可以简单的理解为一个目录,这个目录里所有的文件都被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪遍历,或者在将来某个时刻还可以将文件还原。
所以创建一个版本库也非常简单
通过命令git init
把当前目录变成git可以管理的仓库。
git init # 将当前目录初始化git仓库
git add readme.txt # 将readme.txt添加到暂存区
git commit -m "readme.txt" # 把文件提交到仓库
git status # 查看是否还有文件没有提交
git diff readme.txt # 查看readme.txt修改的内容
# 修改提交和提交文件都是 git add 然后 git commit -m ""
git log # 查看历史记录
git log --pretty=online # 查看最近的记录
git reset --hard HEAD^ # 回退到上一个版本
git reset --hard HEAD^^ # 回退到上上一个版本
git reset --hard HEAD~100 # 回退到前100个版本
git reflog # 查看版本号
git reset --herd 6fcfc89 # 回退到6fcfc89版本
理解工作区和暂存区的区别
真实项目流程
- 首先把服务器上的代码克隆下来
git clone [email protected]:xxx/xxx.git
刚刚克隆下来的是master分支,可以通过命令行或者IDE工具查看当前分支
git branch # 查看分支,带星号的是当前分支
C:\Users\xxx>git branch
dev
* dev-1
master
创建分支
git branch xxx # 创建xxx分支
git checkout xxx # 切换到xxx分支
git checkout -b xxx # 创建并切换到xxx分支
切换分支
git checkout 分支名
将所有改动全部添加到要提交的本地库中
git add .
git add xxx # 也可以用 git add 文件名 进行单独文件的提交
将修改提交到本地库
git commit -a -m "提交添加的注释信息"
将本地库的commit推送到远程服务器
git push
使用频率最高的命令
git pull # 拉取服务器上最新的资源
git checkout xxxx # 切换分支,注意:切换分支的时候,如果当前分支有改动没有提交,是不能切换分支的,需要先把改动的内容提交或者放入缓存区
git merge xxx # 合并分支 注意:如果有两个人修改了同一个文件,则会有冲突,可以在IDE工具上先解决当前冲突然后在提交
分支类型
-
master
主分支,有且只有一个 -
release
线上分支,一般为线上版本,线上版本发布后,会将release
分支合并到master
-
develop
开发分支,通常给测试部署环境或者打包的分支,每个人在自己的分支上开发完成后,向develop
分支合并 -
feature
通常是一个功能分支或者个人分支,每个公司的用法不一样,feature
分支一般会很多个,通常merge
完成后会删除。
分支的新建与合并
我们先看一个简单的例子,实际工作中可能会遇到类似的工作流程。
- 开发某个网站
- 为实现某个新的用户需求,创建一个分支
- 在这个分支上开展工作
正在此时,突然有一个很严重的问题需要紧急修补。你将按照如下方式来处理: - 切换到你的线上分支(production branch)
- 为这个紧急任务新建一个分支,并在其中修复它
- 在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支
- 切换回你最初的分支上,继续工作
新建分支
首先,我们假设你正在你的项目上工作,并且在 master 分支上已经有了一些提交
现在,你在解决 #53这个问题。想要新建一个分支并同时切换到那个分支,你可以运行一个带
-b
参数的git checkout
命令
git checkout -b iss53
# 它是下面两条命令的简写
# git branch iss53
# git checkout iss53
你继续在 #53 问题上工作,并且做了一些提交。在此过程中,iss53 分支在不断的向前推进。
vim index.html
git commit -a -m "added a new footer [issue 53]"
现在你接到一个电话,有个紧急问题等待你来解决。有了Git的帮助,你不必把这个紧急问题和iss53的修改混在一起,你也不需要花大力气来还原关于#53问题的修改,然后在添加关于这个紧急问题的修改,最后将这个修改提交到线上分支。你所要做的仅仅是切换回
master
分支。
但是,在你这么做之前,要留意你的工作目录和暂存区里那些还没有被提交的修改,它可能会和你即将切换的分支产生冲突从而阻止Git切换到该分支。最好的方法是,在你切换分支之前,保持好一个干净的状态。有一些方法可以绕过这个问题(即,暂存(stashing)和修补提交(commit amending)),我们会在贮藏与清理中看到关于这个两个命令的介绍。现在,我们假设你已经把你的修改全部都提交了,这是你可以切换回
master
分支了。
git checkout master
这个时候,你的工作目录和你的在开始 #53 问题之前是一模一样的,现在你可以专心修复紧急问题了。请牢记:当你切换分支的时候,Git回重置你的工作目录,使其看起来像回到了你在的那个分支上最后一次提交的样子。Git 会自动添加,删除,修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。
接下来,你要修复这个紧急问题。我们来建立一个hotfix
分支,在该分支上工作直到问题解决:
git checkout -b hotfix
vim index.html
git commit -a -m 'fixed the broken email address'
删除本地和远端分支
git branch -d [branchname] # 删除本地已经合并的分支
git branch -D [branchname] # 有些情况使用 -D
git push origin --delete [branchname] # 删除远程分支
# 在删除远程分支时,本地同名分支并不会被删除,所以还需要单独删除本地同名分支
git fetch -p # 清理本地无效分支(远程已删除但本地没有删除)
Git 分支命名规范
分支 命名 说明
主分支 master 主分支,所有提供给用户使用的正式版本,都在这个主分支上发布的
开发分支 dev 开分支,永远是功能最新最全的分支
功能分支 feature-* 新功能分支,某个功能点正在开发阶段
发布分支 release-* 发布定期要上线的功能
修复分支 bug-* 修复线上代码的bug
开发分支 Dev
Git创建Dev分支命令
git checkout -b dev master
将 Dev 分支发布到 Master 分支命令
git checkout master # 切换到 Master 分支
git merge -no-ff dev # 对Dev分支进行合并
这里稍微解释一下,上一条命令的 -no-ff 参数是什么意思。默认情况下,Git执行"快进式合并"(fast-farward merge),会直接将 Master 分支指向 Dev 分支。
使用-no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演变的清晰,我们希望采用这种做法。
功能分支 Feature
功能分支的名字,可以采用 feature-* 的形式命名
创建一个功能分支
git checkout -b feature-x dev
开发完成后,将功能分支合并到dev分支:
git checkout dev
git merge -no-ff feature-x
删除feature分支
git branch -d feature-x
预发布分支 Release
预发布分支是指在发布正式版本之前(即合并到Master分支之前),我们可能需要有一个预发布的版本进行测试。
预发布分支是从Dev分支上分出来的,预发布结束后,必须合并进Dev和Master分支。
创建一个预发布分支
git checkout -b felease-1.2 dev
确认没有问题后,合并到master分支
git checkout master
git merge -no-ff release-1.2
对合并生成一个新节点,做一个标签
git tag -a 1.2
再合并到dev分支
git checkout dev
git merge -no-ff release-1.2
最后删除预发布
git branch -d release-1.2
修补分支Bug
修补分支,软件正式发布后,难免会出现bug。这时就需要创建一个分支,进行bug修补。
修补bug分支是从Master分支上分出来的。修补结束后,再合并到 Master和Dev分支中。它的命名采用 fixbug-*
创建一个修补的bug分支
git checkout -b fixbug-0.1 master
修补结束后,合并到master分支
git checkout master
git merge -no-ff fixbug-0.1
git tag -a 0.1.1
再合并到dev分支
git checkout dev
git merge -no-ff fixbug-0.1
最后删除
git branch -d fixbug-0.1