前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >5. Git 进阶高频操作

5. Git 进阶高频操作

作者头像
acc8226
发布于 2022-05-17 06:43:45
发布于 2022-05-17 06:43:45
73800
代码可运行
举报
文章被收录于专栏:叽叽西叽叽西
运行总次数:0
代码可运行

stash 储藏

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug

--include-untracked 参数可以额外储藏新的未被追踪的文件。 --all 选项将收集所有未跟踪的文件以及在 .gitignore 和 排除文件中明确忽略的文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 更推荐对 stash 加一些注释
`git stash save 'message'` 
`git stash save --include-untracked 'message'` 
`git stash save --all -untracked 'message'` 

Git 把 stash内容存在某个地方了(包含了工作区 和 暂存区的内容),但是需要恢复一下,有两个办法:

  • git stash apply恢复,但是恢复后,stash内容并不删除,你需要用 git stash drop来删除;
  • 另一种方式是 git stash pop,恢复的同时把 stash 内容 pop 出去.

按保存时间由近及远的顺序列举出储藏栈。 git stash list

恢复指定的stash, 只需要指定序号, stash@{0}代表最新的stash。依次是次新的数据,按照时间新到旧排序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git stash apply stash@{0}

此时, 变更内容都还原到了工作区.

清空所有 stash 信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git stash clear

要用其他更基础的 Git 命令来达到相同的效果,需要手动创建一个新分支,在新分 支上提交所有修改,之后回到之前的分支继续工作,最后把你保存的分支状态恢复到新的工作目录。如果还不清楚,下面将展示这样的过程。

有时,储藏你的变更会导致你的分支上出现一个全新的开发序列,并且在最终还原你的储藏状态到所有变更之前时可能没有直接意义。此外,合并冲突可能会导致弹出操作难以进行。然而,你可能仍需要恢复你储藏的内容。在这种情况下, git 提供了git stash branch 命令来帮助你。这条命令基于储藏条目生成时的提交,会将保存的储藏内容转换到一个新分支。

因此我们重置一些状态,采用一些不同的方法,创建一个名为 mod 的新分支来包含那些储藏的变更。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 $ git stash branch mod
# 操作 mod 分支
...
# 切回 master 分支,并进行合并
 $ git checkout master
 Switched to branch 'master
 $ git merge mod

以下展示在没有 stash 命令之前怎么保存临时提交

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 常规开发试程中断

# 创建一个新分支来保存状态
 git checkout -b saved_state
 git commit -a -m "Saved state"

#回到之前的分支进行更新
 $ git checkout master

# 编辑紧急修复
 git commit -a-m "Fix something."

# 恢复保存的状态到工作目录
git checkout saved state
git reset -soft HEAD

#..继续之前我们离开时的工作

cherry-pick

git cherry-pick提交命令会在当前分支上应用给定提交引入的变更。这将引入一个新的独特的提交。严格来说,使用git cherry-pick并不改变版本库中的现有历史记录,而是添加历史记录。

跟其他通过应用 diff 来引入变更的Git操作一样,你可能需要解决冲突来完全应用给定提交的变更。

git cherry-pick 命令通常用于把版本库中一个分支的特定提交引入一个不同的分支中。

git cherry-pick <提交号1> <提交号2> <提交号3> 挑选多个提交合并, 提交之间用空格相隔

挑选区间, 左开右闭.其中,<start-commit>在时间上必须早于<end-commit> git cherry-pick <start-commit>..<end-commit>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git cherry-pick <subcommand>

    --quit                end revert or cherry-pick sequence 结束pick操作,但是不会影响冲突之前多个提交中已经成功的
    --continue            resume revert or cherry-pick sequence  //继续下个操作
    --abort               cancel revert or cherry-pick sequence 直接打回原形

    -n, --no-commit       don't automatically commit 不自动提交
    -e, --edit            edit the commit message 编辑提交信息
    -s, --signoff         add Signed-off-by:
    -m, --mainline <parent-number>
                          select mainline parent
    --rerere-autoupdate   update the index with reused conflict resolution if possible
    --strategy <strategy>
                          merge strategy
    -X, --strategy-option <option>
                          option for merge strategy
    -S, --gpg-sign[=<key-id>]
                          GPG sign commit
    -x                    append commit name
    --ff                  allow fast-forward
    --allow-empty         preserve initially empty commits
    --allow-empty-message
                          allow commits with empty messages
    --keep-redundant-commits
                          keep redundant, empty commits

如果在git cherry-pick 后加一个分支名,则表示将该分支顶端提交进cherry-pick,如:git cherry-pick <branch name>

rebase 交互式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rebase -i

如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

此模式下你可以重新排序、编辑、删除,把多个提交合并成一个,把一个提交分离成多个, 然后把它们放回原来的分支或者不同的分支。

git rebase -i HEAD^ 区间范围为 [HEAD, HEAD] git rebase -i HEAD~2 区间范围为 (HEAD~2, HEAD] ,为左开右闭区间。 git rebase -i HEAD~3 区间范围为 (HEAD~3, HEAD]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rebase -i HEAD~3

pick ba16ab5 1
pick 4e71e75 aiya
pick cc4b570 someMessage

# Rebase c277d53..cc4b570 onto c277d53 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label

其中 s, squash 将会所在行所在的提交合并到前一个提交中

一般为方便确认 rebase 的返回,通常和 git show-branch --more=nums [branchName] 搭配使用。

分支开发策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在 dev 分支上,也就是说,dev 分支是不稳定的,到某个时候,比如 1.0 版本发布时,再把 dev 分支合并到 master上,在 master 分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往 dev 分支上合并就可以了。

选择分支的衍合 or 合并

衍合的风险

呃,奇妙的衍合也并非完美无缺,要用它得遵守一条准则: 一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些尚未公开的提交对象,就没问题。如果衍合那些已经公开的提交对象,并且已经有人基于这些提交对象开展了后续开发工作的话,就会出现叫人沮丧的麻烦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
NIO非阻塞网络编程三大核心理念
1.capacity 容量:作为一个内存块,Buffer具有一定的固定大小,也称为【容量】。 2.position 位置:写入模式时代表写数据的位置。读取模式时代表读取数据的位置。 3.limit 限制:写入模式,限制等于buffer的容量,读取模式下,limit等于写入的数据量。
IT架构圈
2020/12/02
4010
NIO非阻塞网络编程三大核心理念
BIO、NIO、IO多路复用模型的演进&Java NIO 网络编程
上文介绍了网络编程的基础知识,并基于 Java 编写了 BIO 的网络编程。我们知道 BIO 模型是存在巨大问题的,比如 C10K 问题,其本质就是因其阻塞原因,导致如果想要承受更多的请求就必须有足够多的线程,但是足够多的线程会带来内存占用问题、CPU上下文切换带来的性能问题,从而造成服务端崩溃的现象。怎么解决这一问题呢?优化呗,所以后面就有了NIO、AIO、IO多路复用。本文将对这几个模型详细说明并基于 Java 编写 NIO。
王二蛋
2024/01/18
7780
Java网络编程--NIO非阻塞网络编程
从Java1.4开始,为了替代Java IO和网络相关的API,提高程序的运行速度,Java提供了新的IO操作非阻塞的API即Java NIO。NIO中有三大核心组件:Buffer(缓冲区),Channel(通道),Selector(选择器)。NIO基于Channel(通道)和Buffer(缓冲区))进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中,而Selector(选择器)主要用于监听多个通道的事件,实现单个线程可以监听多个数据通道。
CodingDiray
2019/09/25
9380
Java网络编程--NIO非阻塞网络编程
使用NIO实现非阻塞式(相对的)多人聊天室
1.服务端 package d02_test; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.chan
2020/10/23
5790
Netty 入门篇 Day 3---网络编程
在阻塞模式下,会导致 线程暂停 ssc.accept(); // 阻塞的方法 会导致线程暂停,一直等到有client连接 才继续工作 channel.read(buffer); // 阻塞的方法 会导致线程暂停,一直等client发送信息 才继续进行读操作 服务器端的单线程模式下,阻塞方法会导致这个线程暂停(闲置); 同时 多个client相到受影响,几乎不能正确工作,需要服务器端的多线程支持 服务器端的多线程模式缺点:1) 占用内存多 2)多线程切换,带来比较大的内存开销
猫头虎
2024/04/08
1150
Netty 入门篇 Day 3---网络编程
NIO核心组件
上节我们讲述了NIO以及IO多路复用的的基础知识,本来这节是要讲述Reactor模式,但是我在写Reactor模式的时候,发现关于NIO的核心组件没有讲述,为了避免读者一头雾水,我们临时插入一片关于NIO核心组件的文章。
shysh95
2020/06/04
5230
NIO核心组件
【Netty】NIO 网络编程 聊天室案例
① 服务器 客户端 通信 : 服务器 与 客户端 实现 双向通信 ; 服务器可以写出数据到客户端 , 也能读取客户端的数据 ; 客户端可以写出数据到服务器端 , 也可以读取服务器端的数据 ;
韩曙亮
2023/03/27
1.4K0
【Netty】NIO 网络编程 聊天室案例
Java NIO 核心组件学习笔记
对于I/O操作,根据Oracle官网的文档,同步异步的划分标准是“调用者是否需要等待I/O操作完成”,这个“等待I/O操作完成”的意思不是指一定要读取到数据或者说写入所有数据,而是指真正进行I/O操作时,比如数据在TCP/IP协议栈缓冲区和JVM缓冲区之间传输的这段时间,调用者是否要等待。
Java团长
2018/08/07
4600
网络编程模式
今晚是个下雨天,写完今天最后一行代码,小鲁班起身合上电脑,用滚烫的开水为自己泡制了一桶老坛酸菜牛肉面。这大概是苦逼程序猿给接下来继续奋战的自己最好的馈赠。年轻的程序猿更偏爱坐在窗前,在夜晚中静静的享受独特的泡面香味。。。
php007
2019/08/05
4900
网络编程模式
Java NIO?看这一篇就够了![通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 ✎前言 现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城
全栈程序员站长
2022/09/08
3490
Java NIO?看这一篇就够了![通俗易懂]
NIO详解
NIO (New lO)也有人称之为java non-blocking lO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java lO API。
冬天vs不冷
2025/01/21
1870
NIO详解
Netty3学习笔记(一) --- 传统IO与NIO比较
  (4)使用传统的I/O程序读取文件内容, 并写入到另一个文件(或Socket), 如下程序:
挽风
2021/04/13
2650
Netty3学习笔记(一) --- 传统IO与NIO比较
JavaIO流:NIO梳理
NIO 也叫 Non-Blocking IO 是同步非阻塞的 IO 模型。线程发起 IO 请求后,立即返回。同步指的是必须等待 IO 缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待 IO 缓冲区,可以先做一些其他操作,但是要定时轮询检查 IO 缓冲区数据是否就绪。
栗筝i
2022/12/02
3240
JavaIO流:NIO梳理
Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/11/21
5370
Netty-nio
channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层
sgr997
2022/11/10
7170
Netty-nio
Netty网络编程第一卷
channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层
大忽悠爱学习
2022/05/06
7140
Netty网络编程第一卷
Java NIO 同步非阻塞应用实例
项目地址:https://github.com/windwant/windwant-service/tree/master/io-service
WindWant
2020/09/11
5900
NIO从入门到踹门
java.nio全称java non-blocking IO,是指JDK1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络(来源于百度百科)。
java技术爱好者
2020/09/22
9680
NIO从入门到踹门
NIO学习四-Selector
前面我们已经简单的学习了channel,知道channel作为通道,可以在通道中进行读写操作,同时知道ByteChannel是双向的。对于NIO的优势在于多路复用选择器上,在Nginx、Redis、Netty中都有多路复用的体现。因此学习Selector是有必要的。
路行的亚洲
2020/07/16
3930
🎯 Java NIO 基础
✏️ 写在前面的话: Netty本质是一个NIO框架,适用于服务器通讯相关的多种应用场景。 Netty作为一款基于Java开发的高性能网络框架,想要从认识到熟悉再到掌握最终理解,因此我们需要从最基础的NIO开始学习。如果你已经学习并掌握了NIO相关知识,那么可以直接进入Netty相关文章的学习;如果没有了解过也没有关系,那我们就从当前文章开始学习吧!🎉🎉🎉 这里我们先简单了解一下这一篇文章中我们将要学习的内容: 首先是NIO的基本介绍,了解NIO的三大组件 ByteBuffer 字节缓冲区的基本使用
爱吃糖的范同学
2023/02/11
8270
相关推荐
NIO非阻塞网络编程三大核心理念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档