程序员必备基础:Git 命令全方位学习

来源 | 捡田螺的小男孩

责编 | Carol

封图 | CSDN 下载自视觉中国

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

https://github.com/whx123/JavaHome

Git是什么

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

1.什么是版本控制?

百度百科定义是酱紫的~

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

那些年,我们的毕业论文,其实就是版本变更的真实写照...脑洞一下,版本控制就是这些论文变更的管理~2.什么是集中化的版本控制系统?

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

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

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

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

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

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

4.什么是Git?

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

Git 的相关理论基础

  • Git的四大工作区域

  • Git的工作流程

  • Git文件的四种状态

  • 一张图解释Git的工作原理

1.Git的四大工作区域

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

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

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

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

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

2.Git的工作流程

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

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

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

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

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

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

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

3.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状态.

5.一张图解释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基本命令使用的大概流程哈~

1.git clone

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

git clone url  克隆远程版本库

2.git checkout -b dev

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

创建分支:

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

3.git add

git add的使用格式:

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

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

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

4.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开发'

5.git status

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

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

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

6.git log

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

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

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

7.git diff

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

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

8.git pull/git fetch

git pull  拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程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只是拉远程分支,怎么合并,可以自己再做选择。

9.git push

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

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

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

Git 进阶之分支处理

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

  • git branch

  • git checkout

  • git merge

1.git branch

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

新建分支:

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

查看分支:

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

删除分支:

git branch -D <branchname>  删除本地branchname分支

2.git checkout

切换分支:

git checkout master 切换到master分支

3.git merge

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

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

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

Git 进阶之处理冲突

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

1.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分支合并过下,就出现冲突啦,如图所示:

2.Git解决冲突

Git 解决冲突步骤如下:

  • 查看冲突文件内容

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

  • 重新提交,done

1)查看冲突文件内容

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

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

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

  • <<<<<<<HEAD是指主分支修改的内容,>>>>>>> dev是指dev分支上修改的内容

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

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

Git 进阶之撤销与回退

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

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

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

  • git checkout

  • git reset

  • git revert

1.git checkout

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

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

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

2.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_id
git reset --hard commit_id  想回到过去,回到过去的commit_id

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

git log
git reset --hard commit_id
git push origin HEAD --force

3.git revert

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

revert之前:revert 之后:

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

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

Git 进阶之标签 tag

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

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

Git 其他一些经典命令

1.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,就是因为想更优雅,哈哈

2.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。

3.git reflog

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

4.git blame filepath

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

5.git remote

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

更多推荐阅读

  • 没想到!!Unicode 字符还能这样玩?

  • MongoDB 计划从“Data Sprawl”中逃脱

  • 推特惊爆史诗级漏洞,App 恶意窃取用户隐私,云端安全路向何方?

  • 开发者批评苹果商店佣金过高,库克将面临立法者质疑;花呗接入央行征信;GitHub 发布更新| 极客头条

  • 那个从深圳流水线去了纽约做程序员的女工,最近失业了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eBay邓明:dubbo-go 中 metrics 的设计

最近因为要在 Apache/dubbo-go&#xff08;以下简称 dubbo-go &#xff09;里面实现类似的这个 metrics 功能&#xff0c;于是花了很多时间去了解现在 Dubbo 里面的 metrics 是怎么实现的。该部分&#xff0c;实际上是被放在一个独立的项目里面&#xff0c;即 metrics 。 总体…

稳定性专题 | Spring Boot 常见错误及解决方法

导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目&#xff0c;涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域&#xff0c;以更结构化的方式来打造稳定性领域的知识库。 Spring Boot 作为 Java…

vue3 线上环境 ctx 无法识别

解决方案&#xff1a; Vue3获取当前组件实例的 getCurrentInstance 方法上 ctx 生产获取不到 上面的全局方法&#xff0c; getCurrentInstance代表上下文&#xff0c;即当前实例。ctx相当于Vue2的this, 但是需要特别注意的是ctx代替this只适用于开发阶段&#xff0c;如果将项目…

新职业风口已至!人社部宣布这10个职业缺口近千万!

负责阿里小蜜产品的陈海青是阿里最年轻的P9专家&#xff0c;才30岁出头&#xff0c;已经年入百万。小编的前领导&#xff0c;农村出身毫无背景&#xff0c;但是抓住风口卖掉了手里的比特币全款买了学区房&#xff0c;让他的孩子赢在起跑线上。面对这些踩在风口上的幸运儿&#…

一小时快速搭建基于阿里云容器服务-Kubernetes的Web应用

本文面向的读者 如果您是一个Kubernetes的初学者&#xff0c;本文可以帮助你快速在云上搭建一个可实际使用的集群环境&#xff0c;并发布自己的第一个应用。你无须提前准备任何的硬件资源或者下载任何的软件包。 如果您已经有一个自建的Kubernetes集群&#xff0c;想要尝试阿…

VS Code Git 日常操作

文章目录1. 初始化Git仓库2. 新建分支3. 提交4. 同步远程4.分支切换5. 合并分支1. 初始化Git仓库 使用**ctrl**召唤出命令窗口 # 初始化Git仓库 git init2. 新建分支 点击右下角的master&#xff0c;上方就会出现一个输入框&#xff0c;点击正在创建新分支&#xff0c;输入…

bootstrap table 列拖动变宽

需要导入 colResizable-1.6.min.js /**_ _____ _ _ _ | | __ \ (_) | | | | ___ ___ | | |__) |___ ___ _ ______ _| |__ | | ___ / __/ _ \| | _ // _ \/ __| |_ / _ | _ \| |/ _ \| (_| (_) | | | \ \ __/\__ \ |/…

阿里产品专家:高情商的技术人,如何做沟通?

不愿沟通是固执&#xff0c;不会沟通是傻瓜&#xff0c;不敢沟通是奴隶。 ——德拉蒙德 工作中&#xff0c;你是否经常看到别人在会上谈笑风生、纵横捭阖&#xff0c;但自己却唯唯诺诺&#xff0c;不敢表达观点&#xff1f;即便鼓起勇气发言却不被重视&#xff0c;经常被人打断…

“刚毕业1年,做Python能挣多少?”网友:吹的不多..

01现状揭秘&#xff1a;Python的火持续燃烧程序员&#xff1a;心态崩了&#xff01;2020年转眼已经大半&#xff0c;在近几个月的榜单中&#xff0c;Python已经连续走上卫冕的道路&#xff0c;并且与Java的差距拉得更远了一些。以往与Java常呈现你追我赶之势&#xff0c;而这一…

阿里云正式推出内容平台“云栖号”:全面助力企业和个人上云决策

1月7日&#xff0c;阿里云官网正式推出“云栖号”&#xff08;https://yqh.aliyun.com/ &#xff09;&#xff0c;旨在为大家提供第一手的上云资讯&#xff0c;云产品快速入门&#xff0c;来自不同行业精选的企业上云案例&#xff0c;基于众多成功案例萃取而成的最佳实践&#…

bootstrap table 搜索列formatter之后,单字节搜索异常

bootstrap table 搜索列formatter之后&#xff0c;单字节搜索异常 最近发现搜索这边出现这个问题&#xff0c;这样搜索没有效果 后面发现是因为搜索列formatter之后就会出现这个问题&#xff0c;那么我们就多生成一列不使用formatter并隐藏这列 <!DOCTYPE html> <h…

完了!TCP出了大事!

来源 | 编程技术宇宙责编 | 晋兆雨封图 | CSDN 下载自视觉中国不速之客夜黑风高&#xff0c;乌云蔽月。两位不速之客&#xff0c;身着黑衣&#xff0c;一高一矮&#xff0c;潜入Linux帝国。这一潜就是一个多月&#xff0c;直到他们收到了一条消息高个&#xff1a;“上峰终于给我…

基于Flutter+FaaS的业务框架思考与实践

闲鱼将使用Flutter和FaaS来建设未来的技术开发体系&#xff0c;这是一项长期的规划&#xff0c;新的技术在现在看来犹如雾里看花&#xff0c;需要我们不断的思考&#xff0c;探索&#xff0c;实践才能渐渐描绘出它的轮廓。本文对此提供一种思考角度&#xff0c;对未来基于FaaSF…

机器学习在高德用户反馈信息处理中的实践

1.背景 作为国内领先的出行大数据公司&#xff0c;高德地图拥有众多的用户和合作厂商&#xff0c;这为高德带来了海量的出行数据&#xff0c;同时通过各个渠道&#xff0c;这些用户也在主动地为我们提供大量的反馈信息&#xff0c;这些信息是需要我们深入挖掘并作用于产品的&a…

div中同时存在文本和数字超过两行出省略号

div中同时存在文本和数字超过两行出省略号 设置文本超过两行出省略号出现下面问题&#xff0c;未到指定宽度就换行 width: 255px;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;word-wrap: break-word…

前端框架/工具汇总

文章目录一、数据框架1. vue2. react二、UI框架2.1. element2.2. element-plus2.3. Ant Design Vue2.4. Ant Design of React2.5. Bootstrap三、工具3.1. Fast Mock3.2. Easy Mock3.3. Mock语法/案例一、数据框架 1. vue https://cn.vuejs.org/ 2. react https://react.do…

没错!现在搞 Python 越来越难了!!

今天&#xff0c;想跟大家聊聊 Python 能力的提升。结合我最近这些年的Python学习、开发经验&#xff0c;发现 90% 的人在学Python时都会遇到下面这些问题&#xff1a;1.想学Python&#xff0c;但应用方向太多了&#xff0c;没编程经验根本不知道该怎么学...2.基础入门看似简单…

端计算Walle:2235亿次运算,为了无法计算的端智能价值

本文知识点提炼&#xff1a; 1、端计算在移动设备上的应用探索 2、技术方案与核心模块设计 3、总结与展望 背景 传统的云计算&#xff0c;使用的是端侧采集数据&#xff0c;云端处理消费&#xff0c;再反馈给端侧的模式。而伴随着数字化转型的浪潮、万物互联时代的到来&…

Serverless 解惑——函数计算如何访问 MySQL 数据库

函数计算&#xff08;Function Compute&#xff09;&#xff1a;函数计算 是事件驱动的全托管计算服务。使用函数计算&#xff0c;您无需采购与管理服务器等基础设施&#xff0c;只需编写并上传代码。函数计算为您准备好计算资源&#xff0c;弹性地可靠地运行任务&#xff0c;并…

ant-design-vue 环境搭建及入门

1.首先需搭建vue环境 2.安装环境&#xff08;根据官网&#xff09; npm install -g vue/cli &#xff08;建议国内不使用npm安装&#xff0c;使用cnpm这样会快点&#xff09;cnpm install -g vue/cli 3.新建一个项目 切换到需要创建项目文件夹下&#xff0c;运行创建项目命令…