Git advanced高级操作

这篇具有很好参考价值的文章主要介绍了Git advanced高级操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章是继Git概念介绍,常用命令与工作流程整理 配图_TranSad的博客-CSDN博客

之后的一些补充,学习总结一些额外Git操作中的比较常用的操作。所以这篇文章假设你已经有了前面的基础,我就直接说一些没有提到过的部分。

Detached HEAD

在Git中我们通常把HEAD当成是指向当前分支的指针,但是,如果你检出(checkout)了一个不是本地分支的引用(例如一个标签(tag)、一个远程分支、一个SHA-1 ID或者一个相对引用如main~3),那么你将进入一个特殊的状态,称为"分离头指针"状态。

在"分离头指针"状态下,HEAD不再指向一个分支,而是直接指向一个提交。我们可以把这个状态想象为一个"匿名分支"。在这个状态下,你可以正常地进行提交,但是这些提交不会更新任何的命名分支。这个状态对于在提交历史中跳转很有用。例如,你可以检出一个特定版本的代码,进行编译和安装,然后再切换回主分支。

Git advanced高级操作

Git advanced高级操作

 如果你在"分离头指针"状态下做了提交,然后切换到其他分支(如main),那么你在"分离头指针"状态下做的提交可能会丢失。如果你想要保存在"分离头指针"状态下做的提交,你应该在切换分支之前,创建一个新的分支来引用这些提交。你可以使用git checkout -b name命令来创建并切换到一个新的分支。这个命令会创建一个新的分支,并把HEAD指针切换到这个新分支,这样你在"分离头指针"状态下做的提交就不会丢失了。

如果你直接checkout回main分支,那么记录就丢失了,因为在Git中,如果一个提交不被任何分支或标签引用,那么它就可能会在一段时间后被Git的垃圾回收机制删除。

Git advanced高级操作

Rebase

简短复习一下rebase的基础用法:如果你在你的feature分支上使用git rebase main,这个命令会将feature分支上的所有提交取出,然后在main分支的最新提交上重新应用这些提交。

Git advanced高级操作Git advanced高级操作

而原来的提交如果不再被任何分支或标签引用,那么它们就可能会在一段时间后被Git的垃圾回收机制删除(也就是图中的odd commits部分)。因此,如果你需要保留原来的提交,你应该在rebase之前,通过git checkout -b name命令创建一个新的分支来引用(或者说是保存)这些提交,因为只要有分支引用它们,它们就不会被删除。

回到最初始的状态,如果你把命令用反了,即:git checkout main  git rebase feature,那么你就会把main分支的commit放到你的feature分支后面:

Git advanced高级操作

此时如果你在进行多人开发,那么你的本地仓库就和远程仓库的main分支不同了,这就会带来一些列问题,因为别人的main分支还是在那,所以rebase千万别用错了顺序,其次多人开发还是用merge更合适。下面是一个使用merge的正常工作流程:

  1. 首先,在你的本地仓库中,从主分支(main)检出一个新的分支(例如,feature),然后在这个新分支上进行开发。

  2. 当你的开发工作完成后,你可以切换回主分支,然后使用git merge feature命令将你的工作合并到主分支。这个操作会创建一个新的合并提交(merge commit)。

  3. 然后,你可以将主分支推送到远程仓库,然后在远程仓库中创建一个拉取请求(pull request)。这个拉取请求会显示你的更改,并请求项目的其他成员审查你的代码并将你的更改合并到项目的主分支。

现在我们再回到rebase,讲一下其他高级操作。

git rebase --interactive

git rebase --interactive是一个允许用户以交互方式对提交历史进行更为复杂操作的命令,包括压缩(squashing)、分割(splitting)、删除(deleting)提交等

首先来看一个简单的例子:当执行git rebase -i main(在feature分支上)时,Git会打开一个文本编辑器,列出所有将被移动(即应用到main分支上)的提交,如:

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

每个提交前的pick表示该提交将被使用在此次rebase中。你可以通过调整这些行的顺序来改变提交的执行顺序。这些提交是从上到下执行的(在日志中看到的顺序是相反的),因此首先会将33d5b7a添加到main分支上。如果你在这里删除一行,那么相应的提交就会被丢弃。如果你删除了所有行,那么rebase操作将被中止。当你保存并关闭文件后,Git将根据你的指示执行rebase操作。

Squashing 压缩

"压缩"提交就是将一系列的提交合并成一个单独的提交。在合并功能分支到开发分支的时候,这可能非常有用。你可能有大量的小规模提交,当它们合并到开发分支时,可能会使其他开发者阅读起来感到困扰。下面是一个代码示例:假设第二个和第三个提交修复了第一个提交中的小问题,你可以使用squash命令将它们合并成一个单独的提交。

pick 33d5b7a Message for commit #1
squash 9480b3d Message for commit #2
squash 5c67e61 Message for commit #3

Git advanced高级操作

 

当你选择squash一个commit时,Git会将该commit的更改融入到前一个(即上面的)commit中。在你的示例中,9480b3d5c67e61这两个commit的更改都会被合并到33d5b7a这个commit中。这意味着所有这三个commit的更改都会被压缩到一个新的commit中。然后,Git会打开一个编辑器,让你为新的合并后的commit编写一个新的commit消息。这个消息通常默认为所有被压缩的commit消息的集合,但你可以根据需要进行编辑。最后,当你保存并关闭编辑器后,Git会完成rebase操作,你的commit历史中就会只有一个包含了所有更改的新commit,而原来的三个commit就不再存在了。

splitting 拆分

"拆分"提交就是将一个提交分解成多个单独的提交。如果一个提交中做了太多不同的更改,这可能会很有用。通过将那个提交拆分成一个或多个单独的提交,你的版本历史会变得更细粒度,更易于阅读和修改。以下是一个代码示例:假设你想将第二个提交分解成两个单独的提交,你可以使用edit命令来拆分。

pick 33d5b7a Message for commit #1
edit 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

Git将首先执行你的第一个提交(33d5b7a),然后应用第二个提交(9480b3d),这时发现第二个提交你使用了edit,git然后把你放在控制台中。在那里,你可以使用git reset HEAD~对那个提交进行混合重置,这实际上撤销了那个提交,并将修改的文件未暂存。现在,你可以分别暂存和提交文件到几个提交中。比如:

$ git add file_for_first_commit
$ git commit -m ‘first commit message’
$ git add file_for_second_commit
$ git commit -m ‘second commit message’
$ git rebase --continue

当你处理完edit命令后,git会处理最后的那个提交(5c67e61)。

deleting 删除

"删除"提交就是在提交历史中去除一个提交。假设第三个提交有问题,你可以使用drop命令删除它:

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
drop 5c67e61 Message for commit #3

保存并关闭文件后,Git应用更改,并把你放回编辑器中以合并提交消息。保存后,Git将根据你的指示执行rebase。

Git advanced高级操作

需要注意的是,由于Git构建提交对象的方式,删除或更改一个提交将导致重写所有跟随其后的提交。你在仓库历史中回溯得越远,就需要重建越多的提交。如果在序列后面有很多依赖于你刚刚删除的提交的提交,这可能会导致大量的合并冲突。在上面的例子中我们就只删除了最后一个提交,所以就还好。

其他一些 git rebase --interactive 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
  • m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] = Create a merge commit using the original merge commit's message (or the oneline, if no original merge commit was specified). Use -c <commit> to reword the commit message.

Git commit --amend

最后再补充个amend,amend关键字也很有用,大概就是如果你想更新你的最后一次提交,你可以使用git commit --amend -m “message for updated commit”命令。这个命令会将你的修改加入到最后一次提交中,并更新提交信息。文章来源地址https://www.toymoban.com/news/detail-442314.html

到了这里,关于Git advanced高级操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 今天用AI创作助手写的文章--Docker提问系列介绍 Docker 的基本概念和优势

    Docker 是一款开源的容器化平台,它可以让你将应用程序和其依赖项打包到一个可移植的容器中,从而实现快速部署、扩展和管理应用程序的能力。以下是 Docker 的基本概念和优势: 镜像(Image):一个静态的文件,包含用于运行应用程序的所有必要文件和环境变量。 容器(

    2024年02月07日
    浏览(45)
  • Git 的基本概念、使用方式及常用命令

      Git是一个分布式版本控制系统,常用于协同开发和版本管理。以下是Git的基本概念和使用方式以及一些常用命令:   用于存储源代码和版本历史记录的地方。可以是 本地仓库(Local Repository) 或 远程仓库(Remote Repository) 。   存放实际的源代码文件。   用于临时

    2024年01月20日
    浏览(53)
  • Pytorch高级训练框架Ignite详细介绍与常用模版

    Ignite是Pytorch配套的高级框架,我们可以借其构筑一套标准化的训练流程,规范训练器在每个循环、轮次中的行为。本文将不再赘述Ignite的具体细节或者API,详见官方教程和其他博文。本文将分析Ignite的运行机制、如何将Pytorch训练代码转为Ignite范式,最后给出个人设计的标准

    2024年02月03日
    浏览(39)
  • 【Git 入门教程】第六节、Git高级操作

    Git是一种非常强大的分布式版本控制系统,可以帮助开发者轻松地管理和协调代码库。在本文中,我们将介绍一些Git高级操作,包括如何管理Git仓库、标签、子模块和忽略文件。 Git提供了许多命令来管理本地Git仓库。以下是一些常用的管理命令: 初始化一个新的Git仓库: 查

    2024年02月05日
    浏览(47)
  • APT(Advanced Persistent Threat高级持续性威胁)——网络安全

      网络安全APT(Advanced Persistent Threat高级持续性威胁)是一种复杂的网络攻击,旨在长期潜伏在目标网络中,有组织的黑客或攻击者利用高级技术手段对目标系统进行持续的渗透和监视,以获取敏感信息、窃取数据或进行其他恶意攻击活动。下面是一些关于网络安全有关A

    2024年02月13日
    浏览(38)
  • Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

    开篇: 欢迎再次来到 Spring 5 学习系列!在这个博客中,我们将深入研究 Spring 框架的AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式)。 概念 什么是AOP (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的

    2024年01月24日
    浏览(45)
  • idea git 高级操作(差异文件对比与抽取)

    一、两个分支内文件差异对比 方式1: 1.打开工具  2.选择要进行文件差异对比的分支   3.查看对比  4.查看差异内容 方式二: 1.直接选择需要对比的分支 二、抽取“两个分支内文件差异”部分的代码 接着上一步,全选上这些差异文件,然后点击“Get from Branch”,就会把这些

    2024年02月11日
    浏览(36)
  • Git新手?这篇文章带你飞!基础操作一网打尽!

    智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) Git(读音为/gɪt/) 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 git是世界上最先进的分布式版本控制系统(没有之一)

    2024年01月17日
    浏览(42)
  • 工业相机相关概念词介绍:ISP算法、线阵相机、常用术语

    ISP基本框架及算法介绍 相机的常用设置 50个常用术语 关于立体视觉相关算法,可参考我的专栏:https://blog.csdn.net/yohnyang/category_11720857.html ISP(Image Signal Processor),即图像处理,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正、噪声去除、坏点去除、

    2024年02月02日
    浏览(37)
  • Net 高级调试之七:线程操作相关命令介绍

    一、简介 今天是《Net 高级调试》的第七篇文章。上一篇文章我们说了值类型,引用类型,数组等的内存表现形式。有了这个基础,我们可以更好的了解我们的程序在运行时的状态,内存里有什么东西,它们的结构组成是什么样子的,对我们调试程序是更有帮助的。今天,我

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包