Git是一种常用的版本控制系统,我们常见的版本控制系统有git和svn。 要知道怎么使用首先要了解它的概念。
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
记住git的常用术语对后续理解git的基本操作有着至关重要的作用
仓库(Repository)
受版本控制的所有文件修订历史的共享数据库
工作空间(WorkSpace)
本地硬盘或Unix 用户帐户上编辑的文件副本
工作树/区(Working tree)
工作区包含了仓库的工作文件。您可以修改和提交更改然后提交到仓库。
索引(index)
索引是暂存区的另一种术语
签入(Checkin)
将新版本签入回仓库
签出(checkout)
从仓库中将文件的最新修订版本复制到工作空间
提交(Commit)
对各自文件的工作副本做了更改,并将这些更改提交到仓库
冲突(Conflict)
多人对同一文件的工作副本进行更改,并将这些更改提交到仓库
合并(Merge)
将某分支上的更改联接到此主干或同为主干的另一个分支
分支(Branch)
从主线上分离开的副本,默认分支叫master
锁(Lock)
获得修改文件的专有权限。
头(HEAD)
头是一个象征性的参考,最常用以指向当前选择的分支。
修订(Revision)
表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。
标记(Tags)
标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
cd ~ 回home
cd ..回退到上一个目录,直接cd进入默认目录
pwd:显示当前所在目录路径
ls(ll): 都是列出当前目录中的所有文件,只不过ll列出的内容更为详细
touch: 新建一个文件
rm :删除一个文件
mkdir:新建一个文件
rm -r :删除一个文件夹,rm -r src删除src目录
mv :移动文件,mv index.
reset: 清屏
history: 查看命令历史
help 帮助
exit 推出
#表示注释
显示文件内容 cat
查看配置,可以查看现在git环境配置
git config -l
查看系统
config git config --system --list
查看当前用户global的配置
git config --global --list
查看当前仓库配置
git config --local --list
设置用户名和邮箱
$ git config --global user.name "guogugo" #名称
$ git config --global user.email [email protected] #邮箱
总之–global为全局配置,不加则为某个项目的特定配置。
添加配置项
git config [--local|--global|--system] section.key value
[--local|--global|--system] #可选的,对应本地,全局,系统不同级别的设置
section.key #区域下的键
value #对应的值
删除配置项
git config [--local|--global|--system] --unset section.key
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
Git基本git的工作流程一般是这样的:
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)操作
图解教程
直接看图理解本地git的提交过程
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
需要用GIT管理的项目的根目录执行(注意自己当前目录的位置):
# 在当前目录新建一个Git代码库
$ git init
执行后项目目录会多出一个.git文件夹,关于版本等信息都在这里面,如果没有看到可以百度怎么查看隐藏文件
使用如下命令,可以把创建目录与仓库一起完成
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout,语法格式如下:
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url]
注意url为https…的地址
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
将untracked状态的文件添加到暂存区,语法格式如下:
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
#直接从暂存区删除文件,工作区则不做出改变
git rm --cached
#如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
git reset HEAD ...
当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
#移除所有未跟踪文件
#一般会加上参数-df,-d表示包含目录,-f表示强制清除。
git clean [options]
#只从stage中删除,保留物理文件
git rm --cached readme.txt
#不但从stage中删除,同时删除物理文件
git rm readme.txt
#把a.txt改名为b.txt
git mv a.txt b.txt
git diff用于显示WorkSpace中的文件和暂存区文件的差异
#查看文件修改后的差异
git diff [files]
-a表示修改之前的文件,+++b表示修改后的文件
#比较暂存区的文件与之前已经提交过的文件
git diff --cached
也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下:
#比较repo与工作空间中的文件差异
git diff HEAD~n
如果仓库中已经存在文件f4.txt,在工作区中对f4修改了,如果想撤销可以使用checkout,签出覆盖
检出命令git checkout是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区
语法:
#用法一
git checkout [-q] [] [--] ...
#用法二
git checkout []
#用法三
git checkout [-m] [[-b]--orphan] ] []
$ git checkout branch
#检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch 指向的树更新暂存区和工作区。
$ git checkout
#汇总显示工作区、暂存区与HEAD的差异。
$ git checkout HEAD
#同上
$ git checkout -- filename
#用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。
$ git checkout branch -- filename
#维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相 应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。
$ git checkout -- . 或写作 git checkout .
#注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的 #修改(相对于暂存区)。相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!
$ git checkout commit_id -- file_name
#如果不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。
通过add只是将文件或目录添加到了index暂存区,使用commit可以实现将暂存区的文件提交到本地仓库。
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区,跳过了add,对新文件无效
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
如果我们提交过后发现有个文件改错了,或者只是想修改提交说明,这时可以对相应文件做出修改,将修改过的文件通过"git add"添加到暂存区,然后执行以下命令:
# 修订提交
git commit --amend
原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象
#撤销上一次的提交
git reset --hard HEAD~1
查看日志与历史
查看提交日志可以使用git log指令,语法格式如下:
#查看提交日志
git log [] [] [[\--] …?]
使用"git add"把更新提交到了暂存区。这时"git status"的输出中提示我们可以通过"git reset HEAD …"把暂存区的更新移出到WorkSpace中
在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,我们使用"HEAD",那么再钱一个版本可以使用"HEAD",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD=HEAD1,HEAD^^=HEAD2)
张果教你用git