目录
1.2 回滚操作与撤销 (git reset --hard HEAD^)
1.2.3 git log的简洁显示以及进入log界面的操作控制
1.3.9 git shortlog(这个操作可以很清晰的看到所有的组内用户对这个项目的修改)
1.3.10 git log --graph --oneline --decorate
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.youkuaiyun.com/qq_36095679/article/details/91804051
Git-叹为观止的 log 命令 & 其参数 : https://blog.youkuaiyun.com/qq_32452623/article/details/79599503
git的官方文档 :https://git-scm.com/docs/git-log