git介绍及基础操作

Git简介

Git[/gIt/]:一个基于C语言开发的开源分布式版本管理系统

举个例子:一个程序每次修改都要保存原来的版本,时间一长修改次数多了,就会记不清楚每次修改了什么,而且往往一个项目会有多个人修改,这样人为管理起来就会很混乱,这时候就可以用Git来记录每次修改。

Git、GitHub和Gitlab区别

  • Git是版本控制管理系统。可以在电脑不联网的情况下,在本地使用的版本管理工具。
  • GitHub是在线基于Git代码的托管服务,相当于一个网站。GitHub可以创建免费的代码仓库(repo),如果需要创建私有的代码仓库,则需要用付费账户。
  • Gitlab和Gitlab相似,可以免费创建私人代码仓库。但是GitHub界面非常美观。

Git和GitHub共同使用来托管自己的代码和笔记,可以在任何有网络的地方拷贝下来自己的代码继续使用

分布式vs集中式

  • 集中式版本控制系统:代表CVSSVN
    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文件夹。我们在文件中指定文件的目录和路径,并且可以使用“*”和“$”通配符
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,882评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,918评论 0 11
  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,511评论 0 13
  • 世界上有许多事会令人爽或不爽,唯有音乐带来的只有快乐,当你不爽时,琴声响起,快乐立刻回归。
    孤石刘琳锋阅读 162评论 0 0
  • 随着傍晚夕阳的余光撒进了那一间简谱的起居室,伴随着年少丫鬟一声尖叫,左右的人聚了过来。 那个他们又怕又尊敬的段姑姑...
    共水阅读 534评论 0 1