参考书籍:《git权威指南》

git初始化

设置git基本参数

通常会在用户home目录下创建文件".gitconfig",以类似配置文件的格式来存放设置。

1、设置用户名及邮箱(在提交时会显示这些信息)

git config --global user.name "kcmetercec"
git config --global user.email "kcmeter.cec@gmail.com"

2、git命令输出中打开颜色显示

git config --global color.ui true

3、git config 命令说明

当仅使用"git config"时,代表对当前版本库".git"下的"config"文件进行配置

当仅使用"git config --global"时,代表对当前用户home目录下的".gitconfig"文件进行配置

当仅使用"git config --system"时,代表对"etc"下的"gitconfig"文件进行配置

如同局部变量和全部变量一样,以上优先级由高到低。

格式为:git config [--global/--system] [section].[key] <value>

当没有<value>参数时,代表读取,反之则为写入。

版本库

1、创建版本库

使用创建版本库命令会在当前目录创建一个".git"文件夹,此文件夹既为版本库。而当前目录则称为工作区,

而后的工作就在工作区下进行操作了。

一般情况下,建议先创建好工作区文件夹后,再进入工作区文件夹进行版本库创建。

git init

#然后准备好工作区,并配置忽略表,进行第一次提交

#为版本库建立备份库git clone --bare [repository] [directory.git]

#为备份库进行路径映射#以后推送就可以git push namegit remote add <name> <url>

2、查找版本库及工作区

#显示版本库的位置
git rev-parse --git-dir
#显示工作区根目录
git rev-parse --show-toplevel
#显示当前目录相对于工作区的目录
git rev-parse --show-prefix
#显示当前目录后退到工作区目录的深度
git rev-parse --show-cdup

git结构

git基本结构

如上图所示为git基本结构,对应上图做基本命令介绍。

工作区:用户实际操作文件的区域

index:暂存区,保存用户文件的信息结构,用于快速比对文件是否修改,类似于文件系统的inode

master:主分支,保存用户提交文件信息结构,用于快速比对文件是否提交,类似于文件系统的inode

HEAD:分支游标,用于表明当前正在操作那个分支

objects:对象库,用于实实在在存放文件内容的区域,类似于文件系统的block

#用于将工作区修改的内容保存到暂存区
git add [file] #清除还没有加入版本库的文件及文件夹git clean -fd
#用于将工作区对应的文件撤回到和暂存区一样的状态,
#也就是相对暂存区新做的修改都会删除
git checkout [file]#将暂存区所记录的文件修改都提交至代码库
git commit
#将暂存区目录树替换为和HEAD指向的目录树一致,但工作区不受影响
git reset HEAD
#删除暂存区的文件,工作区不受影响
git rm --cached [file]#将工作区以及暂存区的文件都恢复为和HEAD指向的分支一致
git checkout HEAD [file]

目录树浏览

1、浏览工作区目录树

使用经典的"ls"指令既可方便浏览

2、浏览暂存区目录树

#依次显示:对象属性 对象类型 对象ID 大小 名称
git ls-tree -l HEAD

3、浏览版本库目录树

#依次显示 对象属性 ID 暂存区编号 名称
git ls-files -s#要想与版本库显示效果一样需要
git write-tree
git ls-tree -l [xxx]
#xxx表示由"git write-tree"输出的ID值的至少前4位

相互比较

有以下辅助命令对上面3个区域进行差异状态查看:

#比较暂存区与工作区文件差异
git diff
#比较工作区与版本库差异
git diff HEAD
#比较暂存区与版本库的差异
git diff --cached#查看文件的提交状态
git status [-s]

git对象库

git中所有的对象都有一个ID,此ID用哈希值来表示独一无二的对象。

通过层层解码ID所对应的内容,最终就可以列出整个提交目录的结构以及用户文件的内容。

#-p 用于输出ID所对应的内容
#-t 用于输出ID对象的类型
git cat-file [-p/-t]

库的克隆

#以下方法将复制整个工作区及版本库到新的文件夹下
git clone [repository] [directory]#以下方法将仅仅复制版本库而不产生工作区
git clone --bare [repository] [directory.git]
git clone --mirror [repository] [directory.git]

在对等工作区模式下,为了避免当前应用区“push”而导致备份区的工作区和版本库不一致,由备份区主动pull。

在克隆仅仅只有版本库情况下,可以在当前应用去使用push

git应用

git reset:重置分支

所谓的重置分支,就是调整分支引用游标,使其指向在历史提交。

但由于仅仅是移动了游标而不是真正删除了内容,所以依然可以在对象库中通过日志系统将其恢复到较新的提交。

注意:工作区中未add的内容将消失!

1、用于重置暂存区

git reset <-q> [<commit>] [--] [path]....
#例如"git reset HEAD [paths]",相当于用当前HEAD 中[paths]状态替换掉暂存区中[paths]的状态

2、重置分支或暂存区

git reset [--soft | --mixed | --hard | --merge |--keep] [-q] [<commit>]

--hard:git reset --hard <commit>

*1.引用指向新提交ID

*2.暂存区和新引用指向目录树一致

*3.工作区的内容和新暂存区一致

--soft:git reset --soft <commit>

*1.引用指向新提交ID

--mixed:git reset --mixed <commit>

*1.引用指向新提交ID

*2.暂存区和新引用指向目录树一致

3、使用reflog挽救错误的重置

也就是将分支引用游标重新指向较新的提交。

#显示对于branch分支的所有日志,可以使用head命令限制输出
git reflog show branch

通过以上命令找到ID,再使用"git reset"命令恢复。

git checkout:检出

主要用于修改HEAD的指向。

1、替换工作区内容

#当省略commit,则由暂存区替换工作区的对应文件。指定后则为提交区替换暂存区和工作区的对应文件
git checkout [-q] [commit] [--] <paths>...

2、切换到分支

git check out [branch]

注意:当”branch“为当前分支的对象ID时,也就是将HEAD移动到了当前分支的以前提交。

那么HEAD就称为进入游离态,暂存区及工作区都会对应更新。如果这个时候更改了工作区并且提交,

那么就会生成一个隐性的分支,当将HEAD又切换到分支头时,且隐形分支有用时,

需要使用"git merge [ID number]"将这个分支合并。

3、切换到新分支

git checkout [-m] [[-b] --orphan] <new_branch> ] [<start_point>]

#切换HEAD到新branch,并且更新暂存区和工作区
git checkout branch#汇总显示工作区、暂存区与HEAD的差异
git checkout#用暂存区对应文件覆盖工作区中的文件
git checkout -- filename#用branch中的文件替换暂存区和工作区的对应文件
git checkout branch --filename#将暂存区所有内容都覆盖到工作区,也就是取消本地所有修改
git checkout .

git stash:保存及恢复

stash仅保存已经被库关联的文件。

#保存工作区及暂存区没有被提交的部分
git stash [save [--patch] [-k|--[no-]keep-index]]  [-q|--quiet] [<message>]
#为保存进度增加说明:git stash save "message.."
#使用"-k"或"--keep-index",在保存进度后不会重置暂存区#显示有哪些进度被保存
git stash list#恢复保存的进度
git stash pop [--index] [<stash>]
#当有"--index",git除了恢复工作区,还会尝试恢复暂存区
#当有"stash"(进度名称),git会恢复指定的stash
#若没有后面两者,则默认恢复最新进度#恢复进度后不删除进度列表
git stash apply [--index] [<stash>]#删除一个存储的进度
git stash drop [<stash>]#删除所有进度
git stash clear#以分支的方式恢复进度
git stash branch <branchname> <stash>

git rm:删除文件

删除文件的两种方式:

1、使用“git rm”从暂存区删除文件,然后使用"git commit"使改动生效

2、使用普通的"rm"指令删除文件,然后使用"git add -u",将工作区改动记录到暂存区中,最后使用"git commit"使改动生效

恢复删除的文件

git checkout HEAD^ -- filename

git mv:移动(重命名)文件

移动文件方式:

git mv file1 file2
git commit -m "mv"

或者

mv file1 file2
git add -A
git commit -m "mv"

git add -i :向导的方式添加文件

git tag:为当前版本建立标记

git tag -m "new tag message" tagname

.gitignore:文件忽略表

通过向.gitignore添加忽略文件列表,可以让git过滤掉很多干扰文件。

cat > .gitignore <<EOF#依次输入忽略文件名,可以使用通配符,最后输入"EOF"退出

最后,就仅有.gitignore会被标记为未版本控制,将此文件提交一次即可。

要将被忽略的文件显示出现,使用:

git status --ignored -s

也通过向.git/info/exclude添加忽略文件,则仅仅对本地库有忽略作用。

也可以通过命令"git config --global core.excludesfile filename",设置全局独享忽略列表

忽略文件规则如下图:

git archive:文件打包

文件打包会默认把.git及忽略文件都排除在打包文件之外。

#将最新版本库打包
git archive -o  latest.zip HEAD#仅打包src和doc目录
git archive -o partial.tar HEAD src doc#基于里程碑v1.0打包,并为打包中的文件添加目录前缀1.0git archive --format=tar --prefix=1.0/v1.0 |gzip > foo-1.0.tar.gz

版本间操作:

git rev-parse:版本表示法

#显示当前分支
git rev-parse --symbolic --branches#显示标记
git rev-parse --symbolic --tags#显示定义的所有引用
git rev-parse --symbolic --glob=refs/*#显示HEAD哈希值
git rev-parse HEAD

git rev-list:版本范围表示法

#列出版本A开始的所有历史提交
git rev-list --oneline A#显示版本D和F开始的所有历史提交
git rev-list --oneline D F#排除D版本及其历史版本提交
#即使D历史版本也与F有关,既然也会排除
git rev-list --oneline ^D F
git rev-list --oneline D..F#排除B和C能够共同访问的历史提交
git rev-list --oneline B...C#排除自身的历史提交
git rev-list --oneline B^@#仅显示自身提交
git rev-list --oneline B^!

git log:浏览日志

#默认以HEAD显示日志,--oneline代表精简输出
git log [--oneline]#分支图显示
git log --graph [--oneline]#显示最近3条日志
git log -3#显示每次提交的具体改动
git log -p #显示变更概要
git log --stat [--oneline ]#显示提交树ID
git log --pretty=raw#显示作者和提交者
git log --pretty=fuller#显示D分支提交
git show D --stat
git cat-file -p D^0

git diff:差异比较

#比较标记B和A
git diff B A#比较工作区和标记A
git diff A#比较暂存区和标记A
git diff --cached A#比较工作区和暂存区
git diff#比较暂存区和HEAD
git diff --cached#比较工作区和HEAD
git diff HEAD#比较文件不能版本差异
git diff <commit1> <commit2> -- <paths>#任意比较两个文件
git diff <path1> <path2>#逐词比较
git diff --word-diff

git blame:文件追溯

#追溯文件
git blame filename#追溯第n行开始的向下m行
git blame -L n,+m filename

git bisect:二分查找

当发现版本有BUG时,二分查找用于通过不断比对找出BUG开始哪个版本。

注意:在使用二分查找前,必须将工作区提交或者撤销修改。

使用步骤:

1、选定一个分支:git checkout master

2、开始查找:git bisect start

3、将当前版本标记为坏提交:git bisect bad

  选定一个版本标记为好提交:git bisect good

此时,git会自动切换版本到好提交和坏提交之间的一个版本

4、检查当前版本是否有BUG,有BUG则再次定义为坏提交,无BUG则定义为好提交。git又会自动切换。

5、重复步骤4,最终定位的坏提交引用refs/bisect/bad标识,然后切换过去:git checkout bisect/bad

6、当修复bug后,撤销二分查找:git bisect reset,git会自动切换回二分查找之前的版本库

当好版本和坏版本标记错误时:

#1、保存二分查找日志到文件
git bisect log > logfile#2、删除日志文件记录错误的行#3、结束当前二分查找
git bisect reset#4、通过日志恢复进度
git bisect replay logfile#5、重新标记

自动化二分查找

可以将查找命令写入脚本文件,自动检测出BUG版本。

若脚本退出码是0,则代表好版本。

若脚本退出码是125,则代表跳过此版本

若脚本退出码是1~127(125除外),则代表为坏版本。

使用步骤如下:

1、编写查询BUG版本

2、规定好版本和坏版本范围:git bisect start [commit 1] [commit2]

3、启动自动化测试: git bisect run sh file.sh

4、最终定位的坏提交引用refs/bisect/bad标识,然后切换过去:git checkout bisect/bad

5、当修复bug后,撤销二分查找:git bisect reset,git会自动切换回二分查找之前的版本库

获取历史版本

对历史操作

对历史的操作也仅仅是看起来改变了历史,实际上所有的一切依然都记录在日志中,

在本质上也是一个新提交而已。

重新修改上次提交说明

git commit --amend -m "msg"

将多个历史提交修改为一个

1、使用git reset --soft HEAD^n 回滚n个提交,(此回滚仅仅移动引用,暂存区和工作区不变)

2、使用git commit -m "msg"合并n个提交

git tag:创建标记

显示标记

#显示当前版本库的标记列表
git tag -n<num>#<num>代表每个tag说明最多显示num行#显示当前分支下的标记及详情
git log <--oneline> --decorate

git describe <--dirty>#以易读的方式显示当前版本提交名称
#若当前提交没有标记,则显示<tag>-<num>-g<commit>
#代表相对于<tag>的第<num>次提交,提交简易ID为<commit>
#当加上--dirty时,若工作区有改变,会在名称后面加上"-dirty"

git name-rev [commitID] <--tags>#显示对于commitID的引用,若加上--tags,则引用名优先使用标记名

创建标记

#创建轻量级标记
git tag [name] <commit>#创建带说明的标记
git tag -a [name] <commit>
git tag -m [msg] [name] <commit>#创建带GnuPG签名的标记
git tag -s [name] <commit>
git tag -u [key-id] [name] <commit>

删除标记

git tag -d [tagname]

转载于:https://www.cnblogs.com/KcMeterCEC/p/5571475.html

Linux上层应用--git独奏相关推荐

  1. linux上使用git把代码push到gitee上

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 linux上使用git把代码push到gitee上 文章目录: 1 git添加ssh公钥 2 代码推送的流程 从git的 ...

  2. linux服务之git

    http://www.cnblogs.com/fnng/archive/2011/08/25/2153807.html http://www.cnblogs.com/sunada2005/archiv ...

  3. Linux培训教程 Git在linux下的使用

       *初始化git仓库,使用gitinit命令 *添加文件到git仓库分两步: 1.使用git add filename ;可分多次使用,添加多个文件到暂存区 2.使用git commit -m & ...

  4. Linux centos7安装Git及 Jenkins配置Git

    Linux Jenkins配置Git 图文教程链接 https://www.cnblogs.com/mrjade/p/9299064.html

  5. linux上设置git高亮

    linux上设置git高亮  公司的测试环境没有配置cicd,每次只能自己去服务器上拉取代码,编译开发,吐槽一下,比较难用.而且我们的测试服务器的终端也是全黑的,很难用,前期项目开发比较紧张,没有时间 ...

  6. linux 安装git失败,Linux运维知识之linux下安装git常见故障整理

    本文主要向大家介绍了Linux运维知识之linux下安装git常见故障整理,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. FAQ1: Permission denied (pu ...

  7. linux怎么使用git安装目录,Linux系统中怎么安装Git?

    Linux Git是一个方便可用的管理器工具,起初Git就是为Linux而开发的,现在已经应用到各大系统中了.本文就来介绍一下Linux系统中怎么安装Git. 使用包管理器安装Git Git已经被所有 ...

  8. 在linux下搭建git环境,在linux下搭建git github开发环境

    在linux下搭建git github开发环境 github git linux 1.安装git sudo apt-getinstall git 2.Generating SSH keys 2.1.g ...

  9. Linux Ubuntu搭建git服务器

    1. 安装 openssh-server ,用于创建SSH服务. sudo apt-get install openssl-server 使用命令ps -e|grep ssh,查看ssh服务是否启动. ...

  10. Linux 系统使用 git 提交代码-- git 的安装及使用(简明教学指南)

    一.安装配置Git 1. 注册 GitHub 账号,GitHub:GitHub: Where the world builds software · GitHub. 2. 在 Linux 中安装 gi ...

最新文章

  1. sybase 数据导入mysql_Windows环境下Sybase12.5 数据库创建与导入数据库.docx
  2. linux tomcat下部署多个项目启动失败
  3. shiro与springMVC整合
  4. 张腾:腾讯云融合通信应用场景及案例分享
  5. java jolt tuxedo_java使用jolt调用tuxedo服务
  6. 用了自定义Banner后,SpringBoot瞬间变的高大上了...
  7. vue,html2canvas,网页div保存为图片
  8. 平板电脑连接投影仪_苹果电脑如何连接投影仪 苹果Mac连接投影仪方法【详解】...
  9. Linux设备树语法详解【转】
  10. java查看ip的所属地区
  11. 【python】读取json文件
  12. 如何从 0 到 1 参与 Flink 社区?
  13. 搭建ssm中遇到的问题
  14. 计算机开放电子书 2016 归档
  15. Clark与Park变换详解
  16. Anroid在应用层实现开机自启
  17. 24种游戏化设计工具
  18. 罗技G603鼠标欧姆龙D2FC-F-7N微动开关拆解修复双击问题要点解析
  19. oracle是java代码块,Oracle中施行java代码
  20. 图像生成论文阅读:GLIDE算法笔记

热门文章

  1. not optimal php,PHP错误提示It is not safe to rely on the system……的解决方法
  2. 全国各地收货详细地址_2020高考成绩在哪里查询 2020全国各地高考分数查询时间地址最新...
  3. win10安装nvidia驱动
  4. Python--itertools包--groupby使用(分类)
  5. Java之数组(上)
  6. 【Django 2021年最新版教程25】模板语言 前端for循环怎么用 实例
  7. c++获取ctrl+v内容_处理文档时,快捷键「Ctrl+E」的 8 大妙用
  8. 版本控制工具(GIT)
  9. LayaAir 获取对象边界 getBounds/ getGraphicBounds
  10. LayaAir UI 组件 # RadioGroup 单选框按钮组