当咱们的同一个项目中开发人员多时,分支也会多,这样一来一个分支操作规范就显得很有必要了。下面是自己对于项目建分支的主意和分支常用的操作收拾

一、项目要创立多少分支

咱们的APP项目代码随着功用需求并行开发、bug修正等不断迭代,一个master分支是远远不够的,那么咱们需求多少分支来管理代码呢? 项目建多少个首要的分支要依据项目状况来决定,首要能够有以下几个分支:

  1. master分支是主分支,这个分支记载着APP版别迭代历史,这个分支咱们只承受分支兼并的更改,这样能使提交记载更明晰;每次打包发布AppStore审核上线后能够打一个版别的tag来标记;一般会设置为只要管理员有权限更改。

  2. feature分支,一般是一个功用需求来临时,有开发人员自行从master切出一个分支。命名能够为feature/yourName/desciption. 需求开发完结 –》 打单需求测验包 –》功用测验没问题了 –》提交merge requestrelease分支(下面会讲到)。

  3. release分支,在确定了最近要上线的一个版别包含的功用之后,从master上切出release分支,命名能够为release-xxxx; 此分支将负责集成测验,由各个feature分支的功用测验完结后提交merge request到此分支;之后对于测验提出的bug或许修正 –》从最新的release分支切出一个分支,改好之后提交merge request再删去分支,这样做在release分支上的提交记载会十分清楚。

  4. hotfix分支是在master分支的线上版别发现bug时,需求切出hotfix分支来修正,命名能够为hotfix/yourName/desciption, 修正并测验通往后,假如是紧迫发布,则在此分支发布审核并由管理员兼并到master,打一个版别标签;假如非紧迫,则能够集成兼并到最近的release分支上。

最终准备发布App Store审核了,要确保假如,咱们能够在提交App Store的构建版别先发布一个testflight包给内部测验人员,没问题之后再发布审核。 iOS运用TestFlight进行内部和外部人员测验

二、在分支中回撤提交内容

git代码分支操作整理
在一个分支中,假如发现中心有提交版别是有问题需求撤回,这个时分咱们该如何去完结呢?为了以后能简略的处理这个问题,咱们先来学习一下git的resetrevert两个操作:

2.1 git reset 指令的效果是重置到某个提交版别, 详细的指令效果如下,是我自己手动测验过的,可信赖!

// git reset 操作首要学习3种类型:--hard、--soft 、--mixed
git reset --hard // 默认操作的是HEAD(当时分支),等价于git reset --hard HEAD 
(1) 在本地更改还没有提交时,这个指令效果是将文件重置到未更改的状况。
(2) 在履行了(add .)但是还没有(comit)时,效果同(1),而且暂存区不会保存这个更改。
(3) 已经履行了(add .)和(comit)时,此刻HEAD自身是未更改状况,所以不起效果。
// 每次履行操作后能够通过git status指令来检查状况
git reset --hard HEAD^ // HEAD^代表上一个版别,^多一个版别就多一个,比方HEAD^代表上上个版别
(1) 效果是会将内容重置到上一次提交的版别,而且丢弃上一次版别之后的更改内容
git reset --soft HEAD^ // 这儿HEAD^不能省掉, 代表上一个版别
(1) 当时没有更改内容时,效果是将分支拉回到上一个版别,而且保存提交的内容在暂存区(便是git add .之后的状况)
(2) 当时有更改内容未提交时, 效果同上,之后再履行git add .后,能够看到这次提交和前次提交的更改在暂存区
git reset --mixed HEAD^ // 这儿HEAD^不能省掉, 代表上一个版别
(1) 效果是将分支拉回到上一个版别,而且将之前提交的内容康复到未提交的状况;假如履行前有未提交内容,则康复后内容和未提交内容都混合在未提交内容里边。

假如是reset时不小心重置过头了,有用的版别被reset了怎么办?

假如咱们履行git reset --hard HEAD^时不小心多加了一个^,
咱们应该这样重置:
1. 首要检查HEAD变更日志
git reflog -3// 这儿之后会呈现一个HEAD变更日志列表(3条)
1536b76 (HEAD -> dev) HEAD@{0}: reset: moving to HEAD^^
f9308d2 HEAD@{1}: commit: 重置测验而提交2
70bffae HEAD@{2}: commit: 重置测验而提交1
2. 依据日志列表来挑选好自己要重置到的版别, 比方HEAD@{2}
 git reset HEAD@{2} // 这条履行后就会把HEAD@{2}版别的更改放置到作业区,咱们从头git add . 和git commit 提交即可

2.2 git revert的效果是回撤某个提交的内容并发生一个新的提交,吊销时假如有抵触的地方,并不会当即发生一个新提交,需求自己改好抵触后,依据git status的提示去履行git revert --continue

git revert HEAD // 生成吊销最近提交的一个新提交
git revert HEAD^ // 生成吊销上上个提交内容的一个新提交
git revert commit_id // 生成吊销commit_id内容的一个新提交
// 下面是一次吊销多个提交,-n代表不生成新的提交,由自己手动提交一次
git revert -n commitid1 commitid2 // 吊销多个提交,不自动生成新提交,需求手动改好后去提交
git revert -n commitid1..commitid2 // 吊销一个区间内的提交,不自动生成提交,区间代表的回撤是从commitid1之后到commitid2之内的提交
// 假如咱们不加-n参数,咱们会发现一次只能回撤多个提交中的最后一个
git revert commitid1..commitid2 
// 这样下来咱们需求在上述履行后,填好commit后,检查当时revert的进展
git status // 检查当时状况,假如还有内容要revert,git会提示要继续履行即:
git revert --continue
// 重复上述步骤,直到全部revert完结,中心有抵触则需求自己处理后履行git revert --continue
// 咱们上述会发现revert提交记载会有多次
  • revert merge commit,当回撤的提交版别遇到了分支兼并状况 revert的提交中包含了分支兼并的提交,咱们直接运用git revert commitid并不能成功,原因是没有标明兼并的两个分支哪个是主线。revert merge commit 操作需求增加 -m 选项,代表这次 revert 的是一个 merge commit, 详细做法如下:
// 先检查兼并提交的信息
git show commitid // 之后会有下面的Merge一行信息
Merge: d94a489 e5f08c4
需求留意的是 -m 选项接收的参数是一个数字,
数字取值为 1 和 2,也便是 Merge 行里边列出来的第一个还是第二个。
1. 咱们这儿当时分支是主线,所以revert操作如下
// 下面操作往后会把兼并分支的内容撤回,假如没有抵触会生成提交,有抵触需求自己手动改好, 然后运转git status看回撤状况需不需求git revert --continue
git revert -m 1 commitid// (这个commitid是兼并提交的id,别错写成主线id了)
2. 假如咱们上面错将1写成了2,则成果会变成什么? 
咱们惊奇的发现当时分支代码变成了2分支中兼并前的代码,这很不妥!
所以咱们应该运用上面所说的git reset来回到本来的版别。
然后进行git revert -m 1 commitid

由上,咱们发现reset与revert的区别首要在于回撤后,revert是将回撤内容作为一个新提交,reset是将当时节点重置到之前节点。

接下来咱们应该很清楚该怎么挑选回撤办法了。

  1. 撤回的commitid及后续都可不要的状况下
  • 假如是已经推送到长途的分支,那么咱们就尽量挑选revert 办法,这样能坚持提交日志连续性。
  • 假如是自己一个人的feature分支,自己不小心提交错了,那么reset也可。
  1. 撤回的commitid后续有正确的提交需求保存的状况下,需求运用revert来完结,办法如上!

三、merge和rebase操作

3.1 当咱们在feature-aaa分支开发完功用后,要兼并到release分支,能够挑选运用git merge:

git checkout release
git pull origin release
git merge feature-a
// 假如有抵触,则处理抵触后再提交,依据git status提示来干!

3.2 git rebase的效果首要如下:

1、假定场景:从 master 拉出分支 feature-arelease-x。那么当 release-x 要兼并 feature-a 的内容时,运用 git merge feature-a;假如在release-x 分支发布前master有一个新的发布提交,此刻, release-x 需求同步 master上的这个提交以坚持同步 ,这个时分能够运用 git rebase master

git rebase master 的效果便是将master分支上自切出分支release-x之后的一切提交刺进到当时分支release-x的提交前面,这相当于将release-x变成随从最新master切出的分支相同。

git代码分支操作整理

feature分支履行git rebase后推送不成功

  1. 假定咱们想删去\交流提交,能够运用如下指令 能够学习vim修正器操作: vi/vim修正器入门
// 1.假定是删去倒数第二个提交
git rebase -i HEAD~2 
// 履行后指令行会进入vim修正器
上下移动光标在指定行,按'dd'即可删去行,然后按esc退出输入:wq退出修正,能够看到操作就完结了
// 2. 假定是交流倒数第二个和倒数第一个提交
git rebase -i HEAD~2
进入vim修正器后,按'dd'删去第一行,移动到下面后按'p'会粘贴到下面,再退出修正操作就完结了
  1. 更多rebase的操作可检查

四、cherry pick 分支中某个特定提交兼并到当时分支

在咱们开发完了多个功用,而且测验、验收也通过了,但是即将要发布的一个版别只包含了其中的几个功用,这个时分,咱们首要会从master分支切出一个release分支来集成发布版别,运用git cherry pick 来将特定的一些提交兼并到release分支。 下面是一个比如:当时是release-v1.0.1, 要挑出的提交是feture-xx上倒数第二个提交e5f08c475e513ec41332a4b99d19d3f212b25c18

git cherry-pick e5f08c475e513ec41332a4b99d19d3f212b25c18
// 1. 假如cherry-pick时有抵触,能够依据git status的提示来操作
// 2.假如是要cherry-pick多个提交时,能够运用区间来完结
git cherry-pick commitid1^.. commitid5

五、 其它几个常用git指令

git config --global user.name dandy // 装备全局用户dandy用于提交信息
git config --global user.email  xxxx@163.com // 装备全局邮箱用于提交信息
cat ~/.gitconfig  // 检查用户装备
git status // 检查当时git下的文件状况
git add . // 将更改的内容增加到暂存区
git commit -m 提交信息 // 将暂存区内容提交一个版别
git commit -a -m 提交信息 // 将更改的内容直接提交一个版别
git tag -a tag1 // 给当时分支增加一个tag1
git tag -l // 当时已有的tag
git tag v0.9 commitid // 给指定的提交commitid增加标签v0.9
git tag -d tag1 // 删去tag1
git remote add origin https://xxxx.git // 将本地git库增加到长途库,这个长途库地址是自己创立到网站上创立的
假如地址关联错了能够修正
git remote set-url origin xxxxx.git // 办法一:设置为新的地址
git remote rm origin // 办法二:移除长途分支关联,后边再关联新的
git branch // 检查本地分支
git branch -r // 检查长途分支
git branch -a // 检查一切分支(包括长途分支和本地分支)
git pull origin branchname// 从长途分支中拉取兼并内容,等同于 fetch + merge
git fetch origin branchName
git merge origin/branchName
git remote -v // 检查关联的长途地址
git push -u origin branchName // 将提交内容推送到长途branchName分支
git push --tags // 将一切tag推送到长途
git branch branchname // 在当时分支新建分支
git checkout branchname // 切换到branchname分支
git branch -m oldName  newName // 本地分支重命名
git branch -d branchname // 删去本地分支
git push origin  : branchName 或许git push origin --delete branchName // 删去长途分支
git remote // 检查长途仓库
git checkout orgin/长途分支名 // 检出一个长途分支
git stash save "储藏补白名" // 将当时作业区的更改储藏
git stash list // 检查当时储藏的内容
git stash apply "stash@{index}" // 将储藏stash@{index}运用的当时作业区
git stash drop "stash@{index}" // 删去储藏stash@{index}
git stash pop "stash@{index}" // 运用储藏stash@{index},并删去储藏
//这儿只是美化 log 的输出,实际运用时能够在 git lg 后边加指令参数,如: git lg -10 显现最近10条提交
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git log -p -- 文件路径 // 检查单个文件的修正记载

六、gitignore规则不生效的处理办法:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

ios 疏忽文件 .gitignore iOS开发相关文章