git的常见操作命令与简答

4 篇文章 0 订阅

 

目录

前言:

1. 常见命令

1.1 common 

1.2 回滚操作与撤销 (git reset --hard HEAD^)

 1.2.1 git是怎么算出commit的sha1的值

1.2.2 sha1码是什么?

1.2.3 git log的简洁显示以及进入log界面的操作控制

1.2.4 git的将暂存区的修改撤销掉的命令

1.2.5 工作区的修改撤销

1.3 log操作

1.3.1 -pretty

1.3.2 -n(查看最近n次的提交信息)

1.3.3 查看某个文件的提交记录(需要指定文件名称)

1.3.4 查看某个作者的提交记录

1.3.5 使用时间搜索

1.3.6 搜索提交的内容,对字符串搜索

1.3.7 查看和并提交和非合并提交

1.3.8 最详细的查看LOG

1.3.9 git shortlog(这个操作可以很清晰的看到所有的组内用户对这个项目的修改)

1.3.10 git log --graph --oneline --decorate

1.4 git的删除命令

1.4.1 删除

1.4.2 将删除掉的文件恢复

1.5 tag命令(版本标记命令)

1.5.1 创建本地标签

1.5.2 创建远程标签

1.5.3 显示标签

1.5.4 删除标签

1.5.5 删除远程标签

2. 一些叙述类问题

2.1 说明GIT合并的两种方法以及区别

2.2 git是什么?

2.3 git 与svn的区别?优点?

2.3.1 元数据是什么?

2.4 git是使用什么语言编程的?

2.5 git pull 与 git fetch 有什么区别?


前言:

git也是一门很深的学问哈哈,不过git常见的操作大部分都是 git add . 之类的,然后git push等等。

而这些大部分的人现在都用图形化工具来代替了。

总之这个目的是:为了面试,也为了扩充自己的知识~

但是我还是坚持用GIT命令,并且在简历上专业技能加上---Git

那么有什么比较容易被考到的,而且还蛮重要的命令呢?

比如回滚,查看日志,还有常见的提交和暂存。

1. 常见命令

1.1 common 

Q: 你都有什么比较常用的或者熟知的GIT命令?

A:比如新建仓库,拷贝项目,又比如配置,add,push,reset等等。

# 这些是一些杂项,感觉可以面试的时候说一下
# 查看远端地址
git remote -v

# 丢弃所有的修改,这个我一般都用idea中的revert,但是这个也是蛮好用的(注意并不能撤销文件夹)
git checkout .


# 新建一个git代码库
git init

# 下载一个项目
git clone

# 显示当前的git配置(这个命令可能想看的是user.name ,user.email, 和remote.origin.url)
git config --list

# git 身份的准备
git config --global user.name "名字"
git config --global user.email "邮箱地址"



1.2 回滚操作与撤销 (git reset --hard HEAD^)

# git的回滚操作(把当前版本回退到上一个版本,就可以使用git reset命令)

// 回滚到上一个版本
git reset --hard HEAD^
// 回滚到上上个版本
git reset -- hard HEAD^^
//回滚往上面的100个版本

git reset -- hard HEAD~100

但是实际项目中,一般都是要git回滚到某一个版本,看看哪个版本提交了什么。

先查看到commit的sha码:

git log

# 结果比如:
commit c60c58809cff91f21542fa2063417c0879da9b9c
Merge: cf83653 8aaf9bd
Author: 
Date:   Fri Sep 27 11:44:45 2019 +0800

然后获得了commit的sha码:

#  退到/进到 指定commit的sha码
git reset --hard commit_id 

强推到远程(这个是reset之后 在让远程也跟着回退的必经手段):

git push origin HEAD --force

查看命令历史的操作:

git reflog

 1.2.1 git是怎么算出commit的sha1的值

生成这个hash值,它是对那个commit是Git仓库中内容和头信息Header的一个校验和checksum。

git使用sha1并不是为了安全性,而是为了数据的完整性。

就是如果很多年后,checkout某一个commit的时候,那么一定是多年前当时的状态。

commit的sha1是由40个16进制的数字进行了简单的划分

以前2位数字作为目录名,其下面是剩余38位数字组成的一个文件名

1.2.2 sha1码是什么?

先拽一下英文:Secure Hash Algorithm(安全哈希算法)

简述:和MD5一样,是比较广泛的  Hash函数,也是在消息认证中和数字签名中比较普遍的加密算法。

SHA 其实是安全哈希算法的代表,主要用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。

该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

总结:其实就是类似于MD5,生成不可逆的密文。

git用sha可能主要是不重复以及完整性。

1.2.3 git log的简洁显示以及进入log界面的操作控制

如果使用git log(系列操作),会进去控制模式。

空格向下翻页 / b 向上翻页 / q 退出

如果只显示sha1码和commit的单行显示

git log --pretty=oneline

结果(pretty就是漂亮的意思,oneline 展示是完整的sha1码):

ac0b7c89c6f0189f3******5590bb00dc84e17 MOD:优化代码;
1a70c60ab67ea7******d32d69565f324aef915b 更新前端生产代码
f669760fc43e8*****9228fcdb287e09df52e7e 更新前端代码
22a5b83f3c*****4c6bfc86c6039154c2a4c37e 更新前端代码

git log --oneline

结果(sha1码展示不完整,也就是哈希值的简写模式):

 1f5d410 ADD:账户类型验证功能添加
4da64cd MOD:修改pom,添加maven打包插件;

更多看下面的1.3 log操作

1.2.4 git的将暂存区的修改撤销掉的命令

git reset HEAD <file>

注意这里是rest HEAD 并不是 git reset --hard回退。

1.2.5 工作区的修改撤销

工作区也就是没有到commit或者add时候的状态

也就是让这个文件回到最近一次git commit或git add时的状态。

git checkout -- Object.java

1.3 log操作

1.3.1 -pretty

git log --pretty=oneline

按指定格式显示日志信息,可选项有: 
oneline,short,medium,full,fuller,email,raw以及format: 
默认为medium,可以通过修改配置文件来指定默认的方式。

1.3.2 -n(查看最近n次的提交信息)

git log -3 查看最近3次的提交历史记录

1.3.3 查看某个文件的提交记录(需要指定文件名称)

git log -- <file>

//可以前面加上修饰的条件

git log [\--] <file>…​

# 这种找到的都是根据这次提交,这个文件有过修改。 并且文件的path应该是相对全路径
git log --oneline -- pom.xml

1.3.4 查看某个作者的提交记录

git log --author="hehe"

1.3.5 使用时间搜索

//某个日期之后
git log --since=<date>
git log --after=<date>

//某个日期之前
git log --until=<date>
git log --before=<date>

但是这个date的格式,应该是YYYY.MM.DD

具体的时间区间:

git log --since="2019.09.20" --until="2019.09.30"

1.3.6 搜索提交的内容,对字符串搜索

一定注意是grep "" (双引号,有没有=都可以)

# git支持使用grep 加上正则表达式 来抓取
git log --grep <regexp>

# 使用grep来进行抓取,一定注意这边是双引号,否则抓不出东西,有没有=号都可以
git log --grep="前端" --oneline
git log --grep "前端" --oneline

1.3.7 查看和并提交和非合并提交

这种就是有没有进行merge操作

# 查看合并提交
git log --merges

# 查看非合并提交
git log --no-merges

1.3.8 最详细的查看LOG

git log --stat

这种方式:会显示文件的增删。特别详细

1.3.9 git shortlog(这个操作可以很清晰的看到所有的组内用户对这个项目的修改)

1.3.10 git log --graph --oneline --decorate

–graph 显示图形的分支变化
–decorate 是用来可以显示出指向提交的指针的名字,也就是 HEAD 指针, feature/test等分支名称,还有远程分支,标签等。

1.4 git的删除命令

1.4.1 删除

git rm 文件名

1.4.2 将删除掉的文件恢复

# 其实就是恢复某个文件工作区的改动
git checkout — 文件名

1.5 tag命令(版本标记命令)

Q:为什么要用tag命令?

A:相当于git版本库的一个快照,指向某个commit的指针。

Q:使用有什么好处?

A:tag的存在可以让我们在发布版本的时候,写上v1.0.1

Q:tag 和branch的区别和使用场景?

我倒是觉得tag和commit有一点点像。

tag对应的是某一次的commit。

但是branch 对应的是一个分支,对应的是一系列的commit, 有一个head指针,可以依照指针进行移动

所以改动代码用branch,不改动用tag

1.5.1 创建本地标签

git tag -a [tagname] -m [msg]
git tag -a [tag_name] [commit_id] -m [msg]

创建完标签,需要进行git push推到远程

1.5.2 创建远程标签

git push origin [tag_name]

1.5.3 显示标签

git tag
git show [tag_name]

1.5.4 删除标签

git tag -d [tag_name]

1.5.5 删除远程标签

git tag push origin :refs/tags/[tag_name]

1.6 解决 git add . 无效失败

项目中遇到
git add .无效主要 产生的主要原因是没有再仓库的根目录下执行此命令

使用 git add . 添加所有更改文件,发现失败,使用 git st查看文件没有被add上
解决:

git add --A 
或
git add --all

2. 一些叙述类问题

2.1 说明GIT合并的两种方法以及区别

Git代码合并有两种:Git Merge 和 Git ReBase

Git Merge:这种合并方式是将两个分支的历史合并到一起,现在的分支不会被更改,它会比对双方不同的文件缓存下来,生成一个commit,去push。(merge 两个分支 合到一起 处理冲突,主流的互联网公司使用的方式。)

这种方式现有的分支不会被修改,一般都用于公共的master

Git ReBase:这种合并方法通常被称为“衍合”。他是提交修改历史,比对双方的commit,然后找出不同的去缓存,然后去push,修改commit历史。

这种方式会让项目的历史变得很整洁,但是安全性和这次合并做了哪些有用修改,并不知道。所以绝对不能在公共分支上面使用它,可以用于自己的独自使用的分支。

所以可以形成这样的git习惯:

在自己的分支上面使用rebase,在公共分支一定要用merge。

2.2 git是什么?

我感觉应该没有面试官这么问。

git是一种分布式的版本管理工具,处理项目的版本管理。

轻量的本地分支,暂存区,多工作流等。

2.3 git 与svn的区别?优点?

首先我没用过SVN,但是这个问题还是要知道的。

1)git是分布式的,svn不是

2)git内容按照元数据存储,svn是文件(至于元数据是什么,看2.3.1)

3)git没有全局版本号 SVN有

4)git可以离线来看LOG

5)git 速度比较快,克隆分支的时候

6)版本仓库,就算gitHub 跪了,也可以在本地进行提交到本地,然后等主要版本库恢复

7)svn切分支,工作成员切一个分支 所有的人都会拥有一样的分支(这点好恐怖啊)

8)git的push相当于同步,但是svn提交的时候就直接弄到中央版本库了,不方便回滚

总结:

svn简单 只是需要一个放代码地方可以,但是SVN权限控制比较好,易于管理,集中式服务器更能保证安全性

SVN不适合开发人数很多的项目,代码一致性很高。而且很需要链接到服务器和网络,否则不能提交和还原等等。

非常明确的权限管理机制(例如分支访问限制),可以实现分层管理

Git 比svn快,Git可以离线,git对于分支比较友好。而且Git的提交也更加友好。

 

git不依赖于网络 对分支和合并有更好的支持,分布式开发,每个个体独立。速度快,但是冲突多。可以更好离线操作。代码保密性差。一份代码可以有所有的版本信息。

 

2.3.1 元数据是什么?

任何文件系统的数据分为数据和元数据。

数据就是普通文件中的实际数据,而元数据指的是一个文件的特征的系统数据(元数据指的是特征)

比如访问权限 文件的拥有者 文件数据块的分布信息

元数据就是 Metadata  也就是数据的数据,也是中介数据。描述数据属性的信息。

2.4 git是使用什么语言编程的?

git用c语言

2.5 git pull 与 git fetch 有什么区别?

git pull 命令从中央存储库中提取特定分支的新更改或提交,并更新本地存储库中的目标分支。

git fetch 也用于相同的目的,但它的工作方式略有不同。当你执行 git fetch 时,它会从所需的分支中提取所有新提交,并将其存储在本地存储库中的新分支中。如果要在目标分支中反映这些更改,必须在 git fetch 之后执行git merge。只有在对目标分支和获取的分支进行合并后才会更新目标分支。为了方便起见,请记住以下等式:

git pull = git fetch + git merge(即可)

 

 

参考: 

如何获取sha1码么? https://www.jianshu.com/p/3c4945812556

git常用命令与常见面试题总结 : https://blog.csdn.net/qq_36095679/article/details/91804051

Git-叹为观止的 log 命令 & 其参数 : https://blog.csdn.net/qq_32452623/article/details/79599503

git的官方文档 :https://git-scm.com/docs/git-log

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值