0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Git 命令+原理 程序员必备的基础

数据分析与开发 来源:数据分析与开发 作者:捡田螺的小男孩 2020-11-14 10:01 次阅读

掌握Git命令是每位程序员必备的基础,之前一直是用smartGit工具,直到看到大佬们都是在用Git命令操作的,回想一下,发现有些Git命令我都忘记了,于是写了这篇博文,复习一下~

文章目录

Git是什么?

Git的相关理论基础

日常开发中,Git的基本常用命令

Git进阶之分支处理

Git进阶之处理冲突

Git进阶之撤销与回退

Git进阶之标签tag

Git其他一些经典命令

Git是什么

在回忆Git是什么的话,我们先来复习这几个概念哈~

什么是版本控制?

百度百科定义是酱紫的~

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。

那些年,我们的毕业论文,其实就是版本变更的真实写照...脑洞一下,版本控制就是这些论文变更的管理~

什么是集中化的版本控制系统

那么,集中化的版本控制系统又是什么呢,说白了,就是有一个集中管理的中央服务器,保存着所有文件的修改历史版本,而协同开发者通过客户端连接到这台服务器,从服务器上同步更新或上传自己的修改。

什么是分布式版本控制系统?

分布式版本控制系统,就是远程仓库同步所有版本信息到本地的每个用户。嘻嘻,这里分三点阐述吧:

用户在本地就可以查看所有的历史版本信息,但是偶尔要从远程更新一下,因为可能别的用户有文件修改提交到远程哦。

用户即使离线也可以本地提交,push推送到远程服务器才需要联网。

每个用户都保存了历史版本,所以只要有一个用户设备没问题,就可以恢复数据啦~

什么是Git?

Git是免费、开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

Git的相关理论基础

Git的四大工作区域

Git的工作流程

Git文件的四种状态

一张图解释Git的工作原理

Git的四大工作区域

先复习Git的几个工作区域哈:

Workspace:你电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区。

Index/Stage:暂存区,一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域啦。

Repository:本地仓库,你执行git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中HEAD指向最新放入仓库的版本。当你执行git commit,文件改动就到本地仓库来了~

Remote:远程仓库,就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库~

Git的工作流程

上一小节介绍完Git的四大工作区域,这一小节呢,介绍Git的工作流程咯,把git的操作命令和几个工作区域结合起来,个人觉得更容易理解一些吧,哈哈,看图:

git 的正向工作流程一般就这样:

从远程仓库拉取文件代码回来;

在工作目录,增删改查文件;

把改动的文件放入暂存区;

将暂存区的文件提交本地仓库;

将本地仓库的文件推送到远程仓库;

Git文件的四种状态

根据一个文件是否已加入版本控制,可以把文件状态分为:Tracked(已跟踪)和Untracked(未跟踪),而tracked(已跟踪)又包括三种工作状态:Unmodified,Modified,Staged

Untracked: 文件还没有加入到git库,还没参与版本控制,即未跟踪状态。这时候的文件,通过git add 状态,可以变为Staged状态

Unmodified:文件已经加入git库, 但是呢,还没修改, 就是说版本库中的文件快照内容与文件夹中还完全一致。Unmodified的文件如果被修改, 就会变为Modified. 如果使用git remove移出版本库, 则成为Untracked文件。

Modified:文件被修改了,就进入modified状态啦,文件这个状态通过stage命令可以进入staged状态

staged:暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodified状态.

一张图解释Git的工作原理

日常开发中,Git的基本常用命令

git clone

git checkout -b dev

git add

git commit

git log

git diff

git status

git pull/git fetch

git push

这个图只是模拟一下git基本命令使用的大概流程哈~

git clone

当我们要进行开发,第一步就是克隆远程版本库到本地呢

git clone url 克隆远程版本库

git checkout -b dev

克隆完之后呢,开发新需求的话,我们需要新建一个开发分支,比如新建开发分支dev

创建分支:

git checkout -b dev 创建开发分支dev,并切换到该分支下

git add

git add的使用格式:

git add .添加当前目录的所有文件到暂存区git add [dir]添加指定目录到暂存区,包括子目录git add [file1]添加指定文件到暂存区

有了开发分支dev之后,我们就可以开始开发啦,假设我们开发完HelloWorld.java,可以把它加到暂存区,命令如下

git add Hello.java 把HelloWorld.java文件添加到暂存区去

git commit

git commit的使用格式:

git commit -m [message] 提交暂存区到仓库区,message为说明信息git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库git commit --amend -m [message] 使用一次新的commit,替代上一次提交

把HelloWorld.java文件加到暂存区后,我们接着可以提交到本地仓库啦~

git commit -m 'helloworld开发'

git status

git status,表示查看工作区状态,使用命令格式:

git status 查看当前工作区暂存区变动git status -s 查看当前工作区暂存区变动,概要信息git status --show-stash 查询工作区中是否有stash(暂存的文件)

当你忘记是否已把代码文件添加到暂存区或者是否提交到本地仓库,都可以用git status看看哦~

git log

git log,这个命令用得应该比较多,表示查看提交历史/提交日志~

git log 查看提交历史git log --oneline 以精简模式显示查看提交历史git log -p 查看指定文件的提交历史git blame 一列表方式查看指定文件的提交历史

嘻嘻,看看dev分支上的提交历史吧~要回滚代码就经常用它喵喵提交历史~

git diff

git diff 显示暂存区和工作区的差异git diff filepath filepath路径文件中,工作区与暂存区的比较差异git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异git diff commitId filepath 与某一次提交的比较差异

如果你想对比一下你改了哪些内容,可以用git diff对比一下文件修改差异哦

git pull/git fetch

git pull 拉取远程仓库所有分支更新并合并到本地分支。gitpulloriginmaster将远程master分支合并到当前本地分支git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支 git fetch --all 拉取所有远端的最新代码git fetch origin master 拉取远程最新master分支代码

我们一般都会用git pull拉取最新代码看看的,解决一下冲突,再推送代码到远程仓库的。

有些伙伴可能对使用git pull还是git fetch有点疑惑,其实 git pull = git fetch+ git merge。pull的话,拉取远程分支并与本地分支合并,fetch只是拉远程分支,怎么合并,可以自己再做选择。

git push

git push 可以推送本地分支、标签到远程仓库,也可以删除远程分支哦。

git push origin master 将本地分支的更新全部推送到远程仓库master分支。git push origin -d 删除远程branchname分支git push --tags 推送所有标签

如果我们在dev开发完,或者就想把文件推送到远程仓库,给别的伙伴看看,就可以使用git push origin dev~

Git进阶之分支处理

Git一般都是存在多个分支的,开发分支,回归测试分支以及主干分支等,所以Git分支处理的命令也需要很熟悉的呀~

git branch

git checkout

git merge

git branch

git branch用处多多呢,比如新建分支、查看分支、删除分支等等

新建分支:

git checkout -b dev2 新建一个分支,并且切换到新的分支dev2git branch dev2 新建一个分支,但是仍停留在原来分支

查看分支:

git branch 查看本地所有的分支git branch -r 查看所有远程的分支git branch -a 查看所有远程分支和本地分支

删除分支:

git branch -D 删除本地branchname分支

git checkout

切换分支:

git checkout master 切换到master分支

git merge

我们在开发分支dev开发、测试完成在发布之前,我们一般需要把开发分支dev代码合并到master,所以git merge也是程序员必备的一个命令。

git merge master 在当前分支上合并master分支过来git merge --no-ff origin/dev 在当前分支上合并远程分支devgit merge --abort 终止本次merge,并回到merge前的状态

比如,你开发完需求后,发版需要把代码合到主干master分支,如下:

Git进阶之处理冲突

Git版本控制,是多个人一起搞的,多个分支并存的,这就难免会有冲突出现~

Git合并分支,冲突出现

同一个文件,在合并分支的时候,如果同一行被多个分支或者不同人都修改了,合并的时候就会出现冲突。

举个粟子吧,我们现在在dev分支,修改HelloWorld.java文件,假设修改了第三行,并且commit提交到本地仓库,修改内容如下:

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello,捡田螺的小男孩!"); }}

我们切回到master分支,也修改HelloWorld.java同一位置内容,如下:

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello,jay!!"); }}

再然后呢,我们提交一下master分支的这个改动,并把dev分支合并过下,就出现冲突啦,如图所示:

Git解决冲突

Git 解决冲突步骤如下:

查看冲突文件内容

确定冲突内容保留哪些部分,修改文件

重新提交,done

1.查看冲突文件内容

git merge提示冲突后,我们切换到对应文件,看看冲突内容哈,,如下:

2.确定冲突内容保留哪些部分,修改文件

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,

<<<<<<>>>>>> dev是指dev分支上修改的内容

所以呢,我们确定到底保留哪个分支内容,还是两个分支内容都保留呢,然后再去修改文件冲突内容~

3.修改完冲突文件内容,我们重新提交,冲突done

Git进阶之撤销与回退

Git的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操作。

代码在Git的每个工作区域都是用哪些命令撤销或者回退的呢,如下图所示:

有关于Git的撤销与回退,一般就以下几个核心命令

git checkout

git reset

git revert

git checkout

如果文件还在工作区,还没添加到暂存区,可以使用git checkout撤销

git checkout [file] 丢弃某个文件filegit checkout . 丢弃所有文件

以下demo,使用git checkout -- test.txt 撤销了test.txt的修改

git reset

git reset的理解

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本.

为了更好地理解git reset,我们来回顾一下,Git的版本管理及HEAD的理解

Git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一般指向当前分支,如下:

假设执行git reset,回退到版本二之后,版本三不见了哦,如下:

git reset的使用

Git Reset的几种使用模式

git reset HEAD --file回退暂存区里的某个文件,回退到当前版本工作区状态git reset –-soft 目标版本号 可以把版本库上的提交回退到暂存区,修改记录保留git reset –-mixed 目标版本号 可以把版本库上的提交回退到工作区,修改记录保留git reset –-hard 可以把版本库上的提交彻底回退,修改的记录全部revert。

先看一个粟子demo吧,代码git add到暂存区,并未commit提交,可以酱紫回退,如下:

git reset HEAD file 取消暂存git checkout file 撤销修改

再看另外一个粟子吧,代码已经git commit了,但是还没有push:

git log 获取到想要回退的commit_idgit reset --hard commit_id 想回到过去,回到过去的commit_id

如果代码已经push到远程仓库了呢,也可以使用reset回滚哦(这里大家可以自己操作实践一下哦)~

git loggit reset --hard commit_idgit push origin HEAD --force

git revert

与git reset不同的是,revert复制了那个想要回退到的历史版本,将它加在当前分支的最前端。

revert之前:

revert 之后:

当然,如果代码已经推送到远程的话,还可以考虑revert回滚呢

git log 得到你需要回退一次提交的commit idgit revert -n 撤销指定的版本,撤销也会作为一次提交进行保存

Git进阶之标签tag

打tag就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去。

git tag 列出所有taggit tag [tag] 新建一个tag在当前commitgit tag [tag] [commit] 新建一个tag在指定commitgit tag -d [tag] 删除本地taggit push origin [tag] 推送tag到远程git show [tag] 查看taggit checkout -b [branch] [tag] 新建一个分支,指向某个tag

Git其他一些经典命令

git rebase

rebase又称为衍合,是合并的另外一种选择。

假设有两个分支master和test

D---E test / A---B---C---F--- master

执行 git merge test得到的结果

D--------E / A---B---C---F----G--- test, master

执行git rebase test,得到的结果

A---B---D---E---C‘---F‘--- test, master

rebase好处是:获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull --rebase,就是因为想更优雅,哈哈

git stash

stash命令可用于临时保存和恢复修改

git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作git stash list 显示保存的工作进度列表git stash pop stash@{num} 恢复工作进度到工作区git stash show :显示做了哪些改动git stash drop stash@{num} :删除一条保存的工作进度git stash clear 删除所有缓存的stash。

git reflog

显示当前分支的最近几次提交

git blame filepath

git blame 记录了某个文件的更改历史和更改人,可以查看背锅人,哈哈

git remote

git remote 查看关联的远程仓库的名称git remote add url 添加一个远程仓库git remote show [remote] 显示某个远程仓库的信息

参考与感谢

感谢各位前辈的文章:

一个小时学会Git(https://www.cnblogs.com/best/p/7474442.html#_label3_4_0_4)

【Git】(1)---工作区、暂存区、版本库、远程仓库(https://www.cnblogs.com/qdhxhz/p/9757390.html)

Git Reset 三种模式(https://www.jianshu.com/p/c2ec5f06cf1a)

Git恢复之前版本的两种方法reset、revert(图文详解)(https://blog.csdn.net/yxlshk/article/details/79944535)

Git撤销&回滚操作(git reset 和 get revert)(https://blog.csdn.net/asoar/article/details/84111841)

为什么要使用git pull --rebase?(https://www.jianshu.com/p/dc367c8dca8e)

责任编辑:xj

原文标题:7000+ 字带你全面搞懂 Git 命令+原理!

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6559

    浏览量

    87937
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21873
  • Git
    Git
    +关注

    关注

    0

    文章

    195

    浏览量

    15495

原文标题:7000+ 字带你全面搞懂 Git 命令+原理!

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    1月18号“纯鸿蒙”千帆启航,程序员预备!

    。 如何正确看待鸿蒙? 我作为程序员来说,首先是看鸿蒙的发展、市场开发岗位、薪资以及前景。 这几年对鸿蒙的发展情况来分析,从2019年开始鸿蒙的出来今天,华为鸿蒙取得了很大的成就。从“不兼容
    发表于 01-16 22:13

    Git命令解决常见场景记录

    不需要这些文件了,想要批量处理掉,所以记录一下用命令行一次性丢弃未跟踪文件的方法,同时也记录一下撤销push请求的git记录。
    的头像 发表于 12-20 09:44 255次阅读
    用<b class='flag-5'>Git</b><b class='flag-5'>命令</b>解决常见场景记录

    Git命令之本地分支与远程分支关联和解除

    在实际的工作生活中,往往需要将本地的分支和远程分支关联,这样我们就可以使用git pull命令来更新拉取最新的代码,并使用git push命令将自己本地的修改推送到远程仓库。但是如果此
    的头像 发表于 12-15 09:27 892次阅读
    <b class='flag-5'>Git</b><b class='flag-5'>命令</b>之本地分支与远程分支关联和解除

    git命令的基本使用

    git config 第一次使用git或者刚安装的git时,使用此命令设置身份Name 和 Eamail 地址。并且每次提交时会使用此信息。
    的头像 发表于 12-11 13:53 687次阅读

    Git中最常用的命令介绍

    git add命令用于将修改的文件添加到下一次提交的暂存区。你可以指定要添加的文件git add命令用于将修改的文件添加到下一次提交的暂存区。你可以指定要添加的文件,例如
    发表于 10-26 10:27 141次阅读
    <b class='flag-5'>Git</b>中最常用的<b class='flag-5'>命令</b>介绍

    Git常用的超级实用命令

    Git作为最流行的代码版本控制工具,基本上已经成为了程序员的一个标配技能。无论使用GitHub,GitLib,Gitee等进行代码托管,均基于Git。下面聊一聊开发人员必会的几个Git
    的头像 发表于 10-09 17:19 985次阅读
    <b class='flag-5'>Git</b>常用的超级实用<b class='flag-5'>命令</b>

    git基本操作命令用法

    基本用法 上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。 git add files把当前文件放入暂存区域。 git commit给暂存区域生成快照并提交。 git
    的头像 发表于 09-13 16:29 616次阅读
    <b class='flag-5'>git</b>基本操作<b class='flag-5'>命令</b>用法

    移植ARM DHCP服务器版本1程序员指南

    这本书由ARM DHCP服务器服务器软件提供, 假定ARM DHCP服务器移植源可以作为参考, 也假设您可以访问程序员的 C 和 ARM 组装语言指南。 本程序员指南是为有经验的内嵌系统程序员编写
    发表于 08-18 06:46

    霓虹灯程序员指南

    如果您对ARM技术完全陌生,请阅读Cortex-A系列程序员指南,了解有关ARM架构配置文件和一般编程指南的信息。 ·霓虹灯技术是ARM高级单指令多数据(SIMD)扩展的实现。 ·霓虹灯单元是执行
    发表于 08-17 06:32

    ARMv8-A霓虹灯程序员指南

    程序员,如固件、设备驱动程序或android内核开发人员•希望为基于Arm的目标设备优化库或应用程序程序员•非常热衷于Raspberry Pi爱好者本指南涵盖了如何开始使用Neon,
    发表于 08-08 07:25

    ARM系统跟踪Macrocell程序员模型架构规范1.1版

    ARM 系统跟踪大型电池程序员示范建筑规格V1.1 建筑规格
    发表于 08-02 10:11

    Git命令的综合手册怎么找

    若你使用 Git 时需要获取帮助,有三种等价的方法可以找到 Git 命令的综合手册(manpage): $ git help $ git -
    的头像 发表于 07-22 11:02 504次阅读

    Git常用命令总结

    在之前的文章中,我们讨论了一些初学者必备Git 命令。然而,这些命令仅仅触及了 Git 功能的皮毛。
    发表于 07-21 10:30 240次阅读

    61.[程序员小飞]如何在3分钟内安装好数据库MySql和Navicat,简单又易懂

    程序员
    充八万
    发布于 :2023年07月20日 09:16:19