参考
git目录
git简介
在Windows上安装Git
时光机穿梭
git常用命令
git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)【删除或者增加都能被看到,无需新建副本】。
git的诞生
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
集中式vs分布式
集中式的版本控制系统:CVS及SVN
分布式版本控制系统:git
关键词:本地、服务器、中央服务器(远程服务器)
1.都可以在断网的情况下工作?
如果是一家小公司,SVN服务器就在局域网内,SVN的确可以在断网情况下工作。但是对于中大型公司,SVN服务器一般是独立出来的,不在局域网内的,你完成计划的工作内容,需要提交做成一个版本,但是由于版本库是在中央服务器,于是你要等网络联通之后,才可以提交。因此对于SVN服务器不在局域网内的情况下,断网是不可以使用的。
Git版本库在本地,在完成计划的工作内容后,不管是否联网,都不会影响在本地做成一个版本。
2.分布式还是集中式都是存在中央服务器概念?
不是的,Git没有中央服务器。中央服务器SVN是用来做版本控制的。Git的版本控制在本地,所以没有中央服务器一说。而Git要多人合作时,可以选择把自己修改的内容即某一版,推给其他合作者,然后其他合作者将该版本合并到自己的修改里,然后在把自己合并后的新版推给其他合作者,这样10个人的团队,假设,每个人都把自己的修改推给其他人,共推了90次,耗时,耗带宽,不如统一规定把修改推给某台设备,这样只修要推10次。
3. 版本库
Git每次的commit是提交到本地,然后本地记录了自己每次的提交历史记录;而svn的每次commit都是要提交到中央服务器的。那么如果git和svn的许多用户都修改了文件,需要向中央服务器提交新的记录(svn是commit,git是push),此时不是都需要合并所有用户的代码吗,到这的结果都是一样的。 只是说分布式在本地保存了版本记录,用户可以不联网就回溯到历史版本,这个是集中式所没有的。那这样的区别其实在某些场景下是不重要的。
关于代码合并,Git和SVN的合并好像没什么区别。 关于区别,回复的内容首部就说了SVN和Git的最大区别在于版本库或者版本控制的位置在中央服务器还是本地电脑。
总结
- 断网下,Git版本库在本地,所做修改可以提交到本地服务器
- Git无中央服务器,多人合作时,将某一版作为‘中央服务器’,推送合并版本
- Git本地保存版本记录,可以回溯到历史版本。SVN的版本记录保存在中央服务器。
在Windows上安装Git
Git官网
直接下载安装程序,然后按默认选项安装即可。–global参数说明本机的所有仓库都使用此账户。
git config --global user.name "your username"
git config --global user.email "your emali@qq.com"
创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,
每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个版本库
- 创建一个空目录
- git init
- 把文件添加到版本库
readme.txt内容
Git is a version control system.
Git is free software.
mkdir learngit # 创建文件夹
cd learngit # 进入文件夹内
pwd # 输出当前目录
git init # 把这个目录变成Git可以管理的仓库
ls -ah # 显示隐藏文件/夹 如果未见.git文件夹,可用此命令查看
touch readme.txt # 创建文件
git add readme.txt # 将readme.txt文件添加到仓库
git commit -m "wrote a readme.txt" # 提交,""中内容是提交说明【可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。】
touch file1.txt file2.txt file3.txt file4.txt
git add file1.txt file2.txt # 多次add不同的文件
git add file3.txt file3.txt
git commit -m "add file1-4.txt" # commit可以一次提交很多文件
时光机穿梭
readme.txt修改内容如下
Git is a distributed version control system.
Git is free software.
git status # 查看仓库当前状态,是否有文件被修改,未提交等
git diff readme.txt # 查看修改内容
要明白这3个概念,工作区(working tree),暂存区(index /stage),本地仓库(repository)
git跟不同的参数,比较不同的区间的版本。
git diff:是查看working tree与index的差别的。
git diff --cached:是查看index与repository的差别的。
git diff HEAD:是查看working tree和repository的差别的。其中:HEAD代表的是最近的一次commit的信息。
综上所述:git diff 后面跟文件名称是是查看工作区(working tree)与暂存区(index)的差别的。
git diff 比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容;
git diff --cached 比较的是已暂存的将要添加到下次提交里的内容和已经提交的内容之间的差异。
git常用命令
设置账户
git config --global user.name "your username" # 全局用户名
git config --global user.email "your emali@qq.com" # 全局email
mkdir learngit # 创建文件夹
cd learngit # 进入文件夹内
pwd # 输出当前目录
git init # 把这个目录变成Git可以管理的仓库
ls -ah # 显示隐藏文件/夹 如果未见.git文件夹,可用此命令查看
touch readme.txt # 创建文件
git add readme.txt # 将readme.txt文件添加到仓库
git commit -m "wrote a readme.txt" # 提交,""中内容是提交说明
touch file1.txt file2.txt file3.txt file4.txt
git add file1.txt file2.txt # 多次add不同的文件
git add file3.txt file3.txt
git commit -m "add file1-4.txt" # commit可以一次提交很多文件
git status # 查看仓库当前状态,是否有文件被修改,未提交等
vi readme.txt
git diff readme.txt # 查看修改内容
git log # 显示从最近到最远的提交日志
git log --pretty=oneline # 显示commit id(版本号 + 提交说明
git reset --hard HEAD^ # 回退到上一个版本。cat readme.txt # 查看文件内容
git reset --hard ad1c48f # 回退到未回退之前的版本
git reflog # 记录你的每一次命令
git help <verb> # 获取帮助
git <verb> --help # 获取帮助
man git-<verb> # 获取帮助
git help config # 获得 git config 命令的手册
git config --list --show-origin # 查看所有的配置以及它们所在的文件
git config --global core.editor emacs # 使用不同的文本编辑器,例如 Emacs
# Windows 系统上,如果你想要使用别的文本编辑器,那么必须指定可执行文件的完整路径,32位选择32位
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
git config --list # 检查配置信息
git config <key> # 来检查 Git 的某一项配置
git config user.name
git add -h # add选项的快速参考
git clone https://github.com/libgit2/libgit2 # 克隆并新建libgit2目录 默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来
git clone https://github.com/libgit2/libgit2 mylibgit # 指定新的目录名mylibgit
git status -s # 状态简览
git commit -a -m 'added new benchmarks' # -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤 ,有时这个选项会将不需要的文件添加到提交中。
版本回退
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL。
git log # 显示从最近到最远的提交日志
git log --pretty=oneline # 显示commit id(版本号【SHA1计算出来的一个非常大的数字,用十六进制表示】) + 提交说明
git reset --hard HEAD^ # 回退到上一个版本。HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
cat readme.txt # 查看文件内容
git reset --hard ad1c48f # 回退到未回退之前的版本
git reflog # 记录你的每一次命令
工作区和暂存区
工作区(Working Directory)
电脑目录
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,
还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
git add把文件添加进去,实际上就是把文件修改添加到暂存区;
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。