在多人协作的项目中,常常使用git来进行版本控制。在使用的过程中还是踩了不少的坑,除了日常使用最常见的git pull、git add、git commit和git push外,还有诸多指令只是知道怎么用,却没有系统的整理和深究原理。常常是遇到问题时解决一下,下次再碰到又忘了,不常用的指令每次也需要查手册。这里对Git的相应命令做一个整理,主要是以下几个方面:
- Git与SVN等版本控制系统的区别
- 工作区、暂存区、版本库的概念
- Git 工作流程
- Git 常用指令
Git与SVN等版本控制系统的区别
Git是一个开源的分布式版本控制系统
- Git是分布式的,没有中央服务器,每个本地电脑就是一个完整的版本库,而SVN是集中式的,要从中央服务器获取版本并且只能在联网状态下工作
- Git的内容是按元数据存储,而SVN是按文件
工作区、暂存区、版本库的概念
工作区:本地电脑上工作的目录
暂存区(stage/index):一般存放在 .git 目录下的 index 文件(.git/index)中
版本库:工作区有一个隐藏目录 .git 就是 Git 的版本库,也称为本地仓库
- 版本库里面包括三个部分:暂存区、master分支目录树和object对象库。使用git add从工作区添加文件到暂存区,使用git commit提交修改到master分支。
- git reset指令一般是用master分支目录树重写暂存区的目录树;git checkout指令是用暂存区的全部或分布文件替换工作区
- HEAD指针实际上是指向分支的(master),而master才是指向提交
Git 工作流程
Git的工作流程主要是在工作区(workspace)、暂存区(index)、本地仓库(Repository)和远程仓库(Remote)之间进行操作,依照流程图了解Git命令的具体行为对Git指令才能有更深的了解,主要涉及到以下几条指令:
注意:这里的本地仓库与暂存区的概念与上图的版本库的概念稍有不同,注意区分
- git add:从工作区添加文件到暂存区
- git commit:将暂存区文件添加到仓库中
- git push:从本地仓库上传到远程仓库并合并
- git fetch:从远程库获取文件但不合并,使用git merge指令进行合并
- git clone:拷贝远程仓库到本地
- git checkout:用缓存区的文件替换工作区的文件(也可以用作切换分支)
- git pull:从远程仓库下载代码并合并
Git 的相关指令
整理了一些git常用的指令
使用配置
# 显示当前的Git配置
$ git config --list
# 设置邮箱和用户名,加--global表示电脑上所有仓库,不加表示这个仓库
$ git config --global user.email "[email protected]"
$ git config --global user.name "My Name"
新建仓库
#将当前目录初始化为一个版本库(仓库)
$ git init
#新建一个目录,将其初始化版本库
$ git init [filename]
查看信息和状态
# 显示分支,未跟踪文件,更改和其他不同,即当前状态
$ git status
# 查看历史提交记录
$ git log
$ git log --oneline 简洁版
# 显示当前分支的最近几次提交
$ git reflog
# 显示暂存区和工作区的差异
$ git diff
# 比较暂存区和版本库差异(暂存区和上一次提交(commit)的差异)
$ git diff --staged
$ git diff --cached
# 显示工作区与当前分支最新commit之间的差异(查看已缓存的与未缓存的所有改动)
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
添加、提交、拉取和推送代码
#将readme.txt从工作区添加到暂存区
$ git add readme.txt
#添加所有文件
$ git add .
#新建一个目录,将其初始化版本库
$ git commit -m "填写修改的部分"
#拉取远程仓库的代码,origin指本地分支,master指远程分支
$ git pull origin master
#推送代码到远程仓库,origin指本地分支,master指远程分支,第一次推送加-u建立两者联系
$ git push -u origin master
#从远程仓库克隆
$ git clone [url]
回退版本
#退回到上一版本,HEAD^^为上上个版本,以此类推
$ git reset --hard HEAD^
#回退到前100个版本
$ git reset --hard HEAD~100
#回退到特定版本号
$ git reset --hard 版本号
撤销修改与删除
#撤销readme.txt在工作区的修改
$ git checkout -- readme.txt
#删除readme.txt这个文件
$ git rm readme.txt
分支管理
# 查看本地分支
$ git branch (标*为当前分支)
# 查看远程分支
$ git branch -r
# 创建新的分支
$ git branch <new_branch>
#创建一个新的分支dev并切换到该分支上
$ git checkout -b dev
#该指令等同于以下两条
$ git branch dev #创建分支dev
$ git checkout dev #切换到dev分支
#合并dev分支到当前分支
$ git merge dev
#禁止Fast forward模式后合并dev,这样删除分支部不会丢掉分支信息
$ git merge –no-ff -m "注释" dev
# 删除分支dev
$ git branch –d dev
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
多人协作
#要查看远程库的信息
$ git remote
#要查看远程库的详细信息
$ git remote –v
#关联远程仓库,添加远程仓库地址
$ git remote add origin url
# 修改远程仓库地址
$ git remote set-url origin url
#创建本地dev分支并关联远程的origin的dev分支
$ git checkout –b dev origin/dev
#######拉取远程文件发生冲突时########
#先将本地修改存储起来
$ git stash
#查看本地保存的信息
$ git stash list
#暂存之后就可以pull拉取最新代码
$ git pull
#还原最后一次暂存的内容同时从堆栈中清除
$ git stash pop
##################################