git常用工作流及命令
1. git仓库的结构
首先介绍以下几个术语:
- remote:表示远程仓库
- repository:表示本地仓库
- workspace:表示自己项目的工作区间
- index:暂存区,接下来可以commit
2. 工作流
推荐使用 github flow 的工作模式,即不在主仓库的分支上开发,而是首先 fork 到自己的 workspace 下。每次开发,首先 checkout 一个分支,开发后 commit,并 push 到自己的仓库内,再向主仓库提 MR。
2.1 fork
一般主仓库是组长建立的,保存着所有人开发的代码,为了防止污染导致数据丢失问题,剩下的小组成员需要对主仓库进行 fork,即将其拷贝一份到自己账户下,这样之后的开发工作就可以从自己的仓库开始。
2.2 clone
接下来从自己的仓库进行clone。需要注意的是,一般一个仓库都有多个分支,比如有 master 主分支和 develop 分支,所以 clone 时要找到对应的分支,例如要克隆 develop 分支,使用的命令如下:
git clone -b develop ssh链接
命令中 ssh 链接需要填写自己仓库下的 ssh 链接。
2.3 添加远程仓库
在项目的根目录重新打开 git bash,首先输入 git remote -v 来查看现有的仓库
其中的 origin 表示是自己的远程仓库名称,一个用来 fetch,一个用来 push。接下来需要将组长的主仓库添加进来,使用的命令为:
git remote add upstream 主仓库ssh链接
其中upstream是给主仓库起的名字,这个名字可以是任意的。再次查看当前的远程仓库:
2.4 拉取最新代码
由于主仓库是合并开发,因此其代码进度是最快的,在每次开发前,都需要从主仓库拉取最新的代码,例如要从主仓库拉取 develop 分支的最新代码。这里有两种方式,第一种是使用 git fetch + git merge 的组合方式,好处是可以在 fetch 后查看更新,从而在 merge 的时候更方便的解决潜在的代码冲突;第二种方式是使用 git pull,它会立即拉取远程仓库的更新,并且直接合并到你的本地分支,这种情况下会导致合并后的代码产生大量冲突,解决起来很麻烦。因此推荐使用第一种组合方式。使用的命令为:
git fetch upstream develop
由于我们之前已经在本地拉取了 develop 分支,因此上面的 git fetch 命令是不创建本地新分支的方式,然后使用如下代码查看版本的差异
git log -p develop..upstream/develop
或者
git diff develop
然后使用如下代码进行合并
git merge upstream/develop
需要注意的是,合并过程中可能出现冲突的情况,我们可以对冲突的文件进行编辑。冲突的产生是多个用户同时修改了同一个文件的相同区域的内容。具体会发生冲突的情况和解决方法可以查看git中发生冲突的原因和解决方案。
2.5 开发
通过输入 git branch 可以查看当前处于哪个分支;输入 git branch -a 可以查看所有的本地分支和远程分支;以及可以输入 git status 来查看当前分支和分支的状态。
2.6 新建分支
有了最新的代码,就可以开始着手写代码了。但是需要注意,不要直接在本地的develop分支上直接写,而是要新建一个分支,使用如下命令:
git checkout -b check # (分支名称,随意)
这样我们就新建了一个check分支,且直接切换到其上,上面的代码其实做了两件事:
git branch check # 新建 check 分支
git checkout check # 切换到 check 分支上
2.7 贮藏代码
当你想提交代码时,始终要记得,主仓库内的代码可能还是比你的进展要更快,因此你还需要到主仓库中拉取最新的代码,这里需要你先把当前的进度 commit 到本地暂存区,或者使用 git stash,将代码贮藏来保管当前的进度。使用的命令为:
git stash save "save message"
然后切换到 develop 分支上,还是使用 git fetch 和 git merge 去拉取合并最新的代码。贮藏的代码实际上被储存在一个栈上,越晚贮藏的越接近栈顶,可以使用如下代码查看栈中贮藏的信息:
git stash list
可以看到有三个贮藏,使用如下命令可以将栈顶的贮藏重新应用
git stash apply
如果想应用其中一个更早的贮藏,可以通过名字来指定
git stash apply stash@{2}
如上的命令只会尝试应用贮藏的工作,意味着堆栈上还有它,可以使用如下命令将贮藏从堆栈上移除:
git stash drop stash@{2}
或者可以使用如下代码来应用栈顶的贮藏,并且将其从栈顶弹出
git stash pop
最后记得要将 check 分支合并到本地的 develop 分支上,之后的操作都要在 develop 上进行。使用的命令如下:
git checkout develop
git merge check
2.8 提交和推送
接下来要将代码提交到本地仓库,首先查看代码的状态
git diff # 可以查看到这次的改动内容,按 q 退出
然后使用跟踪所有的文件
git add .
随后提交到暂存区
git commit -m "add a new txt file"
随后就可以推送到自己的远程仓库
git push origin HEAD:分支名称
这里的 HEAD 指的是当前分支,冒号后面指的是要 push 的分支,如果远程仓库没有,则会自动创建该分支
2.9 提MR
在自己的远程仓库内,可以向主仓库提交分支合并请求,一般是自己的 develop 分支合并到主仓库的 develop 分支,如下时 gitlab 的示例:
、
接下来可以增加这次合并请求的描述,加 title 和 description等,之后就可以 submit 提交。
分支合并请求通过后,可以选择将本地的 check 分支删除
git branch -d check
2.10 注意点
如果有项目伙伴因需求更改了项目文件名称或是一些文件夹的名称,需要告知所有在工作中的伙伴停下手中的工作,等待文件名称修改后,push到仓库后,其他伙伴再拉新的代码,再进行工作。