git常用操作汇总大全

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,入职小红书广告投放开发,很高兴认识大家
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2024计划中:校招入职,稳扎稳扎
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

前言

对于程序员来说,熟练的掌握git操作是最基本的东西了,只不过会被大多数校招生或者刚工作的人所遗漏,总是过分的关注技术,但是连基本的git操作都不曾熟练掌握,因此本文章在这里为大家介绍一下。

工作中git基本操作

git配置

首先需要安装git 并且配置 git的一些基本信息(这些信息一般公司都会提供,所以按照公司要求配置即可)

idea中使用git拉项目

一般来说 配置好了以后,从idea中远程 clone到本地,需要,file --> new --> Project from Version Control 填写好对应的clone地址即可。

此时项目就clone下来了。其实针对git来说 操作其实就有数的几个 add commot push,以及每次都要去master pull下来最新的分支。但是针对这种情况又会有多种操作,比如说merge 和 rebase(重点)。

git约定俗成

按照约定俗成,一般来说,每次开发新需求都要新建一个新的分支,具体的分支命名要按照项目 + 团队的风格!!!(这个很重要)

新分支都是从master创建的,理论上新分支push上的版本其实是优先于master的,但是会出现这样的一种情况,因为大家都是多个分支并行开发,别人的分支合并进master,而你自己的分支还是依赖于之前的master。

出现以上这种问题,说明master分支的代码领先于自己的分支,此时需要将master分支代码合并到自己的分支上。因为在我的分支正在开发中,同事完成的分支被合并了,此时的master又被更新了一次,而我的分支仍然是没有合并同事之前的master,所以此时我的分支就落后于master了,所以此时我需将master上的新代码合并到我自己新建的分支上来。

这个其实就涉及到了两个比较关键的技术了,merge 和 rebase。

git stash

git stash的功能其实概括起来就是,当前的分支还没有commit,但是需要切出去,所以需要暂存下这些修改,毕竟如果还没有commit的话,你切出去,实际上本次修改的代码其实就没有了,通过这种方式,可以很方便的切出去,等到切回来的时候,使用git unstash即可。

给大家举一个例子吧。

比如说你正在开发一个新分支,但是远程的master更新了,但是你本地的master还没有更新,那么你提交代码的时候,你肯定是要和线上最新的master合并了,然后再提交自己的新分支呀。那么这个其实就能用到了git stash了。

首先git stash,然后切换master,然后pull master更新,然后切换回去新分支,git unstash,然后merge合并master的变更,然后解决文件冲突,然后push,这样就能保证新分支时依赖于最新的master版本。

merge的常见问题

修改远程仓库代码:

修改本地仓库代码:

提交本地仓库代码并拉取,发现代码产生冲突,点击Merge进行合并:

点击箭头将左右两侧代码合并到中间区域:

冲突合并完成后,点击Apply生效:

提交代码并推送到远程。

git提交版本

点击idea左侧的git就能看到各个分支的版本历时树了。

单击左下角git即可。还是和 git stash相关的是,如果切换出去分支就要add commit一次,那么其实就会在git 提交版本历史中有一个不美观的版本结构树。因此还是需要广泛使用git stash 和 git unstash

git 回滚

这个功能是有的时候,一不小心在master分支上,git unstash了一下,导致错误了merge冲突,这个时候,完全可以点击 git rollback,然后回滚回去就可以了。

git 更新最新的分支情况

b新分支push上去了,a分支待合并,但是在merge中找不到对应push上去的b分支,针对这种情况,需要在idea上的控制台输入:git fetch

新分支每次push前是基于最新的master

每次push分支之前,都需要和 master merge一下,防止给别人带来额外的merge冲突。

merge 和 rebase(具体内容都是参考博客:流浪在世界的博客内容,图片也是借用,再次声明!!!)

rebase本质点来说可以使得你的代码的版本提交树是线性的,而merge却不是,会有很多分叉,感觉不太美观,当然最终怎么样取决于 团队开发的约定俗成。

git rebase应用

先准备好一个主基线:

在此基础上创建一个分支:名字为fenzhi_1,创建另一个分支,名字为fenzhi_2

最开始fenzhi_1和fenzhi_2以及master的基线是同一个。

同一分支的rebase操作

当前分支为fenzhi_2,共有三个提交记录:

在第一次修改上进行右击鼠标:选择图中的选项,翻译一下就是在此处进行交互式改变基址。

交互式可以理解为可自定义的选择不同rebase行为进行操作。

然后就会出现这个页面,点击squash进行合并即可。

执行结果看一下:

如果自己分支的几个提交都是本地的,还没有提交到远程分支fenzhi_2上,那么就可以直接push推到远程,但一般我们总要合自己代码到dev/test,所以必然是已经提交到自己远程分支上了, 此时当你去push你的commit时,会再次与你远程分支的commit合并,之前本地rebase的那些commit又会出现了。

若选择force push呢,翻译过来就是强制推送,看一下操作结果:有个提示,翻译一下就是:强制推送,可能会覆盖远程服务器的提交。

在push中选择 force push。

若这个远程分支只有你一个人在开发:强制推送是可以的,没有人会在你rebase没完成时提代码,可以直接理解为用你本地分支的状态区覆盖掉远端origin分支的状态,也就是执行过后,本地的分支什么样,远端分支就什么样

分支跟master之间的rebase操作

Rebase的本意是改变基线,意思就是当从master拉取的分支1开发一段时间后,master也提交了几个版本,这就使得分支1的基线与现在的master不是同一个版本。需要将分支1的基线改成最新master。那就需要rebase操作了。看案例效果:

看一下fenzhi_2的基线是在提交id为1639f5db的基础上拉的分支,然后做了俩次变更

再看一下master的提交记录:master在 1639f5db上提交了一次变更。

这就造成了fenzhi_2的基线不是最新的master了,现在要将fenzhi_2的基线改为提交id为f7ec72e7,看下面操作

本地分支改为fenzhi_2:

在master上右击鼠标:第二步操作翻译一下就是在master基础上改变fenzhi_2的基线。

点击操作:若看到有冲突,手动处理一下即可,

可以看到同一个位置都有改动,这就根据实际情况合并代码了,这里我的目的是master的改动和本分支的改动都要保留。

解决完后,会自动弹出一个窗口:是提交信息的修改,这个也是根据实际情况定,这里我不改,点击继续rebase。

看结果:提交id为f7ec72e7的成为了fenzhi_2的基线。

接下来push:可以看到push有俩个操作,一个push一个是force push(强制推送)。

若分支是自己使用,那我们就强制推送。本地的分支提交记录覆盖远程的。

上面的操作是分支改变基线,那反过来操作呢,在master上rebase呢。

看一下分支fenzhi_3:这个分支做了俩次变更

Master也做了俩次变更

在master上进行rebase onto fenzhi_3:

可以看到有个提示:

大概意思就是会对master的提交记录进行修改,看下执行结果:

发现分支的提交记录在master记录之前,这个与merge操作是相反的。继续操作push

可以看到上面提示,若点击合并呢:可以看到分支的提交跟master在一条线上,但最上面又有一条合并记录。

若点击的是rebase呢:可以看到是将分支fenzhi_3的提交放在了最前面。这个操作就模拟了代码merge,但提交记录是一条线。这个才是我们的本意。

相关推荐
mqiqe6 分钟前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin8 分钟前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
少说多做34319 分钟前
Android 不同情况下使用 runOnUiThread
android·java
知兀20 分钟前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑202042 分钟前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深43 分钟前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__1 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞1 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货1 小时前
Rust 的简介
开发语言·后端·rust