教程 · 2021年8月16日 0

使用Git进行协作开发(中)

内容目录

[lwptoc]

本文是上一篇 Git 教程(使用Git进行协作开发(上))的后续

高级用法

Git 分支

Git 中的分支非常轻量,他的实质就是一个提交记录的别名,当一个提交下面已经有子提交时,再往这个提交创建新的子提交,一个分支就出来了,就像下面这样。
分支
具体操作如下。

当前提交日志:

$ git log
commit 53531fac563c75bf4aee04f97820f00c3c64da95 (HEAD -> master)
Author: Gardel <sunxinao@hotmail.com>
Date:   Sat Jul 17 14:05:31 2021 +0000

    测试删除文件-删除操作
...

新建分支:

$ git branch dev

什么都没有发生,但是分支已经建立好了,这是因为分支非常轻量,只是在当前提交上打了个标记而已,查看提交日志:

$ git log
commit 53531fac563c75bf4aee04f97820f00c3c64da95 (HEAD -> master, dev)
Author: Gardel <sunxinao@hotmail.com>
Date:   Sat Jul 17 14:05:31 2021 +0000

    测试删除文件-删除操作

可以看到,当前的提交现在不仅在 master 分支上,还在 dev 分支上。当前分支(就是 HEAD 指向的分支)还是在 master 上,需要使用 git checkout dev 切换过去,也可以使用 git checkout -b dev 新建 dev 分支的同时切换到 dev 分支。这时候我们向 master (默认分支)和 dev 分支分别提交一次即可达到效果。

$ echo "production_password" > default.password
$ git add .
$ git commit -m "修改生产环境密码"
$ git checkout dev # 执行完这个,你会看到刚刚修改的文件恢复如初
$ echo "development_password" > default.password
$ git add .
$ git commit -m "修改开发环境密码"

现在你可以使用 git checkout [分支名] 在不同的分支间来回切换,查看不同分支的代码。

合并分支

但是如果 dev 分支现在写了很多东西,有一天要合并到主分支中去要怎么办呢,只要合并就行了呀(虽然说了等于没说,但这条命令就叫合并 merge)。

$ git checkout dev
$ vim a.txt # 如果不会使用 vim 命令的话用普通的文本编辑器就可以
$ git add .
$ git commit -m "修改了很多"
$ git checkout master
$ git merge dev
Auto-merging default.password
CONFLICT (content): Merge conflict in default.password
Automatic merge failed; fix conflicts and then commit the result.

哦不,似乎出了点问题,git merge 提示自动合并失败了,在 default.password 文件中有冲突。这是因为之前我们改动了 default.password 文件中的同一行,git 不知道要保留哪一个,提示我们手动解决问题。(如果只是新增了一行则不会产生冲突,git 会智能地将新增的行添加进去。)

那么让我们打开 default.password 瞧一瞧。

<<<<<<< HEAD
production_password
=======
development_password
>>>>>>> dev

似乎多了些奇怪的东西,其实这个是 git 的冲突标记,出现冲突时 git 会自动在文件中为我们插入这些标记,修改时我们要删除标记并保留我们需要的内容,然后按照提示,需要将文件再次提交。(fix conflicts and then commit the result.)

$ # 将 default.password 的内容修改为 production_password (解决冲突)
$ git add .
$ git commit -m "解决 default.password 的冲突"

解决完后查看记录发现,master 分支的记录中已经包含 dev 分支中的提交了。这样做的实质就是新建一个新的提交,他的父提交记录是两个分支的提交,将他们合并到了一起。

另一种合并方式

在此之前,让我们使用 git reset 回到之前的版本,之后会详细介绍 reset 命令。

$ git checkout master
$ git reset --hard HEAD^
HEAD is now at 27b1c62 修改生产环境密码

除了使用 merge 合并分支外,还可以使用 rebase 命令,它更像是将当前分支与目标分支多出来的部分复制过去再依次提交一遍。

$ git checkout master
$ git rebase dev
First, rewinding head to replay your work on top of it...
Applying: 修改生产环境密码
Using index info to reconstruct a base tree...
M       default.password
Falling back to patching base and 3-way merge...
Auto-merging default.password
CONFLICT (content): Merge conflict in default.password
error: Failed to merge in the changes.
Patch failed at 0001 修改生产环境密码
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

哇,这下子好像出了更严重的问题,让我们一点一点仔细看看,首先是出现冲突,这和 merge 时一样,但是这时却不能解决完冲突的代码直接提交了,提示使用 git add/rm 将修改过的文件标记为已解决,然后用 git rebase --continue 继续合并,或者使用 git rebase --skip 跳过解决冲突,完全使用对方的分支版本,或者使用 git rebase --abort 恢复到 rebase 之前的状态(取消操作)。

也就是说,我们需要先修改冲突的文件,使用 git add/rm 将文件标记为已解决,然后用 git rebase --continue 继续操作。

echo "production_password" > default.password # 解决冲突。如果不会使用命令的话用普通的文本编辑器就可以
$ git add .
$ git rebase --continue
Applying: 修改生产环境密码 # 这里显示的东西因提交时间顺序而异