赞
踩
文章来自https://www.cnblogs.com/best/p/7474442.html
目录
版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。
简单说就是用于管理多人协同开发项目的技术。
没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题。
1)、仓库(Repository)
受版本控制的所有文件修订历史的共享数据库
2)、工作空间(Workspace)
本地硬盘或Unix 用户帐户上编辑的文件副本
3)、工作树/区(Working tree)
工作区中包含了仓库的工作文件。您可以修改的内容和提交更改作为新的提交到仓库。
4)、暂存区(Staging area)
暂存区是工作区用来提交更改(commit)前可以暂存工作区的变化。
5)、索引(Index)
索引是暂存区的另一种术语。
6)、签入(Checkin)
将新版本复制回仓库
7)、签出(Checkout)
从仓库中将文件的最新修订版本复制到工作空间
8)、提交(Commit)
对各自文件的工作副本做了更改,并将这些更改提交到仓库
9)、冲突(Conflict)
多人对同一文件的工作副本进行更改,并将这些更改提交到仓库
10)、合并(Merge)
将某分支上的更改联接到此主干或同为主干的另一个分支
11)、分支(Branch)
从主线上分离开的副本,默认分支叫master
12)、锁(Lock)
获得修改文件的专有权限。
13)、头(HEAD)
头是一个象征性的参考,最常用以指向当前选择的分支。
14)、修订(Revision)
表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。
15)、标记(Tags)
标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。
主流的版本控制器有如下这些:
版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git是目前世界上最先进的分布式版本控制系统。
Git是免费、开源的
最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper
作者:Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰
优点:
缺点:
源码: https://github.com/git/git/
打开 git官网,下载git对应操作系统的版本。
选择安装配置
然后一直next就好了
一直Next默认就好了,如果需要设置就要仔细读一下安装界面上的选项。
安装成功后在开始菜单中会有Git项,菜单下有3个程序:
Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多
与DOS风格的命令有些区别,不习惯可以选择Git CMD
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
点击Create New Repository可以直接创建一个新的仓库。
Linux安装Git:sudo apt-get install git 命令行就可以安装了。
Mac OS安装Git: https://git-scm.com/download/mac,下载双击.pkg安装
~就是home
进入Bash默认位置,注意标题栏
1)、cd : 改变目录。
cd ~ 回Home(windows是当前用户所在目录)
2)、cd . . 回退到上一个目录,直接cd进入默认目录
3)、pwd : 显示当前所在的目录路径。
4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)、mkdir: 新建一个目录,就是新建一个文件夹。
8)、rm -r : 删除一个文件夹, rm -r src 删除src目录, 好像不能用通配符。
9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)、reset 重新初始化终端/清屏。
11)、clear 清屏。
12)、history 查看命令历史。
13)、help 帮助。
14)、exit 退出。
15)、#表示注释
16)、输出与注释
17)、创建文件
- 小于号:命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入
-
- >> 是追加内容
-
- > 是覆盖原有内容
18、显示文件内容 cat
使用git config -l 可以查看现在的git环境详细配置
- 查看不同级别的配置文件:
- #查看系统config
- git config --system --list
-
- #查看当前用户(global)配置
- git config --global --list
-
- #查看当前仓库配置信息
- git config --local --list
在Windows系统中,Git在$HOME目录中查找.gitconfig文件(一般位于C:\Documents and Settings$USER下)
Git相关的配置文件有三个:
1)、 /etc/gitconfig:包含了适用于系统所有用户和所有项目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系统级
2)、~/.gitconfig:只适用于当前登录用户的配置。(Win:C:\Users\Administrator\.gitconfig) --global 全局
3)、位于git项目目录中的.git/config:适用于特定git项目的配置。(Win:C:\gitProject) --local当前项目
注意:对于同一配置项,三个配置文件的优先级是1<2<3
这里可以直接编辑配置文件,通过命令设置后会响应到这里。
当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
- $ git config --global user.name "zhangguo" #名称
- $ git config --global user.email zhangguo@qq.com #邮箱
只需要做一次这个设置,如果你传递了--global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global选项。 总之--global为全局配置,不加为某个项目的特定配置。
1)、添加配置项
- git config [--local|--global|--system] section.key value
- [--local|--global|--system] #可选的,对应本地,全局,系统不同级别的设置,请看2.3.2
- section.key #区域下的键
- value #对应的值
--local 项目级
--global 当前用户级
--system 系统级
例如我们要在student区域下添加一个名称为height值为198的配置项,执行结果如下:
2)、删除配置项
git config [--local|--global|--system] --unset section.key
将系统级的height配置项移除
git config --global color.ui true #打开所有的默认终端着色
git config --global alias.ci commit #别名 ci 是commit的别名
[alias]
co = checkout
ci = commit
st = status
pl = pull
ps = push
dt = difftool
l = log --stat
cp = cherry-pick
ca = commit -a
b = branch
user.name #用户名
user.email #邮箱
core.editor #文本编辑器
merge.tool #差异分析工具
core.paper "less -N" #配置显示方式
color.diff true #diff颜色配置
alias.co checkout #设置别名
git config user.name #获得用户名
git config core.filemode false #忽略修改权限的文件
所有config命令参数
- 语法: git config [<options>]
-
- 文件位置
- --global #use global config file 使用全局配置文件
- --system #use system config file 使用系统配置文件
- --local #use repository config file 使用存储库配置文件
- -f, --file <file> #use given config file 使用给定的配置文件
- --blob <blob-id> #read config from given blob object 从给定的对象中读取配置
-
- 动作
- --get #get value: name [value-regex] 获得值:[值]名[正则表达式]
- --get-all #get all values: key [value-regex] 获得所有值:[值]名[正则表达式]
- --get-regexp #get values for regexp: name-regex [value-regex] 得到的值根据正则
- --get-urlmatch #get value specific for the URL: section[.var] URL 为URL获取特定的值
- --replace-all #replace all matching variables: name value [value_regex] 替换所有匹配的变量:名称值[ value_regex ]
- --add #add a new variable: name value 添加一个新变量:name值
- --unset #remove a variable: name [value-regex] 删除一个变量名[值]:正则表达式
- --unset-all #remove all matches: name [value-regex] 删除所有匹配的正则表达式:名称[值]
- --rename-section #rename section: old-name new-name 重命名部分:旧名称 新名称
- --remove-section #remove a section: name 删除部分:名称
- -l, --list #list all 列出所有
- -e, --edit #open an editor 打开一个编辑器
- --get-color #find the color configured: slot [default] 找到配置的颜色:插槽[默认]
- --get-colorbool #find the color setting: slot [stdout-is-tty] 发现颜色设置:槽[ stdout是TTY ]
-
- 类型
- --bool #value is "true" or "false" 值是“真”或“假”。
- --int #value is decimal number 值是十进制数。
- --bool-or-int #value is --bool or --int 值--布尔或int
- --path #value is a path (file or directory name) 值是路径(文件或目录名)
-
- 其它
- -z, --null #terminate values with NUL byte 终止值与null字节
- --name-only #show variable names only 只显示变量名
- --includes #respect include directives on lookup 尊重包括查找指令
- --show-origin #show origin of config (file, standard input, blob, command line) 显示配置(文件、标准输入、数据块、命令行)的来源

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
本地的三个区域确切的说应该是git仓库中HEAD指向的版本
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
个人认为Git的原理相比别的版本控制器还是复杂一些的,有一份图解教程比较直观:
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
日常使用只要记住下图6个命令:
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
需要用GIT管理的项目的根目录执行:
- # 在当前目录新建一个Git代码库
- $ git init
执行:
结果:
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
当然如果使用如下命令,可以把创建目录与仓库一起完成:
- # 新建一个目录,将其初始化为Git代码库
- $ git init [project-name]
执行命令与运行结果:
另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout,语法格式如下:
- # 克隆一个项目和它的整个代码历史(版本信息)
- $ git clone [url]
执行:
比如我们要从克隆的远程仓库托管在github上,地址为:https://github.com/zhangguo5/SuperPlus.git,这是一个公开的项目
结果:
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add
状态变为Staged
.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified
. 如果使用git rm
移出版本库, 则成为Untracked
文件
Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add
可进入暂存staged
状态, 使用git checkout
则丢弃修改过, 返回到unmodify
状态, 这个git checkout
即从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit
则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify
状态. 执行git reset HEAD filename
取消暂存, 文件状态为Modified
上面说文件有4种状态,通过如下命令可以查看到文件的状态:
- #查看指定文件状态
- git status [filename]
-
- #查看所有文件状态
- git status
结果:
foo.htm文件的状态为untracked(未跟踪),提示通过git add可以暂存
GIT在这一点做得很好,在输出每个文件状态的同时还说明了怎么操作,像上图就有怎么暂存、怎么跟踪文件、怎么取消暂存的说明。
工作区(Working Directory)就是你在电脑里能看到的目录。
版本库(Repository)工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
将untracked状态的文件添加到暂存区,语法格式如下:
- # 添加指定文件到暂存区
- $ git add [file1] [file2] ...
-
- # 添加指定目录到暂存区,包括子目录
- $ git add [dir]
-
- # 添加当前目录的所有文件到暂存区
- $ git add .
执行:
当执行如下命令时,会直接从暂存区删除文件,工作区则不做出改变
- #直接从暂存区删除文件,工作区则不做出改变
- git rm --cached <file>
执行命令
通过重写目录树移除add文件:
- #如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
- git reset HEAD <file>...
当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
示例:把f1.txt文件从暂存区撤回工作区
移除所有未跟踪文件
- #移除所有未跟踪文件
- #一般会加上参数-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 commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 “git rm –cached <file>” 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 “git checkout .” 或者 “git checkout — <file>” 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动。
git diff用于显示WorkSpace中的文件和暂存区文件的差异
用"git status"只能查看对哪些文件做了改动,如果要看改动了什么,可以用:
- #查看文件修改后的差异
- 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] [<commit>] [--] <paths>...
- #用法二
- git checkout [<branch>]
- #用法三
- git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]
<commit>是可选项,如果省略则相当于从暂存区(index)进行检出
- $ 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 表示恢复文件到本地版本库中最新的状态。

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。