Git相关命令以及开发流程

Git在日常的开发工作中常用的命令只有那么几个,而这几个命令掌握起来其实是非常简单的.


Alt text

1. 常用的Git命令

1
git add & git commit -m

这两个命令可以说是Git最最常用的两个命令了,前者是将修改过的文件提交到暂存区,后者是将暂存区的所有文件添加到Git分支中.
这里借用廖雪峰老师关于暂存区和工作区的说明图片:
Alt text
那么当我们执行git add filename时,其实是将修改过的文件从工作区提交到暂存区, git commit -m "description"则是将暂存区中所有的文件添加到Git的当前分支中,并且对本次的提交做一个简短的描述.所以在日常的开发工作中,常常会这样使用:

1
2
3
4
5
git add models.py views.py  # 一次可以add多个文件
git commit -m "[update]更新某models中的字段,并处理views.py中由于该model修改所带来的副作用"
# 开发另一个模块
git add urls.py
git commit -m "[update]修改urls中某接口的正则表达"

通常来讲我们修改了一个文件或者添加了一个功能之后就做一次add以及commit,养成良好的开发习惯.这样做的好处就是在将来如果代码版本需要回滚的话,只会影响到一小部分的代码,而不至于所有的代码都需要审查一遍.


1
git push/pull origin branch_name

git push/pull命令在开发中也会经常用到,从英文单词的字面上也非常好理解:pull将远程分支拉取到本地;push将本地分支推送到远程所对应的分支中.
push命令有时可能会被远程Git服务器所拒绝,原因是远程分支的内容要超前于本地分支,所以这个时候需要先pull一下,然后再push.


1
2
3
git checkout -- filename
git reset HEAD filename
git reset --hard commit_id

git checkout -- filename命令用于丢弃工作区的改动.也就是说当我们修改了某一个文件时,如果想要撤销对这个文件的所有改动,那么就可以使用checkout -- filename命令.
git reset HEAD filename命令用于将取消暂存,什么意思呢?当我们执行git add file命令时,那么这个文件会被放到暂存区中,如果想要取消这个文件的暂存,将其还原到工作区,那么使用这个命令.
git reset --hard commit_id命令用于版本回退,当我们对某一个文件执行了add以及commit -m命令之后,突然隔壁的哥们儿说这个功能不要了.好嘛,那我们就回退喽,那么怎么知道commit_id呢?
使用git log --pretty=oneline命令,会给你列出所有的commit_id以及每次commit我们添加的描述信息.找到想要回退的那个commit_id回退即可.
Alt text
其实上面的这些命令在你敲下git status命令之后都会有提示,Git会根据当前的工作区以及暂存区的情况分别给予提示,提示的英文其实也非常的易读.


冲突处理

当同一段代码被多人或者在多个分支同时修改之后,在进行merge操作时就会产生冲突.
假设在我的master分支上有这样的一个函数:

1
2
3
def test_conflict(self):
self.name = "smart"
return self.name

dev分支上对其进行修改, 修改完成后addcommit:

1
2
3
def test_conflict(self):
self.name = "keyerror"
return self.name

切换到分支master: git checkout master
尝试合并分支: git merge dev
产生了冲突:

1
2
3
自动合并 apps/web_socket/views.py
冲突(内容):合并冲突于 apps/web_socket/views.py # 提示冲突产生于哪个文件
自动合并失败,修正冲突然后提交修正的结果。

此时master分支上的代码是这样的:

1
2
3
4
5
6
7
    def test_conflict(self):
<<<<<<< HEAD
self.name = "smart" # HEAD到===之间的代码是master分支上的代码
=======
self.name = "keyerror" # ===到dev是dev分支上的代码
>>>>>>> dev
return self.name

那么对于一般的文本编辑软件(vim等)来说只需要删除掉某一个分支的代码,留下另一个分支的代码即可.但是这样可能会出错.
PyCharm为我们提供了一整套的Git解决方案,那么以使用PyCharm的工具为例来处理冲突的产生:

  • PyCharm的顶部工作栏中: VCS-->Git-->Reslove Conflicts..
    Alt text
    双击views.py
    Alt text

冲突的处理借助工具就是这样简单.

2. Git团队协作流程

在网上有一张一直很流行的Git开发流程图:
Alt text
很多时候的开发流程基本是按照这样的开发流程进行的.
这里不对上图进行过多的讲解,主要说一下上游优先的代码管理策略
Alt text
master分支开发完成后,首先进行本地测试,然后切换到test分支进行集中的测试,当测试完成后再将该部分更新放入prod分支当中.这样一来能够最大程度上保证代码的稳定性以及本地环境,测试环境和生产环境的完全分离.
此外,分支顺序只能是master-->test-->prod,禁止一切的逆向merge.通常来讲执行上面的分支切换并merge操作的那个人一般是Git的仓库拥有者,只有他有这样的权限去做.
团队成员如果加入到该项目的开发中时:

1
2
3
4
5
6
git pull origin master  # 获取远程主分支
git checkout -b member_dev # 基于master分支创建并切换member_dev分支
# 开发开发开发
git add .
git commit -m "[new_feature]balabala..."
git push origin member_dev # 推送至远程自己的分支,而不是master分支

当团队成员将自己开发的代码推送到远程仓库时,就可以发起一个MergeRequest(或者PullRequest)了.
MergeRequest的本质其实就是一个merge操作,只不过是在远程服务器仓库进行的:
Alt text
这个时候就可以通知管理员对你的代码进行审查了,审查结束后接受该MergeRequest,管理员将远程master分支拉取到本地master分支,再执行master-->test-->prod操作,就将你所提交的代码更新到服务器上面了.

更多关于Git的文章或者教程: