git是程序员日常生活中常用的工具。本人按照平时使用的经验,认为git学习的内容分为两类。一是日常的一些基本用法,网上已经有很多不错的tutorial,如本文最后参考中的链接,本文将记录一些使用频率更高的命令。二是在生产环境中应该一个项目应该有哪些分支来进行管理,从而确保线上项目正常安全运行。
基本用法
1)修改和提交
在将所更改的文件添加到暂存区之前,可以根据如下命令确认有哪些被更新的文件。
1
2
git status #查看状态
git diff #查看变更内容
接下来我们便可以使用add和commit的组合,add命令可以将要上传的文件加入到暂存区,而commit命令是暂存区的文件真正加入新的分支。
1
2
3
git add . #跟踪所有改动过的文件
git add <file> #跟踪指定的文件
git commit -m"commit message" #提交所有更新过的文件
最后使用push命令就可以把本地分支更新到远程分支了
1
git push origin your-branch
2)撤销
这里应该区分开来,两种撤销。1是当我们把一些文件用add命令加入到暂存区但还没有commit的时候,我们可以撤销暂存区中已经添加的一些文件。2是当我们已经commit了之后,这时候只能撤销或者回退commit。
撤销暂存区 从暂存区移除特定文件,但不改变工作目录。它会取消这个文件的缓存,而不覆盖任何更改,即对该文件的修改还是存在于工作目录。
1
git reset <file>
同样的我们也可以使用如下命令撤销暂存区的单个文件,但其也会同样覆盖工作区的文件更改。即在工作目录中的该文件已指向最近一次commit,改commit之后所做的修改都将消失。
1
git checkout -- filename.txt
如果你使用的git版本是大于2.23.0的,则可以直接使用如下命令,其等同于git checkout命令。
1
git restore filename.txt
重设暂存区,匹配最近的一次提交,但工作目录不变。它会取消所有文件的缓存,而不会覆盖任何修改,给你了一个重设缓存快照的机会。
1
git reset
重设暂存区和工作目录,匹配最近的一次提交。除了取消缓存之外,–hard 标记告诉 Git 还要重写所有工作目录中的更改。换句话说:它清除了所有未提交的更改,所以在使用前确定你想扔掉你所有本地的开发。
1
git reset --hard
将当前分支的末端移到
1
git reset <commit>
撤销commit
将当前分支的末端移到
1
git reset --hard <commit>
git revert 命令用来撤销一个已经提交的快照。但是,它是通过搞清楚如何撤销这个提交引入的更改,然后在最后加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交。这避免了Git丢失项目历史,这一点对于你的版本历史和协作的可靠性来说是很重要的。
1
git revert <commit>
3)查看提交历史
1
2
3
git log #查看提交历史
git log -p <file> #查看指定文件的提交历史
git blame <file> #以列表方式查看指定文件的提交历史
4)分支与标签
1
2
3
4
5
6
7
8
git branch #显示所有本地分支
git checkout <branch/tag>
#切换到指定分支或标签
git branch <new-branch> #创建新分支
git branch -d <branch> #删除本地分支
git tag #列出所有本地标签
git tag <tagname> # 基于最新提交创建标签
git tag -d <tagname> #删除标签
5)合并与衍合
1
2
git merge <branch> #合并指定分支到当前分支
git rebase <branch> #衍合指定分支到当前分支
6)远程操作
1
2
3
4
5
6
7
8
9
10
11
12
13
git remote -v #查看远程版本库信息
git remote show <remote>
#查看指定远程版本库信息
git remote add <remote> <url>
#添加远程版本库
git fetch <remote> #从远程库获取代码
git pull <remote> <branch>
#下载代码及快速合并
git push <remote> <branch>
#上传代码及快速合并
git push <remote> :<branch/tag-name>
#删除远程分支或标签
git push --tags #上传所有标签
Git branching Model
首先有master分支和develop分支,这两个分支的生命周期是无限的。master分支大家都不陌生,它应该是一个储存处于可部署状态的最稳定代码的分支。而所有准备release的新更新的代码,不是直接合并到master,而是先合并到develop分支下,若develop分支下的所有代码都已经足够稳定且ready to be released,这时候才适合最终合并至master分支。
为了支持团队间的并行开发,还需要有一些其他分支的支持。而如下三种分支也有其各自的用途。
- Feature branches
- Release branches
- Hotfix branches
Feature branches:必须从develop分支来,并最终合并到develop分支,其一般用于新开发一个新feature时所用,且可能开发时间比较长久。
Release branches:当develop合并到了足够多的feature,足以merge到master生成环境时,这时候可以生成一个release分支,其好处是标记好release版本号,标记新加的一些feature并生成快照。如此一来团队成员可以继续在develop分支上开发新的feature,而这些新feature不会加入到当前的release分支。
Hotfix branches: 顾名思义,hotfix分支是为了快速fix生产环境的bug,其直接基于master分支,而不是develop分支。一旦bug解决,其应该被同时合并至master分支以及develop分支。且master分支需要打上新的tag。
彩蛋
参考
https://github.com/geeeeeeeeek/git-recipes
https://nvie.com/posts/a-successful-git-branching-model/
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html