Git常用命令和Git团队使用规范指南
前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
Git是目前世界上最先进的分布式版本控制系统
更新记录
2024年08月25日 - 更新Git视频教程和GitCheatSheet
2020年02月06日 - 更新Git命令学习
2016年04月22日 - 初稿
阅读原文 - https://wsgzao.github.io/post/git/
SVN与Git的最主要的区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git搭建和使用
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
Git服务端
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab
使用Gogs轻松搭建可能比GitLab更好用的Git服务平台 - https://wsgzao.github.io/post/gogs/
1 | #安装git |
管理公钥推荐使用Gitosis
Gitosis - https://github.com/res0nat0r/gitosis
Gitosis配置手记 - http://debugo.com/gitosis/
管理权限推荐使用Gitolite
Gitolite - https://github.com/sitaramc/gitolite
Git客户端
Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的
Git - https://git-scm.com/
TortoiseGit - https://tortoisegit.org/
SourceTree - https://www.sourcetreeapp.com/
1 | #以最基本的Git命令行为例,先下载Git |
Git常用命令
符号约定
<xxx>
自定义内容[xxx]
可选内容[<xxx>]
自定义可选内容
1 | #初始设置 |
- workspace: 本地的工作目录。(记作A)
- index:缓存区域,临时保存本地改动。(记作B)
- local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
- remote repository:远程仓库。(记作D)
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。
1 | #初始化 |
git命令一览
GitCheatSheet文件的下载地址:
百度网盘:
https://pan.baidu.com/s/1pL6ofStf6fOccQ5OVlQPbA?pwd=geek 提取码: geek
GoogleDrive:
https://drive.google.com/drive/folders/1Nde7zcX36fWyFJpeBZDV94EQBRVSdghe?usp=share_link
命令 | 解析 |
---|---|
git init | 初始化本地 git 仓库(创建新仓库) |
git config –global user.name “xxx” | 配置用户名 |
git config –global user.email “xxx@xxx.com“ | 配置邮件 |
git config –global color.ui true | git status 等命令自动着色 |
git config –global –unset http.proxy | remove proxy configuration on git |
git clone git+ssh://git@192.168.53.168/VT.git | clone 远程仓库 |
git status | 查看当前版本状态(是否修改) |
git add xyz | 添加 xyz 文件至 index |
git add . | 增加当前子目录下所有更改过的文件至 index |
git commit -m ‘xxx’ | 提交 |
git commit –amend -m ‘xxx’ | 合并上一次提交(用于反复修改) |
git commit -am ‘xxx’ | 将 add 和 commit 合为一步 |
git rm xxx | 删除 index 中的文件 |
git rm -r * | 递归删除 |
git log | 显示提交日志 |
git log -1 | 显示 1 行日志 -n 为 n 行 |
git log –stat | 显示提交日志及相关变动文件 |
git show dfb02e6xxxx | 显示某个提交的详细内容 |
git show dfb02 | 可只用 commitid 的前几位 |
git show HEAD | 显示 HEAD 提交日志 |
git show HEAD^ | 显示 HEAD 的父(上一个版本)的提交日志 为上两个版本 5 为上 5 个版本 |
git tag | 显示已存在的 tag |
git tag -a v2.0 -m ‘xxx’ | 增加 v2.0 的 tag |
git show v2.0 | 显示 v2.0 的日志及详细内容 |
git log v2.0 | 显示 v2.0 的日志 |
git diff | 显示所有未添加至 index 的变更 |
git diff –cached | 显示所有已添加 index 但还未 commit 的变更 |
git diff HEAD^ | 比较与上一个版本的差异 |
git diff HEAD — ./lib | 比较与 HEAD 版本 lib 目录的差异 |
git diff origin/master..master | 比较远程分支 master 上有本地分支 master 上没有的 |
git diff origin/master..master –stat | 只显示差异的文件,不显示具体内容 |
git remote add origin git+ssh://git@192.168.53.168/VT.git | 增加远程定义(用于 push/pull/fetch) |
git branch | 显示本地分支 |
git branch –contains 50089 | 显示包含提交 50089 的分支 |
git branch -a | 显示所有分支 |
git branch -r | 显示所有原创分支 |
git branch –merged | 显示所有已合并到当前分支的分支 |
git branch –no-merged | 显示所有未合并到当前分支的分支 |
git branch -m master master_copy | 本地分支改名 |
git checkout -b master_copy | 从当前分支创建新分支 master_copy 并检出 |
git checkout -b master master_copy | 上面的完整版 |
git checkout features/performance | 检出已存在的 features/performance 分支 |
git checkout –track hotfixes/BJVEP933 | 检出远程分支 hotfixes/BJVEP933 并创建本地跟踪分支 |
git checkout v2.0 | 检出版本 v2.0 |
git checkout -b devel origin/develop | 从远程分支 develop 创建新本地分支 devel 并检出 |
git checkout — README | 检出 head 版本的 README 文件(可用于修改错误回退) |
git merge origin/master | 合并远程 master 分支至当前分支 |
git cherry-pick ff44785404a8e | 合并提交 ff44785404a8e 的修改 |
git push origin master | 将当前分支 push 到远程 master 分支 |
git push origin :hotfixes/BJVEP933 | 删除远程仓库的 hotfixes/BJVEP933 分支 |
git push –tags | 把所有 tag 推送到远程仓库 |
git fetch | 获取所有远程分支(不更新本地分支,另需 merge) |
git fetch –prune | 获取所有原创分支并清除服务器上已删掉的分支 |
git pull origin master | 获取远程分支 master 并 merge 到当前分支 |
git mv README README2 | 重命名文件 README 为 README2 |
git reset –hard HEAD | 将当前版本重置为 HEAD(通常用于 merge 失败回退) |
git branch -d hotfixes/BJVEP933 | 删除分支 hotfixes/BJVEP933(本分支修改已合并到其他分支) |
git branch -D hotfixes/BJVEP933 | 强制删除分支 hotfixes/BJVEP933 |
git ls-files | 列出 git index 包含的文件 |
git show-branch | 图示当前分支历史 |
git show-branch –all | 图示所有分支历史 |
git whatchanged | 显示提交历史对应的文件修改 |
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 | 撤销提交 dfb02e6e4f2f7b573337763e5c0013802e392818 |
git ls-tree HEAD | 内部命令:显示某个 git 对象 |
git rev-parse v2.0 | 内部命令:显示某个 ref 对于的 SHA1 HASH |
git reflog | 显示所有提交,包括孤立节点 |
git show master@{yesterday} | 显示 master 分支昨天的状态 |
git log –pretty=format:’%h %s’ –graph | 图示提交日志 |
git stash | 暂存当前修改,将所有至为 HEAD 状态 |
git stash list | 查看所有暂存 |
git stash show -p stash@{0} | 参考第一次暂存 |
git stash apply stash@{0} | 应用第一次暂存 |
git grep “delete from” | 文件中搜索文本 “delete from” |
.gitignore
Some common .gitignore configurations
https://gist.github.com/octocat/9257657
1 | # Compiled source # |
如何提交PR
引用kubeasz的帮助文件为例
首先请核对下本地git config配置的用户名和邮箱与你github上的注册用户和邮箱一致,否则即使pull request被接受,贡献者列表中也看不到自己的名字,设置命令:
1 | $ git config --global user.email "you@example.com" |
- 登陆github,在本项目页面点击fork到自己仓库
- clone 自己的仓库到本地:git clone https://github.com/xxx/kubeasz.git
- 在 master 分支添加原始仓库为上游分支:git remote add upstream https://github.com/easzlab/kubeasz.git
- 在本地新建开发分支:git checkout -b dev
- 在开发分支修改代码并提交:git add ., git commit -am ‘xx变更说明’
- 切换至 master 分支,同步原始仓库:git checkout master, git pull upstream master
- 切换至 dev 分支,合并本地 master 分支(已经和原始仓库同步),可能需要解冲突:git checkout dev, git merge master
- 提交本地 dev 分支到自己的远程 dev 仓库:git push origin dev
- 在github自己仓库页面,点击Compare & pull request给原始仓库发 pull request 请求
a. 等待原作者回复(接受/拒绝)
Git使用规范
Git 使用规范流程 - http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
团队中的 Git 实践 - https://ourai.ws/posts/working-with-git-in-team/
构家网 git 团队协作使用规范 v2 - http://wenku.baidu.com/view/e1430d1b7f1922791788e81e
Git使用规范提醒
- 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
- 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
- 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
- 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
- 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
- review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
Git练习
如果线下环境做git练习不便,可以选择开源中国的在线Git命令学习
git exercises: navigate a repository