【Git】Git命令的学习与总结

news2025/1/16 0:47:16

本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站,可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox,自由发挥。

一、本地篇

基础篇

git commit

git commit将暂存区(staging area)的修改提交到本地版本库并创建一个新的提交,新提交会指向前一个提交,就像是链表一样的结构。

这里需要我们知道Git里的重要概念:工作区(working directory)、暂存区(staging area或index)和版本库(repository)。工作区即我们所见的项目文件夹。工作区中有个.git隐藏目录,这个是版本库,暂存区就位于版本库中,此外版本库中还有创建的分支以及指向当前分支的指针HEAD。分支实际上是个文件,但它完成的功能类似于一个指针。

git commit常用的结构:

$ git commit -m "C2"

直接运行git commit会打开Git默认编辑器。

git branch

git branch用于分支管理,包括:

  • 列出已有分支:git branch
  • 创建新分支:git branch <branch>
  • 删除分支:git branch -d <branch>
  • 重命名分支:在本地重命名分支名:git branch -move <old-branch-name> <new-branch-name>,将这个修改同步到远程:git branch --set-upstream origin corrected <new-branch-name>

来创建一个名为newImage的分支:

$ git branch newImage

在这里插入图片描述

补充:main分支是默认主分支,*表示当前分支所在。我们的提交记录会提交到当前分支。

上图*号依然位于main,说明当前分支仍然是main

使用以下命令切换到新分支上:

$ git checkout newImage

在这里插入图片描述

Git 2.23 版本引入了 git switch <branch-name> 命令来取代 git checkout命令众多功能中的切换分支功能。

最后,git branch <branch-name>git checkout <branch-name>可以合并为一条命令:

$ git checkout -b <branch-name>

git merge

git merge用于将一个或多个分支合并到当前分支上。在新建分支开发完新功能或修复完 Bug 后,我们可以将其合并回主分支。

合并bugFix分支到main分支:

$ git switch main
$ git merge bugFix

在这里插入图片描述

可以看到,合并分支时创建了新提交,这是非快进提交。接着,把main分支合并到bugFix

$ git switch bugFix
$ git merge main

在这里插入图片描述

这是快进合并(Fast Forward)。

git rebase

git rebase是另一种分支合并的方式,称为变基,具体是把一系列的提交记录复制到另一个地方。

使用git rebase可以使得提交历史更加线性,因为git rebase可用于修剪git提交历史,而是否保存或删除原纪录,git rebase的交互模式中可以设置。

$ git rebase main

在这里插入图片描述

git rebase main将当前分支(*所在)bugFix从与main分支的公共祖先提交部分开始的提交记录复制到以main分支的最新提交为起始的地方,但 复制不是真的复制,是解决冲突后的复制,如图复制后的C3'提交已经与原提交C3不同了。

git rebase main中的main就是基分支,当前分支bugFix就是变基分支

我们可以主动指定基分支和变基分支:git rebase main bugFix

高级篇:在提交树上移动

HEAD 简介与 HEAD 分离

HEAD 是一个指针,通常指向当前分支名,偶尔也会指向当前提交。

$ git checkout C1 # 切换到 C1 提交
$ git checkout main # 切换到 main
$ git commit -m "C2" # HEAD 指向的 main 指向 C2
$ git checkout C2 # 切换到 C2 提交

在这里插入图片描述

git checkout C1这样将 HEAD 指针指向提交C1的行为称为 HEAD 分离(Detached HEAD)。分离前,HEAD 指向的是分支引用 maingit checkout C1中的C1其实是提交的HASH值。

查看提交记录的哈希值

$ git log

在这里插入图片描述

HASH 值很长,但我们只需要其前面几位可以唯一标识提交的即可,例如63dbb453f...我们取63dbb

查看 HEAD 指向

$ git switch main
$ cat .git/HEAD
refs/heads/main

如果 HEAD 指向引用而非提交,也可以像下面查看 HEAD 指向:

$ git symbolic-ref HEAD

相对引用

前文使用 HASH 值来指定提交记录,这是直接引用,难免不方便,Git 提供了相对引用的方式来指定提交:

  • <branch>^branch指向的提交的上一个提交。
  • <branch>^^branch指向的提交的前面第二个提交。
  • <branch>~<num>branch指向的提交前面第num个提交。
$ git checkout main^ # 将HEAD指向main分支指向提交的前一个提交

强制修改分支位置

除了切换分支,相对引用用的最多的地方是移动分支。

$ git branch -f main HEAD~3 # 将main分支移动到HEAD指向提交的前第3个提交

如果要移动的分支不存在会自动创建。

撤销变更

git reset

git reset命令将当前分支回退到直接引用或相对引用指向的提交记录,之后的提交记录就撤销了。

$ git reset HEAD^

在这里插入图片描述

C2提交被reset后,就不存在于本地版本库中,但是其变更还在,只不过处于未暂存状态。

git reset只对本地分支有效,无法回退远程分支。

进行git reset后,如果进行推送,Git 会提示远程仓库较新需要git pull,但是git pull后你的代码被远程仓库覆盖,如果想要回退生效,则需要追加-f进行强制推送。

git revert

git revert会创建新提交来撤销或恢复更改。这个要求你的working tree为空,即当前分支没有做新的修改。

$ git revert HEAD^^ 

在这里插入图片描述

如上图,我们恢复C1提交(HEAD^^)为一个新提交。

移动提交记录

git cherry-pick

git chery-pick用于把一些提交复制到当前提交(HEAD)的下面。

$ git cherry-pick C2 C4

在这里插入图片描述

交互式 rebase

git rebase 后追加 --interactive-i 选项会打开一个窗口(你配置的编辑器)显示将要被复制到目标分支的提交的哈希值和提交说明。

一个打开的示例窗口如下:

pick 63dbb45 2

# Rebase 88e2af2..63dbb45 onto 88e2af2 (1 command)
#
# 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 [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# 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
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
#                       to this position in the new commits. The <ref> is
#                       updated at the end of the rebase
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#

在这里插入图片描述

使用git rebase经常会遇到要解决冲突的情况,解决冲突后,执行git addgit rebase --continue。解决冲突是在两种修改中手动选择一项或按需求地合并它们。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

杂项

只复制一个提交

有时候,我们开发完一个功能,需要与主分支进行合并时,会希望只合并我想要的那个提交。

我们知道,使用git merge的合并有快进合并和非快进合并两种。但是这两种合并会将我们不需要的提交也包含在主分支中。

这时候,我们可以使用git cherry-pickgit rebase -i来完成。

在这里插入图片描述

如上图,我想要将修复问题后的提交bugFix合并到main

如果使用git merge

$ git checkout main
$ git merge bugFix

在这里插入图片描述

这使得主分支 main 中就包含了 C2、C3 这些提交。

使用git cherry-pick

$ git checkout main
$ git cherry-pick C4
$ git branch -f bugFix main

在这里插入图片描述

git tag

git tag为提交记录打上标签,它可以像分支一样引用,但不会像分支一样移动。

$ git tag V1

在这里插入图片描述

$ git tag V2 C0

在这里插入图片描述

git describe

git describe查找离指定引用最近的标签。

在这里插入图片描述

git describe main输出v1_2_gC2,git describe side输出v2_1_gC4。

git describe <ref>的输出格式:<标签>_<数字>_g<提交的哈希值>。数字的意思是从标签到指定提交的提交数量。

高级话题

多次 rebase

在这里插入图片描述

$ git checkout another
$ git rebase side
$ git rebase bugFix
$ git rebase main
$ git branch -f main another

在这里插入图片描述

相对引用^中选择 parent 提交记录

相对引用^可以像~一样在后面加个数字,该数字表示选择第几个 parent 提交记录。^后加数字直观上与 ~ 加数字的区别是前者是横向,后者是纵向。

$ git checkout main^2

在这里插入图片描述

^~的链式操作;

$ git checkout HEAD~^2~2

在这里插入图片描述

二、远程篇

Git 远程仓库基本操作

git clone

git clone命令用于从远程仓库(如Github、Gitee等)拷贝你需要的仓库。远程仓库可看作是你的本地仓库在另一台电脑上的拷贝。

$ git clone <远程仓库URL>

URL例子:https://github.com/dawnkylin/demo,这个URL采用了HTTP传输协议,除此之外,还可以使用git://或者使SSH协议的user@server:path/to/repo.git。

在这里插入图片描述

远程分支

上一节中的克隆产生的o/main分支就是远程分支,o是远程仓库名,一般是origin,图示使用简写代替。你使用git clone克隆完一个仓库时,已经将远程仓库名设置为origin了。

查看远程仓库信息:

$ git remote -v

修改远程仓库名:

$ git remote rename <远程仓库名>

远程分支反映了远程仓库的状态。

切换到远程分支会自动切换到 HEAD 分离状态。

$ git checkout o/main

在这里插入图片描述

git fetch

git fetch从远程仓库下载缺失的提交记录,并更新远程分支。

$ git fetch <远程仓库URL>

git fetch不会改变你的本地分支状态,也就是不会改变你的本地仓库文件。

示例:

在这里插入图片描述

执行git fetch后:

在这里插入图片描述

git pull

使用git fetch只更新了远程分支,并未更新本地分支,还需要我们进行进一步合并,使用下面方法之一:

  • git cherry-pick origin/main
  • git merge origin/main
  • git rebase origin/main

git pull 命令将拉取和合并操作结合在了一起,相当于git fetchgit merge的结合。

git push

git push 不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。

查看 push.default 值。

$ git config --get push.default

push.default 通常具有以下几种值:

  • simple:这是 Git 2.0 及以后版本的默认值,它会将当前分支的 push 操作限制为其上游(通常是 origin 远程仓库)的同名分支。
  • current:将 push 操作限制为当前分支。
  • nothing:禁用默认的 push 行为,需要明确指定要 push 的分支和远程仓库。
  • matching:这是 Git 1.x 版本中的默认行为,它会将本地的所有分支与远程仓库的同名分支进行匹配,然后将它们都 push 到远程仓库。

修改 push.default

$ git config push.default <new_value>

偏离的提交历史

当你使用 git push 推送代码时,会遇到无法推送,要先与远程仓库合并的提示。这是由于远程仓库已经被你的同事修改了,你调用的 API 可能已经不存在或改名了,也就是发生了冲突。

在这里插入图片描述

如何解决冲突?

① 使用 git rebase

$ git fetch
$ git rebase o/main
$ git push o main

在这里插入图片描述

② 使用 git merge

$ git fetch
$ git merge o/main
$ git push o main

在这里插入图片描述

使用 git merge 会多一个合并提交。与git pull达到相同的结果。

③ 使用 git pull --rebase,即 git fetchgit rebase 的结合

$ git pull --rebase
$ git push

Git 远程仓库高级操作

远程追踪

main 分支默认指定为跟踪远程分支 origin/main ,跟踪的意思是指定了 origin/main 为 push 的目的地和 fetch 后合并的目标。

如何自己设置分支跟踪远程分支?

方式一:

$ git checkout -b <local branch> <remote branch>

比如 git checkout -b foo origin/main

方式二:

$ git branch -u <remote branch> <local branch>

例如 git branch -u origin/main foo,如果当前就在 foo 分支,还可以省略 foo

git push 的参数

实际 git push 的语法是:

$ git push <remote> <place>

意思是将 remote 的 place 分支没有的而本地 place 分支有的提交记录添加到 remote 的 place 分支。不仅会更新远程的 place 分支,也会更新本地的 remote/place 分支。

git push 没有参数时,会根据当前分支和它所追踪的远程分支来自动设置参数。

git push 的参数 2

将本地 source 分支推送到远程仓库的 destination 分支:

$ git push origin <source>:<destination>

准确地说,source 不一定是分支,也可能是标签、提交的 HASH 部分值和相对引用等等 Git 可以识别的位置。如果目的分支 destination 不存在,Git 会帮你自动创建的。

git fetch 的参数

$ git fetch origin foo

拉取远程仓库 origin 的远程分支 foo 的新提交,并放到本地的远程追踪分支 origin/foo 上,而不会影响 foo 分支。

也可以使用 <source>:<destination> 的参数格式:

$ git fetch origin foo~1:bar

上面命令的作用是将远程 foo 分支的上一个提交拉取到本地的 bar 分支上。

动画.gif

如果 bar 分支不存在就新建,这个和 git push 的参数行为是一致的。

没有指定参数的 git fetch 则会拉取所有提交记录。

source 参数为空的 git push 和 git fetch

1)git push orgin :foo 传空值 source 删除了远程的 foo 分支,连带着删除了本地的 origin/foo 分支。

2)git fetch origin :foo 则会在本地新创建一个 foo 分支。

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

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

相关文章

leetcode:1925. 统计平方和三元组的数目(python3解法)

难度&#xff1a;简单 一个 平方和三元组 (a,b,c) 指的是满足 a2 b2 c2 的 整数 三元组 a&#xff0c;b 和 c 。 给你一个整数 n &#xff0c;请你返回满足 1 < a, b, c < n 的 平方和三元组 的数目。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;2 解释…

企业如何高效地使用数字工厂管理系统

随着信息技术的飞速发展&#xff0c;数字工厂管理系统已经成为现代企业提升生产效率、优化资源配置、增强竞争力的关键工具。本文将探讨企业如何高效地使用数字工厂管理系统&#xff0c;以实现生产流程的优化、成本控制的精细化和市场响应的敏捷化。 一、数字工厂管理系统的概念…

Autosar-Mcal配置详解-GPT

3.3.1添加GPT模块 方法与添加Dio相似&#xff0c;可参加Dio模块添加方法。 3.3.2 创建、配置GPT通道 1)根据需求创建GPT通道&#xff08;即创建几个定时器&#xff09; 本例中创建了3个定时器通道&#xff1a;1ms&#xff0c;100us&#xff0c;OsTimer。 2)配置GPT通道 配置T…

Android LruCache源码分析

文章目录 Android LruCache源码分析概述LruCache和LinkedHashMap关系源码分析写入数据读取数据删除缓存 Android LruCache源码分析 概述 LruCache&#xff08;Least Recently Used Cache&#xff0c;最近最少使用缓存&#xff09;是 Android 中的一种缓存机制。 根据数据的使…

从大厂裸辞后成为自由职业者,一年后我怎么样了?

深耕技术领域7年&#xff0c;前前后后也做过不少副业&#xff0c;最近我一直在思考什么副业才是对自己有价值的&#xff0c;可持续的&#xff0c;甚至是可增长的。 22年我所在团队的一个项目解散了&#xff0c;领导问我想拿钱走还是转岗&#xff0c;想想自己也在这个公司干了5…

2024-02-21 学习笔记(DETR)

自动多模态检测验证效果不佳&#xff08;过检太多&#xff09;后&#xff0c;节后开始尝试DETR路线。 基本梳理了下DETR发展和验证的脉络&#xff0c;先进行相应指定场景的效果验证。 关于DETR系列的介绍&#xff0c;B站上比较多&#xff0c;迪哥的都讲的比较细。 推荐大佬的…

【VSCode编写JavaScript】

VSCode编写JavaScript ■ 下载安装VSCode■ VSCode统一配置■ 格式化工具■ Tab size &#xff08;代码缩进 2个字符&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7b79c59636f147c8b08a0fff37886e0a.png) ■ VSCode安装JS插件■ VSCode新建JS工程代码…

突发!AI独角兽「竹间智能」被曝停工停产6个月

大家好我是二狗。 今天早上起来刷朋友圈&#xff0c;看到一张截图——AI创企竹间智能&#xff0c;宣称因为公司所处的经营环境艰难&#xff0c;部分部门和岗位将从即日起停工停产6个月。 图源&#xff1a;&#xff08;企服科学&#xff09; 下面是文字版&#xff1a; 由于公司…

Pregnostic®–PE IIp ELISA,用于测量人源ESM-1水平

Pregnostic PE Pregnostic是由IQ Products公司开发的重点关注女性健康的产品线。其中的Pregnostic -PE项目&#xff0c;旨在开发有助于筛查孕期先兆子痫风险的产品&#xff0c;可用于区分早发性和晚发性先兆子痫。 ESM-1 内皮细胞特异性分子&#xff08;ESM-1&#xff09;&am…

渗透测试之文件上传绕过

通过是否抓到包来验证是前端验证还是后端验证&#xff0c;前端验证是不发数据包的&#xff0c;而后端验证是会发数据包的&#xff0c;所以可以通过抓包工具进行判断。再通过不同的验证方式&#xff0c;选择绕过方式。 前端验证&#xff1a;通过禁掉js代码&#xff0c;使验证文…

c++:蓝桥杯的基础算法2(构造,模拟)+练习巩固

目录 构造 构造的基础概念&#xff1a; 模拟 练习1&#xff1a;扫雷 练习2&#xff1a;灌溉 练习3&#xff1a;回文日期 构造 构造的基础概念&#xff1a; 构造算法是一种用于解决特定问题的算法设计方法。在C语言中&#xff0c;构造算法通常涉及到创建一个函数或类来实…

springboot207基于springboot的实习管理系统

实习管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定实习管理系统的总体功…

一个服务器实现本机服务互联网化

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上&#xff0c;中微子代理就像是一支潜伏在黑暗中的数字特工队&…

Sora:OpenAI引领AI视频新时代

Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨…

基于springboot+vue的视频网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

.NET项目web自动化测试实战——Selenium 2.0

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

猫头虎分享已解决Bug || Web服务故障:WebServiceUnavailable, HTTPServerError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

网络安全“降本增笑”的三大帮手

在网络安全这个快速变化和危机四伏的领域中&#xff0c;通过使用正确的工具和方法&#xff0c;我们可以在工作中取得更高的效率&#xff0c;并降低相关成本。 雷池社区版 雷池社区版—开源Web应用防火墙。这款产品凭借强大的规则引擎&#xff0c;它允许用户自定义安全策略&…

钡铼技术的LoRa网关实现智能电网监测与控制

钡铼技术的LoRa网关在智能电网监测与控制方面发挥着关键作用&#xff0c;为电力系统的安全运行和高效管理提供了重要支持。下面将详细介绍钡铼技术的LoRa网关如何实现智能电网监测与控制。 首先&#xff0c;钡铼技术的LoRa网关通过接入各类传感器和监测设备&#xff0c;实现对…

ESP8266智能家居(2)——8266发布数据到mqtt服务器

1.公共服务器 学习物联网就离不开服务器&#xff0c;如果你资金充足的话&#xff0c;可以自己购买或者租用一个服务器。本次我选择&#xff0c;使用免费的公共MQTT服务器。它的端口及Broker信息如下&#xff1a; 网址为&#xff1a; 免费的公共 MQTT 服务器 | EMQ (emqx.com)h…