一、分支管理
1. 解决冲突
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git 就没法很干净的合并它们。此时,我们需要手动打开这些冲突的文件手动解决冲突,解决冲突后重新提交。
下面我们先模拟一个冲突,操作如下:
-
准备新的 dev 分支并修改提交
git switch -c dev
修改 README.md,添加一行文本内容“我是dev分支”。
然后在 dev 分支上提交:
git add README.md git commit -m "update README.md from dev"
-
切换到 master 分支并修改提交
git switch master
也修改 README.md,添加一行文本内容“我是master分支”。
然后在 master 分支上提交:
git add README.md git commit -m "update README.md from master"
-
然后合并 dev 分支
git merge dev
这时你会发现 README.md 文件存在冲突,此时必须手动解决冲突后再提交。
如何手动解决这个冲突呢?
- 在编辑器中打开 README.md 文件以查看并解决冲突的文本。 Git 添加了一组标记来指示冲突文本的实例。
<<<<<<< HEAD
update README.md from master
=======
update README.md from dev
>>>>>>> dev
之间的<<<<<<< =======
文本是冲突文本的目标分支版本。
之间的======= >>>>>>>
文本是冲突文本的源分支版本。
- 编辑文件以解决冲突的文本。 通过删除合并冲突标记,可让 Git 知道已解决冲突。
- 解决所有冲突文本后,运行
git add README.md
以暂存文件。 - 对内容冲突的所有文件重复上述步骤。
2. Bug 分支
Bug 无处不在,每个bug都可以通过创建一个新的临时的分支来进行修复,修复后,合并分支,最后将临时这个分支删除。
当手头工作没有完成时,先把工作现场通过 git stash
一下,然后再去临时新建 bug 分支,修复后,再通过 git stash apply
或 git stash pop
,恢复之前工作现场。
两种恢复方法的区别:
一种方式是使用 git stash apply 恢复,但是恢复后,stash 内容并不删除,若需删除,使用 git stash drop 来手动删除;
另一种方式是用 git stash pop,恢复的同时自动把 stash 内容也删除了。
示例如下:
-
首先确定要在哪个分支上修复 bug 。
假定需要在 master 分支上修复,请先确保 master 分支上有已暂存但未提交的代码,接着执行 git stash 把当前工作现场“储存”起来。
git stash
现在,用 git status 查看工作区,就是干净的(除非存在没有被git管理的文件)。接下来就可以放心地创建分支来修改 bug。
-
从 master 分支创建临时 bug 分支进行修复。
git checkout master git checkout -b issue-1024
然后进行bug修复,修复之后提交:
git add . git commit -m "fix bug 1024"
-
切换到 master 分支,完成合并,最后删除临时 bug 分支。
git checkout master git merge issue-1024 git branch -d issue-1024
-
最后,恢复 master 分支之前“储存”的工作现场,接着继续开发未完成的工作。
git stash pop
3. 分支管理策略
在实际开发中,我们通常按照以下几个基本原则进行分支管理:
- 首先,master 分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活的;
- 干活都在 dev(develop) 分支上,也就是说,dev 分支是不稳定的,到某个时候,比如 1.0 版本发布时,再把 dev 分支合并到 master 上,然后再 master 分支发布 1.0 版本。
4. 多人协作
-
查看远程仓库的信息,用 git remote -v
-
推送本地分支
如果是第一次将本地分支推送到远程仓库,需要执行如下的命令:
git push -u 远程仓库的别名 本地分支名称:远程分支名称
-u
表示把本地分支和远程分支进行关联,远程仓库的别名一般是origin
。如果不是第一次将本地分支推送到远程仓库,需要执行如下命令:
注意:需要切换到要推送到分支后直接 git push 就可以将本地分支推送到远程仓库
git push
-
抓取分支
查看本地和远程的分支,用 git branch -a,然后就可以抓取你想抓取的分支。示例代码如下:
git checkout -b dev origin/dev
最后总结一下,多人协作的工作模式通常是这样的:
- 首先,可以尝试用
git push origin 分支名称
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 拉取并合并;
- 如果合并出现冲突,则解决冲突,并在本地提交;
- 如果没有冲突或解决掉冲突之后,再用
git push origin 分支名称
推送就能成功了。
- 首先,可以尝试用
二、标签管理
标签(tag)是 Git 版本库的一个标记,指向某个 commit 的指针。标签主要用于发布版本的管理,一个版本发布之后,我们就可以使用 git 打上 v1.0、v1.1…这样的标签。
-
打标签
切换到 master 分支上,然后执行如下命令:
git tag -a 标签名 -m "描述说明"
-
推送某个标签到远程
git push 远程仓库名称 标签名