1、软件版本的起点:A
需求总是在不断更新的。
上一次产品经理需求0.1的软件版本刚刚完成后,这不又来了新的版本需求0.2,这次一共两个功能点。幸好我们有Git,让并行开发成为可能。拉取Develop分支准备开干!
2、开发的起点:B
两名工程师,两个不同的需求,大师甲和大师乙各自领取一个功能点开干;从Develop拉取属于自己的分支,有单独的分支就不会被干扰:)
3、开发的终点:H
一周不到,两位大师就已经完成了属于自己的功能;从图上看,都有两次代码的提交。大师们各自开发的功能初步看似乎没有啥问题,但是我们的App版本是一个多功能的集合,是否合在一起也会没有问题?这时候大师们把属于自己的分支合入Develop,并删掉自己的工作Branche。编译,运行,Success!
4、预发行的起点:Release 0.2 节点(I)
大师们的能力果然与众不同,合入后没有一点问题,达到提交测试部的标准。新建Release 0.2 分支,代表一个里程碑式的事件。
5、Release 分支Bug宿命
世上没有哪个大师的代码是没有Bug的,大师甲和大师乙也不例外。这不,测试部刚拿到预发行的版本就曝出了2个Bug。
不过没有关系,能够复现的Bug对于我们来说就不是Bug。从Release 0.2拉取Bug修复分支。修好了,继续合进Release 0.2。谁叫Release就是这样的宿命呢。
6、版本发行的终点: M
但愿人长久,Bug不再有。
经过大师们艰苦卓绝的bug修复,终于通过了测试部的测试,也得到了产品经理们的认可,准备提交App Store审核。
Release合入Master分支,打上Tag 0.2,这就是这次的MileStone了。
当然也得记得Release合入Develop,之前这么多的bug也得在Develop上修复修复不是。做好了这些,Release就可以删啦。
7、救火队员一般的HotFix: N
好事多磨!AppStore刚发出去的App, 就有用户反馈Crash! 大师甲和大师乙临危受命!
从Master拉取HotFix分支来搞定它。原来是数组越界!分分钟搞定。完成后合入Master,版本更新为Tag 0.3,代表我们修复了重大问题。编译,运行,没问题,提交App Store等审核。
噢,one more thing, HotFix 也要合入Develop,又多了一个功能点(bug修复)不是。
8、新的轮回开始:P
1-> 7就是一个版本的开发过程中,我们的Git Flow流。到了最后,P和O节点拥有了相同的内容,就像在一开始的A和B那样。
这时候,我看见产品经理又拿着版本需求1.0向我走来......
>>Master : 主分支;主要是稳定的版本分支,正式发布的版本都从Master拉。
>>Develop : 开发分支;更新和变动最频繁的分支,正常情况下开发都是在Develop分支上进行的。
>>Release : 预发行分支;一般来说,代表一个版本的功能全部开发完成后递交测试,测试出Bug后进行修复的分支。
>>Features: 功能分支; 其实Features不是一个分支,而是一个分支文件夹。里面包含了每个程序员开发的功能点。Feature开发完成后合入Develop分支。
>>HotFix : 最希望不会被创建的分支;这个分支的存在是在已经正式上线的版本中,发现了重大Bug进行修复的分支。
HEAD 最近一次 commit
HEAD^ 上次提交
HEAD~100 上一百次提交
命令 |
释义 |
扩展 |
简述 |
git config --global -e |
可将简写添加到配置文件 |
初始操作 |
|
ssh-keygen -t rsa -C "[email protected]" |
创建SSH Key |
|
|
git clone origin [email protected]:lenqieshanren/PG-GIT.git |
克隆远程仓库 |
|
|
git remote add origin [email protected]:lenqieshanren/PG-GIT.git |
将远程仓库和本地关联 |
||
git init |
初始化一个 git 仓库 |
git init xxx: -> 会在 xxx 文件夹下生成 .git |
|
git status |
查看仓库状态 |
-s : 返回变更的文件名及其代码:{ A:本地新增的文件 C:文件的一个拷贝 D:本地删除 M:内容修改 R:文件名变更 T:文件类型变更 U:文件尚未合并,需合并后提交 X:未知类型 ?:未被 git 进行管理,可以使用 add 命令添加,详见 git add } |
基本流程 |
git add [.|-u|-a] |
添加到暂存区 |
. :所有 -u :仅仅将已经被 add 过的文件提交到暂存区 (-update) -A :是前两个参数的集合 (-all) |
|
git commit -m "本次提交的信息" |
将文件提交到本地仓库中 |
|
|
git push -u origin master |
|
-u : 由于仓库是空的,我们第一次提交推送 master 分支,加上此参数,不但将本地master分支推送到远程master分支,还会把本地master分支和远程master分支关联,在以后推送和拉取就会简化命令,只需要 git push origin master 即可
-f : 若文件不重要可以强推,也可以先更新: git pull --rebase origin master |
|
git branch |
查看本地分支 |
-a: 查看远程分支 |
分支切换与合并
|
git push origin --delete <分支名> |
删除远程分支 |
||
git branch -d <分支名> |
删除本地分支 |
||
git checkout develop
git checkout -b develop origin/develop
git checkout {-- |
切换到 develop 分支
在本地创建develop分支切换到develop分支并且检出远程develop分支
丢弃工作区的修改 |
-- |
|
git merge develop |
将develop分支合并到当前分支 |
||
git rebase -i HEAD~2
git rebase master |
: 合并提交 --- 2标识合并两个 : 合并分支, 如果有冲突解决冲突 --> 执行 git add xxx git rebase --continue 无需执行 git commit 如果没有冲突, push 即可 |
rebase 黄金法则: 1.绝不在公共分支上使用, 有没有其他人在这个分支上工作?
|
|
git log |
查看提交历史
示例: git log -p master ..origin/master // 比较本地 master 和远程 master 的区别 |
-p : 查看历史记录以来哪几行被修改 -2 : 查看最近2次的提交 --oneline : 查看历史记录单行显示 --author=“xxxx” : 根据提交作者搜索,字符串或者正则 --grep=“xxxx" : 搜索提交历史,字符串或者正则 --pretty=oneline : 更清楚的单行显示 git log --graph --decorate --pretty=oneline --abbrev-commit —all : 图形化显示 git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit : 更清楚的图形化显示 git log --pretty=format:'%s %C(bold blue)(%an)%Creset' --abbrev-commit : 打印提交 message 和 author |
|
git reflog |
|
|
|
git diff |
查看文件在工作目录与暂存区的差别 |
git diff git diff --cached git diff --cached git diff git diff |
|
git reset --[hard | soft] HEAD^
git reset HEAD
|
版本回退
指定文件回退到最近一次commit
|
--mixed: 不加参数默认, 保留工作目录, 并清空暂存区 --hard :彻底退回某个版本,本地源码变为上一个版本的内容,撤销 commit 中所包含的更改 --soft : 回退到某个版本,只回退 commit 信息,不会 index file 一级,如果还要提交直接 commit 即可
实用: 撤回过去 3 个 commit, 然后新建一个新的 commit --------------------------- git reset HEAD~3 git add . git commit -m "合并提交" git push --force |
|
git rm -r --cached
-------------------------- git rm --cached -------------------------- git rm |
删除文件
-------------------------- 仅删除加入缓存区的文件(add) -------------------------- 当我们需要删除暂存区或者分支上的文件, 同时本地也不需要这个文件了 |
删除远程仓库文件,不删除本地文件,之后 git commit, git push 远程分支, 然后 git status 可以看到对应的文件未被 git 管理(untracked file) -f : 删除缓存区和本地文件 --------------------------
-------------------------- commit->push |
在执行之后的下一次commit会删除远程仓库,谨记! |
git clean |
从工作空间中删除所有没有tracked过的文件
?: git reset --hard 和 git clean -f 是一对好基友, 结合使用, 可以让工作目录回退到最近一次commit 的时候 |
-n : 提示那些文件会被删除, 不会删除文件 -f : 删除当前目录下所有没有被 tracked 过的文件, 它不会删除.gitignore 文件中指定的文件夹和文件, 不管这些有没有被 track 过 -f -xf : 删除所有, 不管它有没有在 .gitignore 中指定 |
|
git fetch origin |
远程获取最新版本到本地,不会merge(合并) |
git fetch origin master //从远程的origin的master主分支上获取最新版本到origin/master分支上 git log -p master.. origin/master//比较本地的master分支和origin/master分支的区别 git merge origin/master //合并 ============或者============> git fetch origin master:test // 从远程仓库获取最新在本地建立 test 分支 git diff test // 将当前分支和 test 进行对比 git merge test // 合并 test 到当前分支 ---------------------------------------- git pull: 相当于 先 git fetch origin 后 git merge , 两步操作 |
更新 |
git pull origin master |
从远程直接更新, 会自动 merge
------------------------ 实际使用中 fetch 比较好 |
||
git stash git stash save git stash pop
git stash apply git stash apply stash@{1} //指定对应stash git stash list
git stash chear git stash drop +名称 git stash show
git stash branch |
:备份当前工作区内容
:读取最近的一次备份并删除 :读取堆栈中的内容应用到当前目录但是不会删除
:显示git栈内所有备份 情况git栈 :清除堆栈中所有内容 :清楚指定名称的stash :查看堆栈中最新保存的stash和当前目录的差异 :从最新的stash创建分支, 解决stash中的内容和当前目录的内容发生冲突的场景 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|