共计 6043 个字符,预计需要花费 16 分钟才能阅读完成。
开始使用
设置身份
$ git config –global user.name “Your Name”
$ git config –global user.email “email@example.com”
注意 git config 命令的 –global 参数,用了这个参数,表示你这台机器上所有的 Git 仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和 Email 地址,不使用 –global 参数即可。
push 到远程仓库
创建仓库
通过 git init 命令把这个目录变成 Git 可以管理的仓库,会在当前目录下生成一个.git 的目录。
$ git init
添加到暂存区
用命令 git add <file> 告诉 Git,把文件添加到仓库, 可反复多次使用,添加多个文件:
<!– 指定文件 –>
$ git add file2.txt file3.txt
<!– 当前目录全部文件 –>
$ git add .
提交到本地仓库
用命令 git commit -m <message> 告诉 Git,把文件提交到仓库
$ git commit -m “wrote a readme file”
推送到远程仓库
<!– 添加远程仓库需使用如下命令设置,已添加则不需设置 –>
$ git remote add origin <name> <url>
<!– 推送到远程仓库 –>
$ git push <name>
git push -u origin master
常用命令速查
全局配置
git config –global user.name “robbin”
git config –global user.email “fankai@gmail.com”
git config –global color.ui true # 让 Git 显示颜色
git config –global alias.co checkout # 设置别名
git config –global alias.ci commit
git config –global alias.st status
git config –global alias.br branch
git config –global core.editor “mate -w” # 设置 Editor 使用 textmate
git config -l # 列举所有配置
git config –global credential.helper store # 记住帐号密码,不用每次验证
用户的 git 配置文件~/.gitconfig
常用命令
查看、添加、提交、删除、找回,重置修改文件
git help <command> # 显示 command 的 help
git show # 显示某次提交的内容
git show $id
git co — <file> # 抛弃工作区修改
git co . # 抛弃工作区修改
git add <file> # 将工作文件修改提交到本地暂存区
git add . # 将所有修改过的工作文件提交暂存区
git rm <file> # 从版本库中删除文件
git rm <file> –cached # 从版本库中删除文件,但不删除文件
git reset <file> # 从暂存区恢复到工作文件
git reset — . # 从暂存区恢复到工作文件
git reset –hard #
恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
git ci <file>
git ci .
git ci -a # 将 git add, git rm 和 git ci 等操作都合并在一起做
git ci -am “some comments”
git ci –amend # 修改最后一次提交记录
git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
git revert HEAD # 恢复最后一次提交的状态
查看文件 diff
git diff <file> # 比较当前文件和暂存区文件差异
git diff
git diff <$id1> <$id2> # 比较两次提交之间的差异
git diff <branch1>..<branch2> # 在两个分支之间比较
git diff –staged # 比较暂存区和版本库差异
git diff –cached # 比较暂存区和版本库差异
git diff –stat # 仅仅比较统计信息
查看提交记录
git log
git log –graph –pretty=oneline –abbrev-commit
git log <file> # 查看该文件每次提交记录
git log -p <file> # 查看每次详细修改内容的 diff
git log -p -2 # 查看最近两次详细修改内容的 diff
git log –stat # 查看提交统计信息
# tig Mac 上可以使用 tig 代替 diff 和 log,brew install tig
Git 本地分支管理
查看、切换、创建和删除分支
git br -r # 查看远程分支
git br <new_branch> # 创建新的分支
git br -v # 查看各个分支最后提交信息
git br –merged # 查看已经被合并到当前分支的分支
git br –no-merged # 查看尚未被合并到当前分支的分支
git checkout <branch> # 切换到某个分支
git checkout -b <new_branch> # 创建新的分支,并且切换过去
git checkout -b <new_branch> <branch> # 基于 branch 创建新的 new_branch
git checkout $id # 把某次历史提交记录 checkout 出来,但无分支信息,切换到其他分支会自动删除
git checkout $id -b <new_branch> # 把某次历史提交记录 checkout 出来,创建成一个分支
git br -d <branch> # 删除某个分支
git br -D <branch> # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)
分支合并和 rebase
git merge <branch> # 将 branch 分支合并到当前分支
git merge origin/master –no-ff # 不要 Fast-Foward 合并,这样可以生成 merge 提交
git rebase master <branch> # 将 master rebase 到 branch,相当于:
git checkout <branch> && git rebase master && git co master && git merge <branch>
Git 远程分支管理
git pull # 抓取远程仓库所有分支更新并合并到本地
git pull –no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git branch –set-upstream-to=origin/dev dev # 将本地分支与远程分支关联
git fetch origin # 抓取远程仓库更新
git merge origin/master # 将远程主分支合并到本地当前分支
git checkout –track origin/branch # 跟踪某个远程分支创建相应的本地分支
git checkout -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上
git push # push 所有分支
git push origin master # 将本地主分支推到远程主分支
git push -u origin master # 将本地主分支推到远程 (如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch> # 创建远程分支,origin 是远程仓库名
git push origin <local_branch>:<remote_branch> # 创建远程分支
git push origin :<remote_branch> #先删除本地分支 (git br -d <branch>),然后再 push 删除远程分支
Git 补丁管理 (方便在多台机器上开发同步时用)
git diff > ../sync.patch # 生成补丁
git apply ../sync.patch # 打补丁
git apply –check ../sync.patch # 测试补丁能否成功
Git 标签管理
一般发布版本可以采用标签形式来创建里程碑。
注意:标签总是和某个 commit 挂钩。如果这个 commit 既出现在 master 分支,又出现在 dev 分支,那么在这两个分支上都可以看到这个标签。
git tag # 查看所有标签
git tag v1.0.0 # 从当前创建标签
git tag v1.0.0 <commitId> # 从某个 commitId 创建标签
git tag -a v0.1 -m “version 0.1 released” 1094adb # 创建带有说明的标签
git show <tagname> # 查看标签信息
git tag -d v0.1 # 删除标签
git push origin <tagname> # 推送某个标签到远程
git push origin –tags # 推送全部尚未推送到远程的本地标签
# 删除远程分支需要两步:
git tag -d <tagname> # 1. 删除本地标签
git push origin :refs/tags/<tagname> # 2. 删除远程标签
Git 储藏管理
git stash # 暂存
git stash list # 列所有 stash
git stash apply [stashName] # 恢复储藏的内容
git stash drop # 删除储藏区
git stash pop # 恢复并删除储藏内容
git stash clear # 清空储藏区
Git 远程仓库管理
git remote -v # 查看远程服务器地址和仓库名称
git remote show origin # 查看远程服务器仓库状态
git remote add origin git@github:robbin/robbin_site.git # 添加远程仓库地址
git remote set-url origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址 (用于修改远程仓库地址)
git remote rm <repository> # 删除远程仓库
创建远程仓库
git clone –bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@git.csdn.net:~ # 将纯仓库上传到服务器上
mkdir robbin_site.git && cd robbin_site.git && git –bare init # 在服务器创建纯仓库
git remote add origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址
git push -u origin master # 客户端首次提交
git push -u origin develop # 首次将本地 develop 分支提交到远程 develop 分支,并且 track
git remote set-head origin master # 设置远程仓库的 HEAD 指向 master 分支
# 也可以命令设置跟踪远程库和本地库
git branch –set-upstream master origin/master
git branch –set-upstream develop origin/develop
分支模型管理策略
master 分支
master 为主分支,也是用于部署生产环境的分支,确保 master 分支稳定性。
master 分支一般由 develop 以及 hotfix 分支合并而来,任何时候都不能直接修改该分支的代码。
develop 分支
develop 为开发分支,始终保持最新完成以及 bug 修复后的代码。
一般开发的新功能时,创建的 feature 分支都是基于 develop 分支的。
feature 分支
开发新功能时,以 develop 为基础创建 feature 分支。
分支命名: feature/ 开头的为特性分支,命名如: feature/user_module、feature/cart_module。
release 分支
release 为预上线分支,发布提测阶段,会以 release 分支代码为基准提测。
当有一组 feature 开发完成,首先会合并到 develop 分支,进入提测时,会创建 release 分支。如果测试过程中若存在 bug 需要修复,则直接由开发者在 release 分支修复并提交。当测试完成之后,合并 release 分支到 master 和 develop 分支,此时 master 为最新代码,用作上线。
hotfix 分支
分支命名: hotfix/ 开头的为修复分支,它的命名规则与 feature 分支类似。
线上出现紧急问题时,需要及时修复,以 master 分支为基线,创建 hotfix 分支,修复完成后,需要合并到 master 分支和 develop 分支。
其中 master 和 develop 分支为常设分支,远程仓库中也应包含这两个分支;其他的为临时性分支,使用完成后应该删除,也建议不要推送到远程仓库。
具体规范参考:Git 分支管理策略
GIT 提交规范推荐
GIT 提交时的粒度应该是一个小功能点或者一个 bugFix,这样进行恢复操作时能够将影响范围降到最低。
为了方便跟踪工程历史,编写良好的版本发布日志,我们应该编写一个良好的 commit messages。建议采用当前广泛应用的 Angular Git CommitGuidelines 规范。
每次提交,Commit message 可以包括三个部分:Header,Body 和 Footer。
<type>(<scope>): <subject> // header
// 空一行
<body>
// 空一行
<footer>
其中,Header 是必需的,Body 和 Footer 可以省略。不管是哪一个部分,任何一行都不得超过 72 个字符(或 100 个字符),这是为了避免自动换行影响日志查阅。
Header
Header 部分只有一行,包括三个字段:type(必需)、scope(可选)和 subject(必需)。
Type
type 用于说明 commit 的类别,只允许使用下面 7 个标识。
feat:新功能(feature)
fix:修补 bug
docs:文档(documentation)
style:格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
如果 type 为 feat 和 fix,则该 commit 将肯定出现在 ChangeLog 之中。其他情况,如:docs、chore、style、refactor、test,根据实际情况决定是否放入 ChangeLog,建议不放入。
Scope
scope 用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同,本项目建议采用模块区分,如:模版编辑、数据更新。
Subject
subject 是 commit 目的的简短描述,不超过 50 个字符;以动词开头,使用第一人称现在时,比如 change,而不是 changed 或 changes;第一个字母小写,结尾不加句号。
Body
Body 部分是对本次 commit 的详细描述,可以分成多行。
Footer
Footer 部分只用于不兼容变动或关闭 Issue。
参考资料:
Git 官方使用说明
Git 教程 - 廖雪峰