Git简介
- 分布式版本控制系统
- 直接记录快照而非差异比较
- 几乎所有的操作都在本地
- Git 保证完整性
图片引自BUNOOB.COM
工作区、暂存区和版本库
- 工作区:就是你在电脑里能看到的目录
- 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git 工作流程
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
如下工作流程图引自BUNOOB.COM:
与工作流相关的GIT命令
安装
- Windows
- https://git-scm.com/download/win
- macOS
- 安装 Xcode Command Line Tools
- 安装homebrew,通过homebrew安装Git
- Linux
- sudo apt-get install git
- 初步配置
- 配置用户信息
- $ git config --global user.name userName
- $ git config --global user.email userName@iflytek.com
- 配置用户信息
操作版本库
- 创建新仓库
- git init
- 克隆已有仓库
- git clone
- 添加到远程仓库
- git remote add origin git@github.com:michaelliao/learngit.git
- 查看远程引用的信息
- git remote -v
- git remote show origin
- 从远程仓库获取更新
- git fetch
- 使用 clone 命令克隆一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写
- git fetch origin:抓取clone之后、或最近一次fetch之后被push到远程的更新
- git fetch命令只下载数据到本地仓库,不会自动合并到工作目录
- git pull
- 已经设置为跟踪远程分支,git pull相当于git fetch + git merge
- git clone命令自动将本地的master分支设置为跟踪远程master分支
- git fetch
- 向远程推送更新
- git push
- git push origin master:将 master 分支推送到 origin 服务器
- 当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效
- 如果有人在你之前推送,你的push请求会被拒绝,必须先拉取以及合并之后才能推送
- git push
基本操作
- 基本快照
- 暂存文件:git add [] [–] …
- 对未跟踪进行跟踪、并加入暂存区
- 将已跟踪文件的修改加入暂存区
- 提交修改:git commit [] [–] …
- git commit
- 默认会启用 shell 的环境变量 $EDITOR 所指定的软件
- git commit -m ‘…’
- 将提交信息与命令放在同一行
- git commit --amend
- 重新提交,覆盖上次提交的信息
- 在push到远程后不要使用这个命令!
- git commit
- git status -s
- 看在你上次提交之后是否有修改
- 比较差异
- git diff [–options] [–] [
…] - 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异
- git diff [–options] --cached [] [–] [
…] - 查看已暂存的将要添加到下次提交里的内容和之间的差异
- 一般情况下想要查看相对于最近一次提交的修改,省略,默认为HEAD
- –staged与–cached相同
- 取消暂存的文件
- git reset HEAD
- 暂存文件:git add [] [–] …
版本回退管理
- 回退指定版本
- 通过git log查看历次的
- 通过git reset --hard 重置
- 查看本地仓库中分支或其他引用信息的历史:git reflog
- 可用于找回已被回退覆盖的
- 快捷用法
- HEAD:当前版本
- HEAD^:上一个版本
- HEAD^^:上上一个版本
- HEAD~10:往上10个版本
分支管理
- 列出、创建或删除分支
- git branch:列出分支
- git branch :创建分支
- git branch -d :删除分支
- 切换分支
- git checkout
- 本质是将HEAD指针指向所指向的提交对象
- 切换并创建分支
- git checkout -b
- 合并分支
- git merge [] […]
- 找到最近的父节点,在当前分支重演之后所做的修改
- 如果成功,自动记录一个新的提交
- git merge --abort
- 合并出现冲突后,可以中断合并过程并尝试回退到合并之前的状态
- 在合并之前,一定要把本地的修改全部提交!
- git merge [] […]
- 储藏工作区
- git stash
- 想要切换分支,但是还不想要提交之前的工作,使用这个命令储藏修改
- 保存所有本地修改后,作为一个stash项加入stash list,将工作目录回复到HEAD提交
- git stash list:列出已储藏内容
- git stash apply []:取出储藏的修改并应用于工作目录,默认取出最近的
- git stash drop []:从stash list移除,默认移除最近的
- git stash pop []:相当于git apply + git drop
- git stash
- 分支策略
- master分支应该非常稳定,仅仅用来发布新版本
- dev分支干活都在dev分支上,到某个版本在把dev分支合并到master上
- 每个人都有自己的分支,时不时地往dev分支上合并
标签管理
- 创建标签
- git tag :用于新建一个标签,默认为HEAD,也可以指定一个commit id
- git tag -a -m “blablabla…”:可以指定标签信息
- git tag:可以查看所有标签
- 操作标签
- git push origin :可以推送一个本地标签
- git push origin --tags:可以推送全部未推送过的本地标签
- git tag -d :可以删除一个本地标签
- git push origin :refs/tags/:可以删除一个远程标签
设置别名
- 设置别名
- git config --global alias.co checkout
- git config --global alias.br branch
- git config --global alias.ci commit
- git config --global alias.st status
- git config --global alias.unstage ‘reset HEAD --’
- git config --global alias.last ‘log -1 HEAD’
- git config --global alias.lg “log --color --graph --pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ --abbrev-commit”
- 其他设置
- git config --global core.quotepath false(不会对0x80以上的字符进行quote。中文显示正常)
图形化GIT客户端
- 总览
- https://git-scm.com/downloads/guis
- SourceTree下载
- https://www.sourcetreeapp.com/