Git 规范
Git 规范
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
commit
分支:master分支,每个任务一个分支(注意.gitignore)
- fix:修复了bug
- docs:只修改了文档
- style:调整代码格式,未修改代码逻辑(比如修改空格、格式化、缺少分号等)
- refactor:代码重构,既没修复bug也没有添加新功能
- perf:性能优化,提高性能的代码更改
- test:添加或修改代码测试
- chore:对构建流程或辅助工具和依赖库(如文档生成等)的更改
1 | --pretty=oneline: commit 信息展示为行 |
add
git add的反向命令git checkout,撤销工作区修改,即把暂存区最新版本转移到工作区。
例如,如果修改了某个文件,但是想回到特定版本,就可以使用如下命令。1
2
3
git log file.java
git checkout hash file.java
git commit的反向命令git reset HEAD,就是把仓库最新版本转移到暂存区。
rm
手动删除文件,然后使用git add <file>
和git rm <file>
效果是一样的。
有时候,发现有不该提交的文件已经提交后,仅仅在.gitignore
中加入忽略是不行的。这个时候需要执行:
1 | git rm -r --cached [被回收的文件] |
去掉已经托管的文件,然后重新提交:
1 | git add . |
注意!git rm -r --cached 文件/文件夹名字
是高危操作,一定要指定文件名不能不写,否则 git rm -r --cached
会删除所有缓存,包括本地未提交的文件。
branch
1 | 切换到旧分支 |
merge
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
1 | 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。 |
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
restore
执行 ADD 后
1 | git restore --staged [file] : 表示从暂存区将文件的状态修改成 unstage 状态。当然,也可以不指定确切的文件 ,例如: |
diff
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:1
git diff 文件名
git diff 时是分为两种情况的:暂存区为空和暂存区不为空。
首先我们明确知道git diff是比较工作区和暂存区的文件的,如果此时暂存区为空,那么稍微有点不同,即:
1 暂存区为空使用git diff:因为此时暂存区为空,此时使用git diff同样也是比较工作区和仓库,即和使用git diff HEAD结果相同
2 暂存区不为空使用git diff:因为此时暂存区不为空,此时使用git diff比较的就是工作区和暂存区
reset: 回退到某个版本
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。
现在,我们要把当前版本append GPL回退到上一个版本,就可以使用git reset
命令:
1 | git reset --hard HEAD^ |
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
git reflog
用来记录你的每一次命令。
现在总结一下:
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset —hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
注意:这里不会保存 add 后的文件。所以要用 stash。
更新 commit 的信息
经常 commit 错误信息。如何修改?分为如下三种情况:
- 刚刚 commit,还没有 push,使用 git commit —amend;
- 刚刚 push,要修改最近一个 push 的commit信息,使用 git commit —amend;
- 修改历史 push 的 commit 信息,使用 git rebase -i HEAD~n【其中的n为记录数】,配合2中的命令
stash: 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
出现一个 bug,但是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
1 | 保存当前分支 dev 的内容 |
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
那怎么在dev分支上修复同样的bug?Git专门提供了一个cherry-pick
命令,让我们能复制一个特定的提交到当前分支
tag
1 | 打标签:git tag 标签名 commitId |
参考
- 廖雪峰的 Git 教程
- 阿里巴巴 Git commit 规范