介绍
git(读音/ɡɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,git回报纯一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。但不仅仅是这样,该提交对象还包含作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。
git安装及配置
Linux
sudo yum install git
Mac
// 需先安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
Window
直接从官网下载安装。
git配置
// 因为git是分布式版本控制系统,所以每一个及其都必须自报家门:你的名字和邮箱地址。
git config --global user.name "your name"
git config --global user.email "your email"
git存储
git分区
git存储分为四个部分:
- workspace:工作空间(我们的开发代码目录)
- index:暂存区(.git目录下的index文件)
- repository:本地仓库(通过git clone将远程代码下载到本地,代码库的元数据信息在根目录下的.git目录下)
- remote:远程仓库(比如github、gitlab等远程仓库)
- 工作区 —
git add
—> 暂存区 —git commit
—> 本地仓库 —git push
—> 远程仓库 - 远程仓库 —
git fetch
—> 拉取最新代码至本地仓库,并使用refs/remotes路径下对应分支文件,记录远程分支末端commit_id
—git merge
—> 工作区 - 远程仓库 —
git pull
—> 拉取最新代码至本地仓库,并自动合并代码至工作区,且使用refs/remotes路径下对应分支文件,记录远程分支末端commit_id
git fetch和git pull的区别
git fetch
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。具体操作如下: ```shell // 本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支 git fetch origin master:temp
// 比较远程代码与本地代码的区别 git diff
// 将temp分支合并到本地master分支 git merge temp
// 如果不想保留分支,可以将其删除 git branch -d temp
<a name="19Kq5"></a>
### git pull
git pull是基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD与远程仓库的版本号,然后git fetch获得当前的远程分支的后续版本的数据,然后利用git merge将其与本地分支合并。
**git pull可以认为是git fetch和git merge两个步骤的合并。**
```shell
// 将远端的master分支拉取最新的内容
git fetch origin ,master
// 将拉取的最新内容与当前分支合并
git merge FETCH_HEAD
git pull用法:
// 将远程主机的某个分支,与本地的指定分支合并
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull合并后可能会出现冲突,需要手动解决冲突。
error:Your local changes to the following files would files would be overwritten by merge:Please commit your changes or stash them before you merge.
解决冲突的方式:先将本地的代码暂存。
git stash // 先将本地修改暂存起来
git stash list // 查看保存信息
git pull // 拉取内容
git stash pop // 还原暂存内容
git status
我们可以通过git status查看本地存储情况。
- Changes to be committed:代表被add的文件,被加载到了暂存区。
Changes not staged for commit:代表在当前分支中被修改的文件,还没有被add,存储在工作区。
git内部存储
本地git项目里面的.git目录下的文件如下:
COMMIT_EDITMSG:commit编辑;
- FETCH_HEAD:是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本;
- HEAD:代码库当前分支的指向;
- ORIG_HEAD:针对某些危险操作,git通过记录HEAD指针的上次所在的位置ORIG_HEAD提供了回退的功能。当你发现某些操作失误了,比如错位的reset到一个很早很早的版本,可以使用git reset —hard ORIG_HEAD回退到上一次reset之前;
- config:代码库基本的配置文件;
- description:项目描述;
- hooks:存储git钩子的目录,钩子只在特定时间发生时触发的脚本,比如提交之前和提交之后;
- index:暂存区;
- info:存储git信息的目录;
- objects:存储git各种对象及备用的对象库;
- refs:存储git各种引用的目录,包含分支、远程分支和标签。
commit规范
每次提交,Commit message都包含三个部分:header、body和footer。 ```shell( ): #header