Git【常见知识点速查】
文章更新时间:2020/06/17
一、基础知识点解析
Git工作流程
以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词。
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
工作区
程序员进行开发改动的地方,是你当前看到的,也是最新的。 平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。
暂存区
.git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp...),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。 当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。
本地仓库
保存了对象被提交过的各个版本,比起工作区和暂存区的内容,它要更旧一些。 git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。
远程仓库
远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。
小结
- 任何对象【文件】都是在工作区中诞生和被修改;
- 任何修改都是从进入index区【暂存区】才开始被版本控制;
- 只有把修改commit【提交】到本地仓库,该修改才能在仓库中留下痕迹;
- 与协作者分享本地的修改,可以把它们push【推送】到远程仓库来共享。
下面这幅图更加直接阐述了四个区域之间的关系,可能有些命令不太清楚,没关系,下部分会详细介绍。
二、常用术语
开局一张图:
head
HEAD,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变。
add
add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。
- git add . 添加当前目录的所有文件到暂存区
- git add [dir] 添加指定目录到暂存区,包括子目录
- git add [file1] 添加指定文件到暂存区
commit
commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。
- git commit -m [message] 提交暂存区到本地仓库,message代表说明信息
- git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
- git commit --amend -m [message] 使用一次新的commit,替代上一次提交
branch
涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作
- git branch 列出所有本地分支
- git branch -r 列出所有远程分支
- git branch -a 列出所有本地分支和远程分支
- git branch [branch-name] 新建一个分支,但依然停留在当前分支
- git checkout -b [branch-name] 新建一个分支,并切换到该分支
- git branch --track [branch][remote-branch] 新建一个分支,与指定的远程分支建立追踪关系
- git checkout [branch-name] 切换到指定分支,并更新工作区
- git branch -d [branch-name] 删除分支
- git push origin --delete [branch-name] 删除远程分支
三、Git标签
为什么git标签要单独拿出来讲呢,因为git的标签【tag】与分支管理类似,但又有不同的地方,可以说是独立出来的一种版本管理方式,所以我们先简单看一下相关的概念。
作用:通常在发布软件的时候打一个tag,tag会记录版本的commit号,方便后期回溯。
常用命令:
- git tag :列出所有的标签
- git tag -l '关键字' :列出含有关键字的标签【例子:git tag -l 'v1.*' (查找v1.开头的标签)】
- git tag '标签名字' :新建一个标签,并指定标签名字【例子:git tag 'v1.0'(创建一个名为v1.0的标签)】
- git tag -a '标签名字' -m '标签备注' :新建一个标签,指定名字,并添加标签备注【例子:git tag -a 'v1.0' -m '第一版打标'】
- git tag -a '标签名字' 'commit号' -m '标签备注' :新建一个标签,指定名字和备注,并根据commit号选定对应的commit来进行打标,此操作可以对与以前的commit进行打标 【例子:git tag -a 'v1.0' 23ed6s -m '第一版打标'】
- git show '标签名字' :查看标签详细信息,包括commit编号,备注,日期等信息【例子:git show 'v1.0'】
- git push origin '标签名字' :推送tag至远程仓库,相当于新建分支后的push操作【例子:git push origin 'v1.0'】
- git push origin --tags :推送本地所有tag至远程仓库
- git checkout '标签名字' :操作类似于分支的检出,但不同的是,此时检出的标签不位于任何分支,处于游离状态,可以考虑基于这个tag创建一个分支。【例子:git checkout 'v1.0'】
- git tag -d '标签名字' :删除某个标签【例子:git tag -d 'v1.0'】
- git push origin :refs/tags/标签名字 :删除远端仓库的某个标签【例子:git push origin :refs/tags/v1.0】
四、常用命令详解
merge【合并】
#从某分支合并到当前分支【推荐使用小乌龟git,图形化界面操作更方便~】
git merge 需要合并到当前分支的名称
作用:合并其他分支的代码到当前分支。
merge命令主要是用来实现从一个分支合并到当前分支的功能,假如平时我们在dev分支开发业务功能,等到上线的时候就需要合并到master分支进行上线,那么我们需要以下步骤:
- 1、本地分支切换到dev分支,并拉取代码,保证代码为最新版本
- 2、本地分支切换到master分支,同样保证代码为最新版本
- 3、选择merge分支为dev分支
- 4、merge完成后,解决冲突
- 5、冲突解决后,把本地的master分支push到远端,merge流程完成
需要注意的是,merge有两种类型的合并:
- fast-forward:当本地分支相对于合并分支没有新的提交时,默认采用这种形式
- no-fast-forward:当本地分支相对于合并分支有新提交时,采用这种
图示:
Rebase【变基】
#从某分支变基更新的代码到当前分支【推荐使用小乌龟git,图形化界面操作更方便~】
git rebase 需要变基到当前分支的名称
作用:把新代码和本地代码进行合并,解决冲突。
变基操作主要应用在我们本地代码需要获取其他分支或者当前分支的最新代码时会用到,rebase是一个线性操作,不去校验冲突,对于已存在的文件总是会选择最新的版本,一般本地操作分为以下几个步骤:
- 1、从远端fetch到最新的代码到本地
- 2、对当前分支进行rebase,把本地分支的代码更新为最新的
PS:若从不同分支直接rebase过来时,类似于merge操作,但是一般来说,merge需要经过冲突文件的解决,而rebase对于同一个文件,总是会选择最新的版本。
图示:
还有一种变基方式为交互式变基,如果有不想提交的代码本地commit了的时候,可以对此次commit进行修改,常用到的命令有以下几种:
- reword:修改提交信息
- edit:修改此提交
- squash:将提交融合到前一个提交中
- fixup:将提交融合到前一个提交中,不保留该提交的日志消息
- exec:在每个提交上运行我们想要 rebase 的命令
- drop:移除该提交
图示:
Reset【重置】
作用:恢复分支代码到一个特定的版本。
重置命令一般使用在进行了一个不想要的提交,那么除了交互式变基我们还可以使用这种方式去快乐的玩耍~,重置也分两种,软重置和硬重置:
#软重置
git reset --sorrt 需要恢复到的commit版本 #硬重置
git reset --hard 需要恢复到的commit版本
概念理解一下:
- 软重置:一般发生在我们想回到原来的提交进行审查,但是又想保留之后提交的文件时,会采用这种方式。
- 硬重置:一般发生在我们想回到原来的提交,而后面的提交不想要了,就用这种方式。
图示:
Revert【还原】
作用:还原代码。
这个命令就好理解了,比如我们本地改了一堆东西,发现改错了,直接revert就可以了~
又或者有这种场景,在某个分支上提交了一个文件,但是后面我们又不想要这个文件了,可以revert这次commit【只还原当次commit,同时会增加一个还原操作的新commit】
下图演示了这么一个场景:假设 ec5be 添加了一个 index.js 文件。但之后我们发现其实我们再也不需要由这个提交引入的修改了,就可以还原一波,并且增加了一个还原操作的新commit:9e78i。
Cherry-pick【拣选/选樱桃~】
作用:拣选需要的commit到当前分支
这个操作的名称翻译过来有点意思,选樱桃~,字面理解就是选取精华的东西,那在项目中实际上应用的场景是:
- 1、dev分支对于master分支多出了一个commit1,和commit2
- 2、master分支只想要dev分支的commit2而已,不想整个dev分支合并过来
- 3、那我们可以使用这个命令来选择单个commit复制到master分支上
图示:
图中演示了master分支把带有index.js文件的commit(76d12)拣选到master分支上的过程。
Fetch【取回】
作用:取回当前分支最新的代码,不对本地分支进行数据修改,只是下载新的代码
fetch操作主要是用于获取远程最新资源的命令,仅仅是下载新的数据而已,而不对本地代码做操作。
图示:
Pull【拉取】
作用:拉取远端最新的代码到本地,并且合并,同时需要解决冲突【相当于Pull = Fecth + rebase】
图示:
Reflog【查看操作记录】
git reflog 可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。
图示:
有了操作记录以后,我们可以针对某个操作记录进行处理,比如说我想恢复到某个节点的commit,可以类似于图下的操作流程:
如上图,我们先通过git reflog查看了当前分支的提交记录,然后选取了HEAD@{1}这个版本进行reset,就可以恢复到对应的版本了。【reset命令也可以使用对应版本号来指向,不一定要用head的形式】
Git【常见知识点速查】的更多相关文章
- Nginx【常见知识点速查】
文章更新时间:2020/04/10 一.简介 定义:Nginx是一个高性能的HTTP和反向代理web服务器 作用: 反向代理 正向代理 负载均衡 HTTP静态资源服务器(动静分离) 二.正向代理与反向 ...
- Maven【常见知识点速查】
文章更新时间:2020/04/10 一.为什么使用Maven这样的构建工具[why] ① 一个项目就是一个工程 如果项目非常庞大,就不适合使用package来划分模块,最好是每一个模块对应一个工程,利 ...
- git 常用命令速查
git 常用命令速查 命令速查表 一.克隆项目 把远程仓库上的项目克隆到本地.一般来说项目是有1个或2个分支,主要是做开发和线上的区别.既然所属分支不一样,那命令也会有一点区别.这里假设是有2个分支, ...
- 转收藏:Git常用命令速查表
一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...
- Git 常用命令速查表(图文+表格)
一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r ...
- Git 常用命令速查表(图文+表格)【转】
转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...
- Git常用命令速查表 & Git Basics & github : release 发布!
Git常用命令速查表 & Git Basics & github : release 发布! Git常用命令速查表: 1 1 1 1 1 http://git-scm.com/bo ...
- Git常用命令速查表,新手必备版本控制
Git 跟 SVN 一样,都是用于管理代码的版本控制工具.无论在项目中,我们负责哪一块,只要需要编写代码,就必须熟悉Git(依公司要求而定). 当然,用的越熟练,处理的项目越顺利,离出任CTO.迎娶白 ...
- Java基础一篇过(八)常见异常速查
一.引言 开发过程中可能会遇到各种各样的异常,这里还是汇总一些比较典型的异常,有些比较直观的异常如空指针这种就不写了,此文可作为异常速查用. 二.异常大军正在来袭~ IllegalArgumentEx ...
随机推荐
- Gitlab安装使用
Gitlab安装使用 1. 为什么要使用gitlab Git的优点多多这里就不详细介绍了: Git是版本控制系统,Github是在线的基于Git的代码托管服务: Github有个小缺陷 (也不能算是缺 ...
- golang 判断前缀后缀、包含关系
HasPrefix 判断字符串 s 是否以 prefix 开头:strings.HasPrefix(s, prefix string) bool HasSuffix 判断字符串 s 是否以 suffi ...
- 如何使用python移除/删除非空文件夹?
移除/删除非空文件夹/目录的最有效方法是什么? 1.标准库参考:shutil.rmtree. 根据设计,rmtree在包含只读文件的文件夹树上失败.如果要删除文件夹,不管它是否包含只读文件,请使用 i ...
- Ubuntu18.04 解决umount: /mnt: device is busy
通过该命令查看那个进程占用该device fuser -m /mnt 然后 kill -9 PID 最后就可以umount /mnt 了
- muduo源码解析1-timestamp类
timestamp class timestamp:public mymuduo::copyable, public boost::equality_comparable<timestamp&g ...
- Java面试题(多线程篇)
多线程 35.并行和并发有什么区别? 1.并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 2.并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. 3.在 ...
- 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】
看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧. 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指重链剖分.当然,还有一种长链 ...
- Spring实战第4版PDF下载含源码
下载链接 扫描右侧公告中二维码,回复[spring实战]即可获取所有链接. 读者评价 看了一半后在做评论,物流速度挺快,正版行货,只是运输过程有点印记,但是想必大家和你关注内容,spring 4必之3 ...
- 现在的市场对 C++ 的需求大吗?
分享 大师助手 先说结论:需求还是很大,但是没有什么初级程序员能干的岗位. 游戏引擎,存储,推荐引擎,infra,各种各样的性能敏感场景.这些都是C++的刚需场景,别的语言基本替代不了的.除了pin ...
- tomcat服务器java.lang.OutOfMemoryError: PermGen space
一挂就报内存溢出 下面是TOMCAT日志 JAVA程序是没有报错, Nov 24, 2009 4:07:02 PM org.apache.catalina.core.ApplicationDispat ...