Git 团队协作和版本控制实践文章 | 青训营

130 阅读5分钟

准备工作

Github 上创建一个私有的仓库,用于实践 git 命令。

image.png

快速开始

克隆下来自己的仓库,这里采用的是 ssh 的方式。

git clone git@github.com:example/git-prac.git

配置自己的名字、邮箱,可以根据需要选择是全局配置还是只在仓库内配置。

# 在本机上进行全局配置
git config --global user.name "zhangsan"
git config --global user.email "zhangsan@gmail.com"
# 在仓库内进行配置
git config user.name "zhangsan"
git config user.email "zhangsan@gmail.com"

在本地修改之后,提交自己的代码。

git add .
git commit -m 'Update README.md'
git push

可以通过git log命令查看提交的历史记录,可以看到刚刚设置的用户名和邮箱都在提交记录中有所体现。这个命令加上--summary参数后,还可以显示每个提交包含的文件创建、重命名、权限更改(chmod)记录。

image.png

掌握了以上几种命令,则可以初步使用 git 来进行版本控制了,然而在实际使用中,仅仅会这些是远远不够的。

克隆仓库

下面补充一些克隆仓库时的其它常见用法:

可以使用 HTTPS 协议的地址来克隆仓库。如果是 public 仓库,一般不需要认证;而如果是 private 仓库,则需要验证身份。从 2021 年 8 月 13 日开始,GitHub 不再接受使用账户密码进行 git 操作的身份验证,需要添加一个 PAT(个人访问令牌)来替代。

git clone https://github.com/example/git-prac.git

可以通过在命令中提供目标目录来指定克隆到本地的位置。例如有时候需要把go的仓库拉取到$GOPATH下。

git clone git@github.com:example/git-prac.git $GOPATH/src/github.com/example/git-prac

默认情况下,git clone会将主分支克隆到本地。但是,如果你只对特定分支感兴趣,可以使用-b选项来克隆指定分支。

git clone -b dev git@github.com:example/git-prac.git

默认情况下,git clone会将整个仓库历史提交记录克隆到本地,对于项目时间很长的仓库来说,体积会非常大。有时候我们只需要最新一次的提交记录,接着开发即可。可以使用--depth选项来指定只克隆最新的几次提交,--depth 1表示只克隆最近的一次提交。

git clone --depth 1 git@github.com:example/git-prac.git

开始开发

在开发过程中,使用不同的分支可以让团队在不影响主要代码流的情况下进行并行开发、测试新功能、修复问题等。通过创建、切换和管理分支,开发团队可以更加灵活地管理项目的不同功能和任务,避免了代码混乱和冲突,提高了协作效率。

以下命令介绍了查看分支、创建分支、切换分支、删除分支等功能的使用。在对分支进行命名时,应该使用有意义的名称,描述分支的目的(例如 feature/add-login-page),避免使用特殊字符和空格,用-连接不同的单词,如果团队有规定,根据项目约定和规范来命名。

# 查看当前分支
git branch
git branch -a
# 创建一个新的分支
git checkout -b <分支名>
# 切换到已有的分支上
git checkout <分支名>
# 删除一个分支
git branch -d <分支名>
# 如果分支未合并,可以这样强制删除它
git branch -D <分支名>

使用 git commit 命令提交代码时,除了使用常见的 git commit -m 命令,也可以根据不同的场景选用以下参数来实现:

使用 -a 参数可以将已跟踪(已添加到版本控制的)的文件自动添加到暂存区并提交,省去了 git add 的步骤。

git commit -a -m "Update"

有时候团队要求一个功能仅用一个 commit 来完成,需要在这个 commit 中书写详细的描述信息,可以用-s参数。

git commit -s

你可以在命令行文本编辑器中编辑整个提交的信息,可以包括:标题、内容、签名。

image.png

有时候提交 commit 之后可能又想到需要添加一些改动,同样的功能不希望再增加一个提交记录了(因为会让 commit log 看起来很乱),此时就需要用到--amend参数。如果没有代码上的修改,仅仅只是需要修改下提交信息,也可以用这种方法。

git add . # 暂存修改
git commit --amend # 将修改追加到上一个提交中

团队协作

假如你花了两周的时间,终于把自己负责的功能开发完成了,然而此时仓库的 main 分支上已经多了二十几个提交,与自己的提交有了很多冲突。通过以下流程来解决冲突,并把自己的更新放在提交树的最前面,以便让大家很清楚地看到你的最新改动。

# 拉取 main 分支上大家的改动
git checkout main
git pull
# 回到自己的分支进行 rebase
git checkout doc/readme
git rebase main

此时 git 提示如下信息:

error: could not apply d37d390... update 2
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".
Could not apply d37d390... update 2

按照提示,我们去有冲突的文件中手动逐一解决冲突,然后在命令行中输入:

git add .
git rebase --continue

此时再查看提交记录,我们的改动已经放在最新的地方,并且已经处理完冲突的部分,可以放心提交到远端去合并了~