【Git基础】常用git命令(二)

news2024/11/17 19:30:44

文章目录

    • 1. 合并commit为一个
      • 1.1 git commit --amend
      • 1.2 git rebase -i
      • 1.3 git reset
      • 1.4 示例
    • 2. 修改commit的内容
      • 2.1 git commit --amend
      • 2.2 git rebase -i
      • 2.3 git cherry-pick
      • 2.4 git reflog和git reset
    • 3. 查看commit内容
      • 3.1 git log
      • 3.2 git log --oneline
      • 3.3 git log -[length]
      • 3.4 git log --skip=[skip]
      • 3.5 git log -p
      • 3.6 git log --stat
      • 3.7 git shortlog
      • 3.8过滤
      • 3.9 git show [commit_id]

1. 合并commit为一个

在使用git的时候,我们可能针对同一个任务由多次提交,比如我们针对同一个feature可能由多个同事修改了不同部分,但是多个提交让我们的版本管理显得比较凌乱,此时我们可以合并多个commit为一个。

1.1 git commit --amend

它是一个用于修改最近一次提交的 Git 命令。当你想要更改最近的提交消息、添加遗漏的文件更改或者调整已经提交的文件时,可以使用这个命令。需要注意的是,这个操作会改变提交的哈希值,因此在共享的分支上使用时要小心。

  1. 添加遗漏的更改: 如果你意识到在最近的提交中遗漏了某些更改,可以先将遗漏的文件添加到暂存区,然后使用git commit --amend将它们添加到最近的提交中。例如:
    git add forgotten-file.txt
    git commit --amend --no-edit
    
    这将把forgotten-file.txt添加到最近的提交中,并保留原来的提交消息(因为使用了--no-edit选项)。
  2. 调整已提交的文件: 如果你想要修改已提交的文件,可以先对文件进行更改,然后将更改的文件添加到暂存区,并使用git commit --amend将它们合并到最近的提交中:
    # 对文件进行更改
    git add modified-file.txt
    git commit --amend --no-edit
    
    这将把modified-file.txt的更改添加到最近的提交中,并保留原来的提交消息,这就相当于合并了本次提交跟上一次提交,并且是保留上一次提交的消息。

请注意,git commit --amend命令会创建一个新的提交对象并替换原来的提交。这意味着提交哈希值会发生变化。在与他人共享的分支上执行此操作时要谨慎,因为它可能导致分支历史的不一致。

1.2 git rebase -i

这种方法使用 Git 的交互式变基功能(interactive rebase),允许你修改 commit 历史。以以下 commit 历史为例:

A---B---C---D---E  (main)

假设你想要将提交 C、D 和 E 合并为一个提交。你可以这样操作:

  1. 切换到你要修改的分支(例如 main):
    git checkout main
    
  2. 使用git rebase -i选择要合并的提交范围。要将 C、D 和 E 合并,我们需要从 B 开始进行变基:
    git rebase -i B^
    
  3. 这将打开一个文本编辑器,显示类似于以下内容的提交列表:
    pick C
    pick D
    pick E
    
  4. 将第二个和第三个提交(D 和 E)的操作从pick改为squash(或简写为 s):
    pick C
    squash D
    squash E
    
  5. 保存并关闭编辑器。这将再次打开一个编辑器,让你编辑新的提交消息。创建一个合并了 C、D 和 E 的新提交消息,然后保存并关闭编辑器。
  6. 此时,commit 历史将变为:
    A---B---F  (main)
    
    F 是新的合并提交。

1.3 git reset

这种方法将撤销提交,但保留工作区的更改。然后,你可以创建一个新的提交,包含之前多个提交的更改。以相同的例子为参考:

  1. 切换到你要修改的分支(例如 main):
    git checkout main
    
  2. 使用git reset命令回退到提交 B,并使用--soft选项保留工作区更改:
    git reset --soft B
    
  3. 现在,使用git commit创建一个包含 C、D 和 E 更改的新提交。在提交时,添加一个描述性的提交消息:
    git commit -m "合并 C, D 和 E 的更改"
    
  4. 此时,你的 commit 历史将变为:
    A---B---F  (main)
    
    F 是新的合并提交。

1.4 示例

  1. 添加了3个commit
    在这里插入图片描述
  2. 使用git rebase -i <hash>
    在这里插入图片描述
    将最后两个pick改为squash
  3. 编辑commit信息
    在这里插入图片描述
    我这里将下面的两个信息注释,将第一条修改为:feat:add new declaration
    保存后会自动完成commit,然后再push,三个commit就合并为一个了
  4. 可视化
    在这里插入图片描述

2. 修改commit的内容

2.1 git commit --amend

git commit --amend命令允许你修改最近一次的commit。这将使用当前的暂存区作为新的提交内容。如果暂存区没有任何改动,这个命令可以用来修改commit信息。

举个例子:
假设刚刚提交了一个commit,但是发现有个文件忘记添加了。可以按照以下步骤操作:

git add forgotten_file.txt
git commit --amend

接下来会打开一个文本编辑器,可以在其中修改commit信息。保存并关闭编辑器后,新的commit将替换之前的commit。
在这里插入图片描述

2.2 git rebase -i

git rebase -i命令允许你在一个交互式界面中修改过去的多个commits。您可以修改提交顺序、合并、拆分以及编辑提交信息。

一个例子:
假设你想修改倒数第三个commit,可以按照以下步骤操作:

git rebase -i HEAD~3

这将显示一个类似以下内容的列表:

pick f392171 Commit message 1
pick 58a9d84 Commit message 2
pick b6a0f7c Commit message 3

将您想要修改的commit行前的pick改为edit,然后保存并关闭文件。例如,我们想修改第二个commit:

pick f392171 Commit message 1
edit 58a9d84 Commit message 2
pick b6a0f7c Commit message 3

现在,Git将回滚到第二个commit。您可以进行任何修改,例如添加、删除或修改文件。完成后,将更改添加到暂存区:

git add modified_file.txt

然后,运行git commit --amend修改提交信息。完成后,继续rebase过程:

git rebase --continue

如果在rebase过程中遇到冲突,需要解决冲突,将解决冲突后的文件添加到暂存区,然后继续rebase过程。

如果在rebase过程中遇到冲突,需要解决冲突,将解决冲突后的文件添加到暂存区,然后继续rebase过程。

2.3 git cherry-pick

git cherry-pick命令可以将一个分支上的特定commit应用到另一个分支。这对于修改特定commit的内容非常有用,尤其是在涉及多个分支的情况下。

例子:
假设有两个分支:masterfeature,您想要修改feature分支上的某个commit。可以按照以下步骤操作:

首先,检查feature分支上的commit历史并找到要修改的commit(例如,a123456)。然后在master分支上创建一个新分支:

git checkout master
git checkout -b temp

接下来,使用git cherry-pick命令将要修改的commit应用到新分支:

git cherry-pick a123456

现在,可以修改该commit的内容。完成修改后,将更改添加到暂存区,并使用git commit --amend修改提交信息。最后,将修改后的commit合并回feature分支:

git checkout feature
git merge temp

最后,删除临时分支:

git branch -d temp

2.4 git reflog和git reset

在某些情况下,您可能需要恢复因操作不当而丢失的commit。git reflog可以帮助您找到这些丢失的commit。git reset命令可以用于将分支指针重置为某个特定的commit。

例子:
假设您不小心使用git push --force覆盖了远程分支,导致一些commit丢失。首先,使用git reflog查找丢失的commit:

git reflog

找到丢失的commit的哈希值(例如,b123456),然后使用git reset将分支指针重置为该commit:

git reset b123456

这样,您就可以恢复丢失的commit,并根据需要进行修改。

请注意,这些操作可能会导致分支历史改变,所以在共享分支上执行这些操作时要谨慎。同时,为了防止不必要的问题,请在执行这些操作前备份你的仓库。

3. 查看commit内容

3.1 git log

不带任何参数的版本
在这里插入图片描述

3.2 git log --oneline

每条日志仅显示在一行中
在这里插入图片描述

3.3 git log -[length]

只显示前面的length条日志
在这里插入图片描述

3.4 git log --skip=[skip]

跳过前面的skip条日志,可以和上面的-[length]联合使用
在这里插入图片描述

3.5 git log -p

显示一些统计信息以及文件的改动内容和行信息
在这里插入图片描述

3.6 git log --stat

显示提交的作者、日期、message和文件内容统计信息
在这里插入图片描述

3.7 git shortlog

显示每个author提交commit和多少条commit
在这里插入图片描述

3.8过滤

  1. 按日期
    git log --after="2023-4-1" # 2023年4月1号之后的所有日志
    git log –-before="2013-4-1" # 2023年4月1号之前的所有日志
    
  2. 按作者
    git log --author="Ricky"
    
  3. 按提交信息
    git log --grep=“issue” # 查看提交本中包含issue的日志
    
  4. 按文件
    git log -- ./src/http/modules/ngx_http_xslt_filter_module.c
    
  5. 按内容
    git log -S “ngx_free” # 查看所有文件中包含了ngx_free字符串的修改
    
  6. 按范围
    git log <since>..<until>
    

比如 git log master…feature这可以显示出自从master分支fork之后,feature分支上所有的提交

3.9 git show [commit_id]

显示commit_id的提交内容,包括所有文件的修改信息
在这里插入图片描述

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

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

相关文章

全网多种方法解决[rejected] master -> master (fetch first)的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法 1. 复现错误 今天使用git status查看文件状态&#xff0c;发现有一个文件未提交&#xff0c;如下代码所示&#xff1a; D:\project\test>git status On branch master Your branch is up to date with …

基于高德导航的大作业

绪 论 课题的建设背景 移动互联网 如今手机的发展非常迅速&#xff0c;手机越来越成为人们不可缺少的东西。手机从最初功能简单的功能机&#xff0c;发展到如今几乎无所不能的智能机&#xff0c;满足了人们的日常需求&#xff0c;手机不再是简单的通讯工具&#xff0c;还可以通…

Spring请求与响应——请求

Spring请求与响应——请求 请求映射路径RequestMapping() 请求参数GetGet发请求参数接收Get请求参数 POSTPOST发送参数 参数种类POJO类型参数数组类型类型参数集合类型参数时间参数演示 JSON数据传输参数发送请求接收请求集合参数与pojo参数演示 RequestBody与RequestParam区别…

手机信号不好?真不是套餐原因!4招教你搞定!

不少小伙伴跟搜卡之家小编抱怨手机信号突然不好&#xff0c;比如&#xff1a; 打着电话突然听不见对方的声音! 手机玩着玩着刷不出来页面和图片&#xff01; 手机信号满格但上不了网&#xff01; 这手机是不是坏了&#xff01; 其实这样的情况大部分都是因为手机信号的问题…

【Arduino】舵机的连线和基本操作

&#x1f38a;专栏【Arduino】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f6a5;舵机图片 &#x1f6a5;舵机连接方式 &#x1…

字典树(Trie/前缀树)详解

目录 字典树的概念 字典树的逻辑 字典树的实现 字典树小结 例题强化 字典树的概念 字典树&#xff08;Trie&#xff09;是一种空间换时间的数据结构&#xff0c;是一棵关于“字典”的树&#xff0c;主要用于统计、排序和保存大量的字符串。字典树是通过利用字符串的公共前…

【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)

绘制房间 修改素材配置 切割图片 绘制瓦片地图 先新建我们的调色盘,保存好位置 拖入我们刚才切片好的素材 在房间预设体创建我们的瓦片地图 绘制地图的小技巧 点选移动适合的瓦片移动到位置上绘画 框选复制已经绘制好的地图,快捷键i

【C# .NET】chapter 13 使用多任务改进性能和可扩展性

目录 一、物理内存和虚拟内存使用&#xff08;Recorder 类&#xff09; 二、 对比 string的“”操作与stringbuilder 操作 的处理效率&#xff0c;内存消耗情况&#xff0c; 三、异步运行任务、三种启动任务方法、将上一任务方法处理结果作为参数传给下一任务方法 四、嵌套…

妙记多 Mojidoc |构建企业和个人专属知识库

虽然市面上有很多项目管理工具&#xff0c;但对于小公司或初创企业来说&#xff0c;它们要么年费太贵&#xff0c;要么流程和操作太复杂&#xff0c;无法满足小团队的需求。 如果您有基本需求并希望使用低成本的文档工具&#xff0c;作为团队共享知识库和工作流程管理的工具&a…

【GIS学习笔记】快速上手GeoServer,并发布 Shapefile /PostGis / PostgreSQL

文章目录 安装配置1、下载2、配置环境 快速上手 &#xff08;Shapfile文件发布&#xff09;1、登录2、图层预览 Layer Preview3、发布Shapefile4、创建工作空间Workspace5、创建一个 Store&#xff08;数据存储&#xff09;6、创建图层报错解决 7、发布图层 快速上手&#xff0…

一款表现不佳的游戏,如何能爆火出圈?

根据《2022年中国游戏产业报告》&#xff0c;2022年中国游戏市场实际销售收入2658.84亿元&#xff0c;同比下降10.33%。游戏用户规模6.64亿&#xff0c;同比下降0.33%。继2021年规模增长明显放缓之后&#xff0c;又出现过去八年来的首次下降&#xff0c;表明产业发展已进入存量…

使用Dom元素的animate实现无限滚动列表

一、需求 实现一个内容重复滚动的列表&#xff0c;鼠标hover时滚动停止&#xff0c;鼠标移走&#xff0c;继续滚动 二、实现逻辑与代码 这个需求用到了一个dom API&#xff08;animate&#xff09;&#xff0c;这个方法可以用来做过渡动画、关键帧动画&#xff0c;接收两个参…

全景丨0基础学习VR全景制作,平台篇第八章:全局功能-说一说管理

一、功能说明 蛙色VR的全景能够允许用户发布说一说&#xff0c;这些说一说的信息会同步呈现在全景中。 鼓励用户参与到内容中来&#xff0c;增强了全景的互动性&#xff0c;体验感更好&#xff0c;也更容易引导用户分享。 此外&#xff0c;后台系统可以对说一说进行必要的审核…

C++数据结构:二叉搜索树的结构、模拟实现及应用

目录 一. 二叉搜索树的结构 二. 二叉搜索树的模拟实现 2.1 二叉搜索树的节点及类的成员变量 2.2 数据插入操作Insert的实现 2.3 数据删除操作Erase的实现 2.4 数据查找操作Find的实现 2.5 中序遍历InOrder的实现 2.6 构造函数的实现 2.7 析构函数的实现 三. 二叉搜…

第三方软件测试公司与开发人员在进行测试时有什么不一样?

随着科技信息的发展&#xff0c;软件企业要想在市场上站住脚&#xff0c;就必须在产品质量上下功夫。高质量的软件也是开发、测试、质量保证等相关人员共同追求的目标&#xff0c;用户往往会选择体验性、服务性以及安全性较强的软件产品。软件测试可以很好的检测出软件质量&…

基于web的小型餐厅餐饮饭馆供货订货系统asp.net+sqlserver

本研究课题重点主要包括了下面几大模块&#xff1a;用户登录&#xff0c;管理员信息管理&#xff0c;类别信息管理&#xff0c;商家信息管理&#xff0c;商品信息管理&#xff0c;订单信息管理&#xff0c;损耗信息管理&#xff0c;退货信息管理&#xff0c;修改密码等功能。。…

2023-热门ChatGPT解析及使用方法

什么是Chat GPT&#xff1f;我们能用它来干什么&#xff1f; Chat GPT是一款基于人工智能技术的自然语言处理模型&#xff0c;由OpenAI团队开发。它能够通过机器学习技术从海量文本数据中学习语言知识&#xff0c;实现自然语言生成、对话生成和语言理解等功能&#xff0c;使得…

144. 二叉树的前序遍历【78】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 102. 二叉树的层序遍历【206】 力扣此题地址&#xff1a; 144. 二叉树的前序遍历 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;144. 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前…

电源常识-PCB材质防火等级焊锡工艺

1、目前主流的PCB材质分类主要有以下几种,如图1&#xff0c;图2&#xff0c;图3。FR-4材质比CEM-1好&#xff0c;CEM-1比FR-1好。 按结构分为单面板&#xff0c;双面板&#xff0c;多层板。单面板就是单面铺铜走线&#xff0c;双面板就是上下两面都可以铺铜走线&#xff0c;多层…

JavaWeb综合案例

综合案例 1 查询所有 1.1 后端实现 1.1.1 dao方法实现 在 com.itheima.mapper.BrandMapper 接口中定义抽象方法&#xff0c;并使用 Select 注解编写 sql 语句 /*** 查询所有* return*/ Select("select * from tb_brand") List<Brand> selectAll();由于表中…