likes
comments
collection
share

git代码分支操作整理

作者站长头像
站长
· 阅读数 2

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

一、项目要创建多少分支

我们的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开发相关文章