一套极简的GIT工作流,帮助开发者在项目中快速开始
快速开始
GIT有三部分:
- 远端的仓库,可以是github,也可以是自建git服务器,称作
remote
- 本地的git仓库,称作
local
- 最后是本地的仓库文件,被称作
disk
假设云端有一个git仓库,有一个主分支main
,我们可以使用命令:
1 | git clone repository-url |
将它克隆到本地。此时remote
、local
和disk
是一样的。
main
分支一般存储了项目最终的版本,而其他分支可以是正在开发中的有新功能的版本。
创建分支
但我们要修改代码时,首先建立一个新的feature branch
也就是分支。
我们不会直接将修改后的代码push
到主分支中,因为这会导致主分支不稳定。另外创建新的分支也有利于多人协作。
所以我们会创建一个新的feature branch
。
使用命令:
1 | git checkout -b my-feature |
其中my-feature
是新分支的名字。此时local
会从当前分支拷贝出一个新的分支。
此时,git会将当前分支checkout
到新分支。
修改代码
当你在新分支上写完代码后,可以使用git diff
命令查看代码的改变,也就是当前分支的disk
和local
的代码有什么区别。
然后使用git add changed-file
将修改的文件添加到暂存区。强烈建议在进行这一步前对代码的更改进行检查。添加后,git就知道现在有一些代码将被commit
。
然后我们可以使用git commit -m 'I am committing'
将添加的文件提交到local
。此时我们的disk
和local
都被更改了。
推送至远程服务器
此时我们需要将代码push
到github或者其他git服务器。我们可以使用命令:
1 | git push origin my-feature |
此时远程服务器将同步local
中的代码,包括新的分支和其更改。
同步分支
一般情况下,当我们在自己的分支对代码进行修改后,主分支也会被其他人更改,产生了新的commit
。因此我们需要在新的主分支上测试我们修改的代码,保证我们的改动在最新的版本上依然有效。因此我们需要将main
分支的更新同步至当前分支也就是my-feature
因此我们首先需要更新local
的main
分支。使用git checkout main
命令将当前分支切换到主分支,此时disk
中的代码将回到最初的main
分支:
然后我们使用命令
1 | git pull origin master |
将remote
的main
分支同步至local
的main
分支。
此时remote
、local
和disk
的主分支将会一致。
分支变基
然后我们使用git checkout my-branch
切换到新分支上。
此时我们使用命令:
1 | git rebase main |
此命令会将当前的主分支变基
到my-feature
中,并尝试在此基础上将my-feature
的commit
放回。
此时可能出现rebase conflict
,此时我们需要手动选择需要的代码。
完成后我们发现,当前分支的修改变成了在最新的main
分支上的修改。一条线路,与merge
相比更加清晰。
推送新分支
然后我们需要将变基后的分支推送到远程服务器。使用命令:
1 | git push -f origin my-feature |
进行推送。由于我们进行了rebase
操作,因此需要添加-f
参数表示强制推送。
合并到主分支
到此,远程的my-feature
分支也被同步,我们就需要将此分支合并到主分支。这个过程被称为pull request
,也就是向此项目的主人提交一个合并到主分支的请求。
然后此项目的维护者将会对提交进行review
等审查后,将对此提交进行Squash and merge
,此操作会将my-feature
的所有commit
合并成一个commit
,这将让主分支的commit
尽可能地保持简洁。并且项目的维护者会将pull request
中的更改合并到主分支中也就是merge
。
删除分支
此时我们就可以将远端的my-feature
直接删除。在github上可以直接点击delete branch
删除分支。
然后远端的my-feature
将会被删除,此时local
和disk
中依然有my-feature
分支,于是我们使用git checkout main
切换到主分支,然后使用命令:
1 | git branch -D my-feature |
以此删除local
中的my-feature
分支。
同步主分支
最后我们使用git pull origin master
将远端当前的主分支同步到local
和disk
中。
此时我们的项目又回到了同步的状态,同时主分支也包含了我们的更新。