【Git 学习笔记_22】Git 实用冷门操作技巧(上)

news2024/11/24 18:53:48

文章目录

  • 第十一章 Git 操作技巧与诀窍
    • 简介
    • 11.1 活用 git stash
    • 11.2 保存并应用 stash

第十一章 Git 操作技巧与诀窍

本章相关主题:

  • 活用 git stash(上) ✔️
  • 保存并应用 stash(上) ✔️
  • git bisect 进行调试
  • 使用 git blame 命令
  • 设置彩色命令行界面
  • 自动补全
  • 让 Bash 自带状态信息
  • 更多别名
  • 交互式新增提交
  • 用 Git 的图形界面交互式新增
  • 忽略文件
  • 展示与清理忽略文件

简介

本章将重点梳理 Git 的使用技巧,以便用于日常工作。例如在执行重要任务时被临时打断需要寄存工作区变更内容,或者使用 bisectblame 命令高效定位 bug,抑或是设置命令行的颜色与状态信息等。此外还将进一步梳理实用别名、根据指定的行级变更创建更清爽的 commit 提交、以及忽略文件的相关操作。

11.1 活用 git stash

本节演示如何使用 git stash 命令来快速寄存未提交的更改并再次读取这些内容。该操作在某项重要任务被临时打断(如紧急修复线上 bug)时非常实用,可以快速保存本地更改,恢复当前工作区;待临时任务结束后再还原之前的工作状态。利用 git stash 命令,还可以在寄存本地更改时设置是否保存暂存区(staging area)中的内容。

相关命令:

  • git stash:添加到寄存区(入栈)
  • git stash list:查看寄存区的存放列表
  • git stash pop:取回寄存区的内容(出栈)

实操示例如下:

# repo init
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_tips_and_tricks.git tiptrick
$ cd tiptrick
$ git checkout master
# do some changes
$ echo "Just another unfinished line" >> foo
$ git add foo
$ echo "Another line" >> bar
$ echo "Some content" > new_file
$ git status -s

git status -s

可见,git stash 只对暂存区及加入版本管理的文件生效(new_file 未被寄存)。

# using git stash
$ git stash
Saved working directory and index state WIP on master: b6dabd7 Update foo and bar
$ git status -s
?? new_file

查看 gitk

$ gitk master stash

结果如下:

gitk stash result

图 11-1 放入寄存区后的分支状态

foo 文件作如下修改:

# on Linux (BSD sed)
$ sed -i 's/First line/This is the very first line of the foo file/' foo
$ git add foo
$ git commit -m "Update foo"
[master 3646ef9] Update foo
 1 file changed, 1 insertion(+), 1 deletion(-)
# check stashed contents
$ git stash list
stash@{0}: WIP on master: b6dabd7 Update foo and bar

实测发现,Ubuntu 环境下 sed 命令为 sed -i 's/.../.../' foo

此时再查看分支状态:

$ gitk --reflog

结果如下:

result for gitk --reflog

图 11-2 完成临时任务并提交后的分支状态

完成临时任务后,取回 stash 命令寄存的内容如下:

$ git status -s
?? new_file
$ git stash pop
Auto-merging foo
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   bar
        modified:   foo

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        new_file

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (c008d2f149d0827cbc06879b3097bd690128e260)

值得注意的是,虽然原来暂存区的变更也一并存入了寄存区,但还原时 git 默认只把工作区内的变更还原了。

原理分析

上述演示中,foo 文件的一处修改先放到了寄存区;然后在处理临时任务时,对该文件的另一处内容作了修改并提交;之后再将寄存的变更重新还原到 foo 上,由于没有版本冲突,Git 作了自动合并。

根据 图 11-1 可知,加入寄存区后,Git 分别为索引区(index)及工作区(work area)创建了 commit 节点;这在临时任务提交后也可以佐证,如 图 11-2 所示。

stash 创建的 commit 对象存放在 refs/stash 命名空间下。其中,包含原暂存区信息的 commit 节点,称为 index on master(主分支上的索引信息);另一个包含工作区信息的节点,叫 WIP on master(主分支上正在进行中的工作信息,WIPWork In Progress 的缩写)。这些临时创建的节点信息,可以通过 git 的常规操作将更改重新还原到工作目录下。也就是说,一旦还原过程中发生版本冲突,也可以通过 git 处理冲突的常规流程进行处理。

知识拓展

通过刚才的演示得知,默认情况下,git 寄存或还原当前工作状态时,存在两个问题:

  • 未加入版本控制的文件不会自动 stash 到寄存区;
  • 还原只对工作区生效,尽管寄存了原暂存区的变更;

这两个问题都可以通过手动指定参数来解决。前者使用 git stash --include-untracked 解决;后者通过 git stash pop --index 解决:

$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_tips_and_tricks.git tiptrick
$ cd .\tiptrick\
$ echo "Just another unfinished line" >> foo; git add foo; echo "Another line" >> bar;echo "Some content" > new_file;
$ git stash --include-untracked
Saved working directory and index state WIP on master: b6dabd7 Update foo and bar
# Check untracked file (not existed):
$ git status -s
# Check gitk with 'stash' branch
$ gitk stash

查看结果如下:(Gitstash 上又新增一个节点来单独存放 不在版本控制内的 内容变更)

git stash --include-untracked

继续后面的操作,处理并提交临时任务,只是在还原寄存区的变更时,将原暂存区的变更也还原:

$ sed -i 's/First line/This is the very first line of the foo file/' foo
$ git add foo; git commit -m 'Update foo';
$ gitk --reflog

再次查看还原前的分支状态:

new version of gitk --reflog

这时,需要将原暂存区的变更内容一并还原到之前的状态:

$ git stash pop --index
$ git status -s
 M bar
M  foo
?? new_file
$ 

result for git stash pop --index

注意对比之前没加 --index 的输出内容。再次查看 gitk --reflog 予以验证,可以看到还原后的状态中,暂存区不同了:

gitk --reflog

此外,还可以在放入寄存区时,手动指定是否需要保留暂存区的变更:在执行 git stash 时通过标记 --keep-index 实现(也可以加 --include-untracked 包含不受版本控制的变更):

$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_tips_and_tricks.git tiptrick
$ cd .\tiptrick\
$ echo "Just another unfinished line" >> foo; git add foo; echo "Another line" >> bar;echo "Some content" > new_file
# keep changes in staging area 
# while stashing away untracked changes, too:
$ git stash --keep-index --include-untracked
Saved working directory and index state WIP on master: b6dabd7 Update foo and bar
# Check result (as expected)
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   foo

11.2 保存并应用 stash

寄存当前工作状态时,寄存区可能会有出现寄存状态,而默认的名称并不能区分要恢复的版本具体是哪个。本节将对这种情况进行处理,演示怎样给寄存区的存放记录命名,并恢复指定的版本:

# init repo
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_tips_and_tricks.git tiptrick
$ cd .\tiptrick\
$ echo "Just another unfinished line" >> foo; git add foo; echo "Another line" >> bar;echo "Some content" > new_file
$ git stash --keep-index --include-untracked
Saved working directory and index state WIP on master: b6dabd7 Update foo and bar
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   foo
$ git stash list
stash@{0}: WIP on master: b6dabd7 Update foo and bar
# create stash and name the stash item
$ git stash save 'Updates to foo'
Saved working directory and index state On master: Updates to foo
$ git stash list
stash@{0}: On master: Updates to foo
stash@{1}: WIP on master: b6dabd7 Update foo and bar
# Create a new stash by changing bar:
$ echo "Another change" >> bar
$ git stash save 'Made another change to bar'
Saved working directory and index state On master: Made another change to bar
# check stash list
$ git stash list
stash@{0}: On master: Made another change to bar
stash@{1}: On master: Updates to foo
stash@{2}: WIP on master: b6dabd7 Update foo and bar

解决了寄存记录的命名问题,就可以在应用寄存信息的同时保留该记录:

# apply stash info
$ git stash apply 'stash@{1}'
# use --quiet to suppresses the status output
$ git stash apply --quiet 'stash@{0}'
$ git stash list
stash@{0}: On master: Made another change to bar
stash@{1}: On master: Updates to foo
stash@{2}: WIP on master: b6dabd7 Update foo and bar

可以看到,寄存列表在成功还原后仍在存在。应用某个寄存区的记录,语法为:git stash apply stash@{stash-no}

发散

寄存列表如何删除呢?执行命令 git stash drop stash@{stash-no} 即可:

$ git stash list
stash@{0}: On master: Made another change to bar
stash@{1}: On master: Updates to foo
stash@{2}: WIP on master: b6dabd7 Update foo and bar
$ git stash drop 'stash@{1}'
Dropped stash@{1} (ef0c0e7de00803e61f7a2a02df581bedb143778b)
$ git stash list
stash@{0}: On master: Made another change to bar
stash@{1}: WIP on master: b6dabd7 Update foo and bar

对比之前的默认版本,手动应用或删除寄存区版本提供了更多的灵活性,可以避免一个操作失误。默认情况下,成功 stash pop 一个版本后,该版本会从寄存区自动删除;但若还原过程受阻(如发生冲突)则会被保留下来,即便用户处理了这个冲突,寄存区的版本仍不会自动删除。这就为后续的版本还原埋下了隐患。而手动控制应用或删除,就可以很好地解决这个问题。

小试牛刀

git stash 命令也能把调式信息应用到项目中。比如在调式代码过程中,为了定位 bug 而在项目中加入了不少调式用的语句,调试结束后不必手动删除所有的调试语句。相反,可以将这些语句通过 git stash save "Debug info stash" 寄存到 git 中并命名。这样在今后再次调试时,可以应用该寄存版快速初始化上一次的调试环境。

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

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

相关文章

并发性服务器

同一时刻能处理多个客户端 多进程&#xff1a; int init_tcp_ser(const char *ip,unsigned short port) {int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){perror("fail socket");return -1;}struct sockaddr_in ser;ser.sin_family AF_INET;ser.sin_por…

【Python 千题 —— 基础篇】简易购物车

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 设计一个在线购物车系统,该系统能够管理用户的购物行为。用户可以将商品添加到购物车中、移除购物车中的商品、查看购物车中的商品列表,并计算…

nerfstudio半离线配置踩坑记录

安装torch2.1.2 with cuda11.8 由于清华镜像源&#xff08;包括阿里源和豆瓣源&#xff09;都没有torch2.1.2cu118的包&#xff0c;因此只能从pytorch官网下载。 服务器上直接通过下面pip的方式安装会由于网络原因中断&#xff0c;无奈只能在本地先把torch的包下载下来再上传到…

8.Linux_Makefile

Makefile 1、基本知识 语法&#xff1a; 目标:依赖 //依赖可以是0个或多个&#xff0c;依赖之间用空格分隔命令 //命令前面必须有tab键 目标&#xff1a;最终要生成的文件依赖&#xff1a;生成目标所需要的文件命令&#xff1a;怎么样通过依赖来生成目标的 make访问mak…

pve首页查看功耗拓展脚本

作者&#xff1a;TP唉 https://www.bilibili.com/read/cv26924314/?jump_opus1 出处&#xff1a;bilibili 如图所示想要这全方位信息很难吗&#xff1f;不&#xff0c;很简单只需要在shell里粘贴两串代码轻松搞定&#xff01; 命令1&#xff1a;(curl -Lf -o /tmp/temp.sh ht…

CleanClip: macOS 上最干净的剪贴板管理工具

在日常工作中,我们经常需要复制粘贴各种内容。但是 macOS 自带的剪贴板功能非常有限,只能保存最后一次复制的内容。这就是为什么我们需要一个强大的剪贴板管理工具 - CleanClip。 CleanClip 是什么? CleanClip 是一款专为 Mac 用户设计的剪贴板管理工具&#xff0c;它可能是 …

day13JS-MoseEvent事件

1. MouseEvent的类别 mousedown &#xff1a;按下键mouseup &#xff1a;释放键click &#xff1a;左键单击dblclick &#xff1a;左键双击contextmenu &#xff1a;右键菜单mousemove &#xff1a;鼠标移动mouseover : 鼠标经过 。 可以做事件委托&#xff0c;子元素可以冒泡…

FUNCTION_ALV 下拉框的实现

下拉框可以用drdn_field或者使用DRDN_HNDL&#xff0c;这个文章主要是下拉框的基本使用&#xff0c;核心就是在fieldcat内表里面设置好下拉框的字段或者组的编号 文章目录 drdn_field使用DRDN_HNDL复制状态完整代码核心代码运行结果 drdn_field 使用DRDN_HNDL 复制状态 完整代码…

AcWing852.spfa判断负环

cnt数组表示&#xff1a;cnt【j】表示边j #include<iostream> #include<cstring> #include<algorithm> #include<queue> #define N 2010 #define M 10010 using namespace std; int n,m; int h[N],w[M],e[M],ne[M],idx; int dis[N],cnt[N]; bool st[N…

ps笔刷设置使用介绍

形状动态 建议开启&#xff0c;作用是笔刷会有粗细变换 传递 不透明度抖动 . 选择钢笔压力&#xff0c;作用就是压感&#xff0c;压力值&#xff0c;有粗细深浅轻重变化 调到这画的时候就不会特别浅 流量抖动 选择钢笔压力&#xff0c;开了就有虚边 方便画过渡。 一般画…

JavaWeb实战教程:如何一步步构建房产信息管理系统?MySQL助力数据管理

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Unable to delete file: .....(路径) signing-config.json无法删除

运行了一个去年很久之前的项目,在打包的时候弹出这个错误,提示要删除这个json文件,尝试了很多次无法删除,最后想到可能是文件权限的问题 Execution failed for task :app:clean. > Unable to delete file: D:\xxxxxx\xxxxxx\app\build\intermediates\signing_config\debug\…

基于Python、Django的企业门户网站设计

一、框架设计 1.1 创建项目和应用 企业门户网站的结构如下图所示。 因此,在文件夹下创建hengDaProject项目。在该项目下添加homeApp、aboutApp、newsApp、productsApp、serviceApp、scienceApp、contactApp应用。该操作参见:https://blog.csdn.net/qq_42148307/article/det…

【归纳总结】常见排序算法及其实现:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快排、归并排序

思维导图&#xff1a; 目录 思维导图&#xff1a; 一、插入排序 1.直接插入排序&#xff1a; a:基本思想&#xff1a; b:基本步骤&#xff1a; c:复杂度分析 d:Java代码实现&#xff1a; 2.希尔排序&#xff08;缩小增量排序&#xff09; a:基本思想&#xff1a; c…

python_每天定时向数据库插入数据

每天的零点十分&#xff0c;定时向mysql数据库插入&#xff0c;昨天新增的文件和昨天下载文件的记录。第一次运行的时候&#xff0c;会全量同步昨天之前的数据。 import os import threading from datetime import datetime, timedelta import time import schedule from pymy…

仓颉编程语言亮相全国大学生计算机系统能力大赛

2024年8月18日-22日&#xff0c;由全国高等学校计算机教育研究会、系统能力培养研究专家组、系统能力培养研究项目发起高校主办&#xff0c;杭州电子科技大学承办的2024全国大学生计算机系统能力大赛编译系统设计赛&#xff08;华为毕昇杯&#xff09;及操作系统设计赛在杭电下…

企业防泄密首选!哪款公司防泄密软件更强?看这里,一文解惑!

早在2011年&#xff0c;前苹果员工Paul Devine泄露苹果公司的机密信息&#xff0c;涉及新产品的预测、计划蓝图、价格和产品特征&#xff0c;还为苹果公司的合作伙伴、供应商和代工厂商提供的关于苹果公司的数据&#xff0c;这使得这些供应商和代工厂商拥有了与苹果谈判的筹码&…

Wireless Communications - 模拟调制

AM/DSB/VSB/SSB的调制与解调 AM DSB SSB 滤波法 相移法 VSB 相干解调 线性调制的抗噪声分析 DSB SSB FM/PM 的调制与解调 NBFM WBFM 调频信号的产生和解调 模拟调制对比

SpringBootFFmpeg实现M3U8切片转码播放(本地)

文章目录 参考概述代码pom.xmlffmpegFFmpegUtilsMediaInfoTranscodeConfig application.ymlApplicationUploadControllerindex.html 测试 参考 springboot-ffmpeg-demo gitee代码 SpringBoot FFmpeg实现一个简单的M3U8切片转码系统 FFmpeg音视频核心技术精讲 - 百度网盘 概…

【STM32】红外遥控

红外遥控&#xff0c;掌握了就能装逼了&#xff0c;哈哈哈哈哈哈。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 1 器件特性 这里载波发射周期的发射与不发射时间实际上是因为载波是38kHz、占空为三分之一的方波&a…