前言
- Git是一个快速、可扩展的分布式版本控制系统(Svn是集中式)
- 分布式版本控制的优点
- 没有“中央服务器”,每个人的电脑上都是一个完整的版本库
- 工作的时候不需要联网,因为版本库就在本地,因此可以轻松进行版本管理,而svn服务器挂了或断网时就无法commit
- 存储内容
- svn使用的是增量文件系统(Delta Storage systems)存储每次提交(commit)之间的差异
- Git会记录每次提交的文件的全部内容(snapshot)
基础
常用命令
git clone
git checkcout
git pull
git push
git merge
- 可参考 Git远程操作详解
工作区&暂存区&版本库
- 工作区
- 用户本地coding的目录
- 暂存区
- 英文叫stage, 或index
- 一般存放在 “.git目录下” 下的index文件(.git/index)中
- 版本库
- 工作区有一个隐藏目录.git,这就是Git的版本库
origin的概念
- git为你默认创建的指向这个远程仓库的标签
- 可使用
git remote -v
查看origin具体指向的远程仓库
开发流程
- 克隆仓库
- 默认克隆maser分支
git clone git@github.com:bug1024/jeet-vim.git
- 克隆指定的分支
git clone -b bug_fix git@github.com:bug1024/jeet-vim.git
git clone
支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等
- 默认克隆maser分支
- 检出分支
- 基于当前本地分支创建并切换到develop分支
git checkout -b develop
- 基于远程分支创建并切换到develop分支
git checkout -b develop origin/develop
- 基于当前本地分支创建并切换到develop分支
- 修改代码
- 查看文件状态
git status
- 查看具体的改动
git diff
- 将改动的文件添加到暂存区
- 添加指定的文件
git add 文件1 文件2
- 添加所有改动文件
git add .
`
- 添加指定的文件
- 将暂存区的文件纳入版本库
- 一次commit就是一个版本
git commit
- 一次commit就是一个版本
- 将当前分支同步到远程仓库
git push
git push
的默认行为和gitconfig配置文件中push.default选项相关,参考
- push失败
- 通常是由于远程分支有了新的版本提交
- 直接拉取,会产生额外的merge
git pull
- 拉取远程分支,以此为基础,不会产生额外的merge(推荐)
git pull --rebase
,更多戳我 - 使用
git push -f
可强制推送(慎用)
- 解决冲突
- 查看冲突文件
git status
- 解决冲突,保存文件
- git add & git commit & git push
- 参考 解决冲突
- 查看冲突文件
最佳实践
- 保持本地分支和远程分支名一致
- 保持本地分支和master分支同步,即时常
git merge master
或者git rebase master
,两种方式的区别 - 完善git配置,可参考git配置,这是我的配置文件
- 配置加强的终端,比如oh-my-zsh,可方便的在终端上显示git分支名称,改动状态等
- 使用额外工具,比如tig,MacOS下安装直接
brew install tig
- commit时尽量最小粒度提交,不要将所有改动做一次提交,注释信息中避免只写update,fix bug等,通常提交类型包括
- feature (feature)
- fix (bug fix)
- docs (documentation)
- style (formatting, missing semi colons, …)
- refactor
- test (when adding missing tests)
- chore (maintain)
代码回滚
- 清理工作区中没有被track的文件
git clean -f
- 移除所有没有被追踪的文件或目录
git clean -dfx
- 撤销改动过但未add的文件
git checkout -- 文件1
- 撤销add过但未commit的文件
git reset 文件1
- 回滚某个文件到指定版本
git reset 版本号 文件1
- 回滚版本库到指定版本(不会保留本地改动, soft会保留本地改动)
git reset --hard 版本号
git log
找不回commit时可以使用git reflog
- 合并前3个commit
git rebase -i HEAD~4
其他命令
- checkout指定文件,
git checkout origin/remote_branch_name -- file_path
- 追加最近一次的commit,
git commit --amend
- 删除远程分支,
git push origin :remote_branch_name
- 切换到上一次分支
git checkout -