Git 切分支进行代码版本差异化管理
一、写在前面
我有一个 iOS SDK 工程,除了常规的初始化、登录支付等接口,还包含广告相关的接口。这时候想分一个版本出来,要求这个版本移除广告接口。但是因为这个工程还在不断的维护,因此要求后面的更新,需要覆盖原来的版本和分出来的不带广告的版本,这种情况就可以通过 Git 分支来实现。大概思路就是:原来只有一个 main/master 分支,那么包含广告的版本默认为 main 分支,新增一个 remove-ads 分支。在 remove-ads 分支中,删除或注释掉广告接口。当 main 分支有更新时,再同步到 remove-ads 分支。这样就实现了区分,后面的更新也能覆盖两个分支。
二、分支操作
1、查看分支
git branch
查看本地的分支
1 | % git branch |
git branch -r
查看远程仓库的分支
1 | % git branch -r |
git branch -a
查看本地和远程所有分支
1 | % git branch -a |
可以看到,当前仓库的本地和远程仓库都是 master 分支,也就是 main 分支。(注意执行 Git 操作,都是在代码仓库的目录下进行的,Git 仓库下都有一个隐藏文件 .git
)
2、检查状态
git status
检查当前的状态,确保本地和远程的代码一致,以避免潜在的冲突。如果存在未提交的更改,Git 可能会拒绝切换分支。
1 | % git status |
3、本地创建并切换分支
git checkout -b remove-ads
本地创建并切换到 remove-ads 分支。如果你是第一次使用分支,担心操作出问题,可以先压缩备份下代码工程。
1 | % git checkout -b remove-ads |
看星号,说明本地已经成功创建并切换到 remove-ads 分支:
1 | % git branch |
而远程仓库依旧只有 master 分支。
1 | % git branch -r |
4、将本地分支推送到远程仓库
为了在远程仓库上同步这个新分支,并与其他开发者共享,我们需要将它推送到远程仓库。
使用 git push origin remove-ads
会将 remove-ads 分支推送到远程仓库 origin,并创建一个同名的远程分支。
1 | % git push origin remove-ads |
git branch -r
再次查看,remove-ads 分支已经成功推送到远程仓库。
1 | % git branch -r |
5、设置追踪分支(可选)
为了简化后续的操作,可以设置本地分支与远程分支的关联,以便后续使用 git push
和 git pull
时不需要指定远程分支名称。
1 | % git branch --set-upstream-to=origin/remove-ads remove-ads |
如果不设置追踪分支,那么后续对分支执行 git push
和 git pull
操作就需要指定远程仓库分支:
1 | % git push origin remove-ads |
1 | % git pull origin remove-ads |
总的来说,还是设置追踪分支更方便,因为一般情况下,本地仓库和远程仓库会保持一致的分支情况和分支名称。
6、修改分支代码
上面的操作完成后,就可以在本地针对 remove-ads 分支进行代码的修改,例如我当前的需求:删除或注释掉广告接口。修改完毕再同步推送到远程仓库。
1 | % git add . |
推送到远程仓库,注意这里直接使用 git push 是因为前面已经设置了分支追踪。
1 | % git push |
7、切回主分支
git checkout master
切回主分支,可以在主分支上正常开发了,也不影响 remove-ads 分支的代码。
1 | % git checkout master |
8、同步修改到分支
如果在主分支修改了一些公共的代码,需要同步到 remove-ads 子分支。那么需要先切换到子分支,再使用 git merge master
合并主分支的修改。
1 | % git checkout remove-ads |
同样的,本地合并完成后,再推送到远程仓库即可。
1 | % git status |
1 | % git push |
从 Git 可视化工具 Sourcetree 也可以清楚的看到我们的切分支过程:
三、暂存操作
在切换分支的开发中,会遇到这样一种情况:
我正在主分支上进行开发,还未开发完成,因此不想提交代码。但是这时候接到一个需求,要求对 remove-ads 子分支进行修改,并导出 SDK 文件,这时候我需要切换到 remove-ads 分支进行开发。但是主分支代码不体检,Git 是不允许切换分支的。
1 | % git checkout remove-ads |
那么就涉及到 暂存
的操作了。具体如下:
1、将未完成的代码暂存到 stash 中
在 main 分支上,使用 git stash
命令可以将当前未完成的代码暂存起来,不影响切换分支。git stash 会将当前分支上的未提交更改(包括已跟踪的文件和未提交的修改)存入一个临时区域,并恢复上一次提交的状态。
1 | % git stash |
2、切换到 remove-ads 分支进行修改
代码暂存后,可以自由地切换到 remove-ads 分支进行工作。
1 | git checkout remove-ads |
3、切换到 master 分支并恢复未完成的工作
完成 remove-ads 分支的工作后,切换回 master 分支。
1 | git checkout master |
然后使用 git stash pop
恢复之前暂存的代码。该命令会将之前的暂存内容恢复到工作区,同时从 stash 中移除该存储点,如果暂存过程没有冲突,未完成代码将会恢复。
1 | % git stash pop |
4、继续在 master 分支上开发
现在可以继续在 master 分支上完成之前未完成的开发。
需要注意的点:
- 如果
git stash pop
过程中出现冲突,Git 会提示手动解决冲突,解决冲突后再继续开发。 - 如果不想立即应用暂存的内容,可以先使用
git stash list
查看所有暂存点,然后稍后使用git stash apply stash@{n}
来恢复特定的暂存点。
当使用 git stash 时,Git 会将当前的修改保存到一个堆栈(stash stack)中,并按照顺序给这些暂存点编号。每次暂存的内容都会生成一个唯一的标识,如 stash@{0}、stash@{1},依次类推。
- stash@{0} 表示最新的暂存点。
- stash@{1} 表示倒数第二个暂存点,依次类推。
git stash apply stash@{n} 允许你选择应用特定的暂存点,而不仅仅是最新的一个。但是需要注意的是,git stash apply stash@{n} 不会删除暂存点。
1 | % git stash list |