Git简介
Git[/gIt/]:一个基于C语言开发的开源分布式版本管理系统
举个例子:一个程序每次修改都要保存原来的版本,时间一长修改次数多了,就会记不清楚每次修改了什么,而且往往一个项目会有多个人修改,这样人为管理起来就会很混乱,这时候就可以用Git来记录每次修改。
Git、GitHub和Gitlab区别
- Git是版本控制管理系统。可以在电脑不联网的情况下,在本地使用的版本管理工具。
- GitHub是在线基于Git代码的托管服务,相当于一个网站。GitHub可以创建免费的代码仓库(repo),如果需要创建私有的代码仓库,则需要用付费账户。
- Gitlab和Gitlab相似,可以免费创建私人代码仓库。但是GitHub界面非常美观。
Git和GitHub共同使用来托管自己的代码和笔记,可以在任何有网络的地方拷贝下来自己的代码继续使用
分布式vs集中式
-
集中式版本控制系统:代表
CVS
和SVN
1.必须联网才能工作
2.版本库集中存放在中央服务器,工作是需要先从中央服务器获取最新的版本,之后再进行工作,工作之后再提交到中央服务器
3.中央服务器如果损坏则所有人不能工作 -
分布式版本控制系统
1.可以在不联网的环境下工作
2.每个人的电脑都有一个完整的版本库,一个人的版本库坏了再从其他的复制一个即可,安全性比较高
3.具有强大的分支功能,本地分支功能支持开发者在不同任务之间进行快速切换
Linux安装Git
目前,Git可以再Linux,UNIX,Mac,Windows上面运行
官方网站http://git-scm.com
- 查看是否安装Git
> git 如果没有安装Git系统会给与提示
- yum安装
> yum install git-core
- 源码编译安装
1.Git官网下载所需要的源码包
wget http://mirrors.edge.kernel.org/pub/software/scm/git/..
2.编译安装,依次执行下列命令
tar -zxf git-*.tar.gz
cd git-*.tar.gz
./config
make&make install
版本库(repository)
- 创建版本库,即创建一个新的空目录
> mkdir first-repo 任意一个可以创建文件的目录
> pwd 查看目录所在的路径
/root/app/first-repo
- 初始化仓库,用
git init
命令把目录变成Git可以管理的仓库
> cd /root/app/first-repo
> git init
> ls -a
你会发现有一个`.git`目录,这个就是Git用来跟踪管理版本库的,不要随意修改这个目录下的文件,会破坏仓库
> tree .git
config ------git仓库的配置文件
objects ------所有被追踪的对象
refs ------放置状态信息
-
git config
这个命令可以配置版本库
git config -e:会打开项目的配置文件(作用域最小,只针对当前项目有效)
--global全局,配置的文件针对当前用户
--system系统,配置文件针对了所有用户(作用域最大)
优先级:(如果三个文件同时配置了某个参数)
git config > git config --global > git config --system
作用域越广优先级越低
> git config --global user.name <username> 配置全局用户名
> git config --system user.email <email> 配置系统Email
> git config --list 或者-l查看配置了哪些项目
> git config (--global/--system) --unset <> 取消某个配置项
eg:
> git config --list
user.name=ymd
user.email=1464525869@qq.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
merge.comflictstyle=diff3
> git config --unset merge.comflictstyle
- 一次简单的提交
> touch file1 创建一个新的文件
> git add file1 没有任何显示则成功,文件添加至暂存区
> git commit -m "commit file1 " 文件提交至仓库
-m后面添加本次提交的说明,最好是有意义的
1.jpg
[图片上传中...(3.jpg-7b61eb-1536198146557-0)]
- Git分为了:
工作区:Working Directory
暂存区:Staging Area
版本库:repository
工作区:就是我们自己创建的或者自己电脑上可以看到的就是工作区,比如上面创建的first-repo文件夹就是一个工作目录
版本库,就是我们说的仓库(repo)。工作区下面的隐藏文件.git就是Git版本库,Git可以管理这个目录里的所有文件,每一个文件的添加,修改,删除都可以被跟踪,可以在需要的时候还原到任何历史的时刻。
Git版本库里存储了stage(暂存区),还有Git为我们自动创建的第一个分支master,以及指向master的指针HEAD
-
.gitignore
文件
我们可以创建一个名为.gitignore文件,列出要忽略的文件模式
> cat .gitignore
*.[oa]忽略以.o或者.a结尾的文件
*~ 忽略以~结尾的文件
Git版本管理基础操作
提交分为了两个步骤:
1.git add <file1 file2...>
:将工作区中相关修改的内容那个提交到暂存区,暂存区就相当于缓存区,可以后期更改里面的内容
2.git commit -m <message>
:将暂存区的内容一次性提交到版本库
-
git status
查看当前工作区发生的修改,以及已经被提交到暂存区的修改
输出结果可以分为三段:
被提交的修改(changes to be committed):列出将在下次提交中被
纳入版本库中的、被修改的文件
不会被更新的修改(changed but not updated):列出已经被修改,
但是还没有提交到暂存区中的文件
未被跟踪的文件(untracked files):列出所有的新增文件
--short选项使得输出更加紧凑
-
git diff
比较提交、索引及工作目录
--color:
不加参数的 git diff:
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也
就是修改之后还没有暂存起来的变化内容.
git diff --cached 命令:
已经暂存起来的文件和上次提交时的快照之间的差异,
show diff of staged changes.
(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相
同的).
git diff HEAD命令:
比较 woking directory 和上次提交之间所有的改动.
git diff [version tag]命令:
想看自从某个版本之后都改动了什么
跟 log 命令一样,diff 也可以加上--stat 参数来简化输出.
git diff [branchA] [branchB]命令:
它实际上会返回一个由 A 到 B 的 patch,不是我们想要的结果.
git diff [branchA]…[branchB]命令:
一般我们想要的结果是两个分支分开以后各自的改动都是什么
实际上它是:git diff $(git merge-base [branchA] [branchB])
[branchB]的结果.
-
git log
查看提交记录,显示从近到远的提交日志
[option]:
\-n 部分输出
\--oneline 显示概述信息
\--stat 先是被修改的文件
\--dirstat 显示包含被修改文件的目录
\--shortstat 显示项目中有多少文件被修改,新增,删除了多少文件
\--graph 图形化显示一脚之间的关系
eg:
> git log -n 3 显示最后三次提交
> git log --oneline
> git log --shortstat --oneline
> git log --format=fuller 显示更多详细信息
> git log --graph
-
散列值
上面我们用git log可以看到每个commit都有一串数字,这就是commit id,又叫做散列值。
commit id是用SHA1计算出来的一个数值,用十六进制表示。
commit 9a77f4a693087681ca1845c3eec548f6366c0f91
Author: ymd <1464525869@qq.com>
Date: Tue Aug 14 17:50:22 2018 +0800
git fsck
查看版本库的完整性
-
git reset 版本回退
Git里面有一个HEAD指针,HEAD指针指向master,master指向提交。当我们回退版本时,其实是改变了指针的指向,所以Git版本回退比较快
Git里面用HEAD
表示当前版本,HEAD^
表示上一个版本
HEAD^^
表示上上一个版本,数值太大就可以写成HEAD~n
,比如HEAD~100
3.jpg
如上图所示,third commit是最新一次提交
eg:回退到上一个版本,即second commit、
# git reset --hard HEAD^
回退后再用git log查看,你会发现最新一次提交third commit已经看不
到了,但是如果我们后悔回退了怎么办?
如果我们窗口没有没有关掉还可以找到最新提交的commit id,就可
以回到原third commit版本,可以只取前面的一些数值,只要能够唯一指定即可
eg:最新一次提交的commit id为9a77f4a693087681ca1845c3eec548f6366c0f91
# git reset --hard 9a77f 这样就退到原来那个未来的版本了
(相对于此时的版本second commit,third commit就是未来版本)
HEAD指向的是哪个版本号,当前版本就定位在哪里,同时将工作取得内容恢复到那个版本,所以如果不小心关掉了窗口,查不到未来那个版本commit id,也有办法恢复
git reflog
:记录了每一次命令,以确定要回到未来的版本。
-
撤销修改
git checkout -- <file>
:如果你在工作区改动了某些文件但是又想要撤销修改,只是针对于特定的文件,则可以用这个命令。--必须要加上,否则就是切换分支
git reset HEAD <file>
:撤销暂存区的文件,放回工作区。HEAD表示最新版本
如果commit之后只能够撤回原来的版本了 -
删除文件
工作区的文件删掉之后,工作区和版本库不一样了,git status
就会知道删除了哪些文件
这时候我们就有两种选择:
1.彻底删除文件,git rm
从版本库中删除该文件,并且用git commit
提交
2.误删了文件想要恢复,git checkout -- <file>
注意:恢复文件时,只能恢复版本库最新一次提交的结果
所以,删除之前我们可以预览:
> git rm -r -n --cached 文件/文件夹名称
加上-n,执行命令时,不会删除任何文件,而是展示此命令要删除的文件列表预览
-
储藏
如果有一个紧急需要处理的问题,当前修改的文件又不想提交,可以用stash
命令将这些修改保存在本地,等以后再处理
stash
命令将工作区和暂存区的修改保存在叫做储藏栈(stash)的缓存区
> git stash 将修改存储到储藏栈
git stash list
查看当前栈中储藏了哪些修改内容
> git stash list
stash@{0}: WIP on master: 62e3b2c test
stash@{1}: WIP on master: 62e3b2c test
stash@{2}: WIP on master: 6a00470 change file2 tiwce in the original
stash pop
恢复被储藏的修改
1.恢复位于栈顶的被储藏修改
> git stash pop
2.恢复更早之前的更改
> git stash pop stash@{2}
-
.gitigore忽略非版本控制文件
一般情况下,对于那些自动生成的文件、由编辑器创建的或者临时备份的文件我们希望git能够忽略,就可以手动创建这个.gitigore文件夹。我们在文件中指定文件的目录和路径,并且可以使用“*”和“$”通配符
网友评论