当前位置: 首页 > news >正文

git指令学习

文章目录

  • SSH设置
    • 公钥
    • 私钥
  • 基础
    • init
    • clone
    • config
    • add---暂存
    • commit---提交
    • status
    • diff
    • branch
    • log
    • pull
    • push
    • fetch
    • switch
    • rm
    • remote
    • checkout(多功能集合体)
  • 进阶
    • fork
    • PR(Pull Request)
    • remote---远程仓库操作
    • --staged对暂存区的操作
  • 复杂
    • HEAD头机制
      • 什么是HEAD头
      • 查看HEAD头
      • 分离HEAD头
      • 移动HEAD(相对引用)
        • ^---移动至父节点
        • ~ < num >---移动至上< num>个节点
    • git reflog
    • rebase
      • 交互式变基
      • 终止变基
      • 继续变基
    • merge
    • reset
      • 硬恢复
      • 软恢复
    • revert
    • restore
      • 工作区修改了但是我想复原
      • 暂存区修改了但是我不想提交上去
    • clean
  • 如何从新建立一个仓库
    • 本地
    • github
    • 回到本地
  • 自动合并失败,修正冲突然后提交修正的结果。
  • 与合作者共事时,合作者在远程新建了仓库
  • git仓库中的特殊文件
    • .gitignore
    • .gitmodules
    • .gitkeep
    • .gitmessage

SSH设置

SSH(Secure Shell):通过非对称加密(公钥/私钥)安全地建立连接,然后使用对称加密进行数据传输,并利用哈希算法保证消息完整性。

公钥

在github端的SSH Keys

私钥

存储在本地

基础

init

初始化仓库

gitinit

clone

复杂仓库至本地(直接clone不用init)

gitclone<在github上复制的地址>

如果下载的模块当中包含子模块,那么使用递归(recursive)的方式进行clone,否则子模块只有一个文件夹

gitclone--recursive<在github上复制的地址>

config

# 查看所有配置gitconfig--global--list# 查看用户名gitconfig--globaluser.name# 查看邮箱gitconfig--globaluser.email# 查看特定配置gitconfig user.namegitconfig user.email

add—暂存

添加文件到暂存区

gitadd.

commit—提交

提交文件到本地git仓库

gitcommit -m"这里输入提交注释"

直接运行会进入一个文本编辑器,可以编写可换行的注释

gitcommit

status

查看当前工作区的状态
1、所处的分支
2、尚未暂存以备提交的变更:
(使用 “git add/rm <文件>…” 更新要提交的内容)
(使用 “git restore <文件>…” 丢弃工作区的改动)
3、未跟踪的文件:
(使用 “git add <文件>…” 以包含要提交的内容)

gitstatus

diff

git status可以查看哪些文件被修改,但是修改了什么并不知道,这时使用git diff查看修改的内容(与原文件的不同之处)

gitdiff

git add之后,查看修改

gitdiff--cached

会显示

diff--gita/readme_cn.md b/readme_cn.md index e51fdd4..999b3b8100644--- a/readme_cn.md +++ b/readme_cn.md @@ -15,7 +15,7 @@ ros2 launch diablo_bringup diablo_bringup.launch.py /ros_to_mqtt_publisher /mqtt_to_ros_node -/ros_to_mqtt_publisher +#### /ros_to_mqtt_publisherSubscribers: Publishers:

branch

查看本地的所有分支以及当前所处的分支(使用*标注)

gitbranch

git branch -vgit branch --verbose的缩写,用于显示本地分支及其最后一次提交信息

gitbranch-v
* chore/repo-restructure 9d28933 clean main d0636e5[落后3]Tune visual follow and diagnosticstest2e971d9 添加注释readme

git branch -vv是一个查看本地分支与远程分支跟踪关系的命令,可以让你快速了解每个本地分支对应哪个远程分支,以及同步状态。

gitbranch-vv

相比与-v会显示本地分支追踪的远程仓库的远程分支,信息更加全面

* chore/repo-restructure 9d28933[origin/chore/repo-restructure]clean main d0636e5[origin/main: 落后3]Tune visual follow and diagnosticstest2e971d9 添加注释readme

git branch -r可以查看所有的远程分支

gitbranch-r

git branch -r
origin/HEAD -> origin/main
origin/chore/github-publish-prep
origin/chore/repo-restructure
origin/dev
origin/docs-readme-current-state
origin/feat/autoaim-integration-followup
origin/feat/rdk-visualizer-checkpoint
origin/feat/usb-cdc-upper-test-link
origin/feature/formula-mini-kt-cloud-follow
origin/feature/upper-lower-vision-control
origin/main
wxr/main

log

查看提交日志

gitlog

–graph:表示图形化表示(增加了连线)
–oneline :表示一行显示(更加简洁)

gitlog--graph--oneline

–all:表示所有的日志

gitlog--all--oneline

pull

拉取并合并
当前所在的分支会从远程仓库拉取同名的远程分支

gitpull

push

推送至远程github仓库

gitpush

当有多个远程仓库时(注意不能有空格)

gitpush<远程仓库名><本地分支名>:<远程分支名>
gitpush<远程仓库名><本地分支名>:<远程分支名>

fetch

从远程下载但是不合并

gitfetch

switch

切换分支,分支名称使用git branch查看

gitswitch<分支名称>

回到上一个刚刚切换过来的分支

gitswitch -

rm

不会改变仓库,只会改变暂存区和工作区
1.删除文件—工作区和暂存区删除

gitrmfile.txt

2.删除目录

-r表示递归

gitrm-rdirectory/

3.使用通配符

gitrm*.log

4.只从暂存区删除—但保留工作区文件

gitrm--cachedfile.txt# 停止跟踪所有文件(清空暂存区)gitrm--cached-r.

remote

列出远程仓库名称

gitremote

列出地址

gitremote-v

添加远程仓库(可以添加多个)

gitremoteadd<仓库名><仓库地址>

删除

# 删除远程仓库连接gitremote remove<仓库名>

重新命名

# 重命名远程仓库gitremoterename<原名称><新名称>

checkout(多功能集合体)

1.切换分支,分支名称使用git branch查看

gitcheckout<分支名称>

1.1.创建新分支+切换新分支

gitcheckout-b<新分支名称>

1.2.放弃本地修改+强制切换分支

gitcheckout-f<分支名称>

1.3.–track 创建一个本地分支,让它跟踪(track)指定的远程分支。

gitcheckout--trackorigin/devgitcheckout-b<本地分支名><远程仓库名>/<远程分支名>

2.恢复文件
修改了文件但是要放弃这个修改

注意:这里的恢复文件需要在add之前,也就是说,我修改文件并且保存了,但是我不想要我这个保存,我要恢复到上一次提交完的状态,使用checkout恢复

gitcheckout -- file.txt#单个文件 只恢复 file.txtgitcheckout.#当前目录所有文件 恢复当前目录下所有修改过的文件gitcheckout -- *.txt#匹配模式的文件 恢复所有 .txt 文件gitcheckout -- dir/#整个目录 恢复 dir 目录下的所有文件

注意:- - 后面需要一个空格

3.分类HEAD头

gitcheckout<哈希值>

进阶

fork

在github上面有一下开源的项目 可以使用fork指令 fork到自己的github仓库上

PR(Pull Request)

fork到自己仓库的代码经过修改提交之后,可以发起PR,经过原项目主的审核之后就可以PR过去了

remote—远程仓库操作

1.显示信息

# 列出已配置的远程仓库gitremote# 输出:origin# 查看详细信息gitremote-v# 输出:# origin https://github.com/user/repo.git (fetch)# origin https://github.com/user/repo.git (push)

2.添加远程仓库

# 添加一个新的远程仓库gitremoteadd<仓库名><地址>gitremoteaddorigin https://github.com/user/repo.git

3.删除远程仓库

gitremotermorigin

–staged对暂存区的操作

  1. git diff --staged
gitdiff--staged

比较暂存区和最后一次提交(HEAD)之间的差异

  1. git restore --staged .
gitrestore--staged.

从暂存区移除,恢复到未暂存的状态,但保留工作区的修改

可以理解为撤销git add操作

  1. git rm -r --cached < 文件名 >
gitrm-r--cached<文件名>

使用场景:
使用.gitignore新添加了需要忽略的文件夹.vscode/ 但这个文件夹已经添加到了暂存区

gitrm-r--cached.vscode/

运行上述指令之后暂存区的.vscode文件夹就会递归删除了
同时记得在.gitignore当中添加

.vscode/

复杂

HEAD头机制

什么是HEAD头

HEAD是一个指针,正常状态下HEAD是指向分支,但是我们可以通过分离HEAD使其指向一个具体的提交

查看HEAD头

cat.git/HEAD

显示:(指向分支)

ref: refs/heads/master

或者显示(指向提交)

f492d0a609f526be1583d3cf93486c882b9f48c2

分离HEAD头

先使用git log查看历史提交的哈希值

gitcheckout f492# 输入哈希值的前几位即可

会显示

注意:正在切换到 ‘f492’。
您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。

之后可以使用git switch -或者git checkout master结束分离HEAD头状态

gitswitch -#一步操作之后gitcheckout master# 多步操作之后使用这条命令快速回到最新分支

移动HEAD(相对引用)

^—移动至父节点
gitcheckout HEAD^gitcheckout main^# 或是这种

~ < num >—移动至上< num>个节点
gitcheckout HEAD~4

git reflog

查看所有引用日志
可以查看HEAD头的历史位置,可以查看HEAD@{n}恢复

gitreflog

rebase

变基操作
使用场景:当分支状态比较杂乱的时候,使用rebase相当于重新处理提交

交互式变基

gitrebase-i<基准点>

例如:

gitrebase-iA# 会处理 B, C, D, E 这些提交# A 保持不变E(最新)D C B A(基准点)← 从这里之后开始处理 使用 ^ 符号(包含该提交)gitrebase-iA^# 会处理 B, C, D, E 这些提交# A 保持不变E(最新)D C B A(基准点)← 从这里开始处理(包含)

执行命令后,会打开编辑器,显示如下内容

pick abc1234 第一次提交 pick def5678 第二次提交 pick ghi9012 第三次提交 pick jkl3456 第四次提交# 变基 2e971d9..abc1234 到 2e971d9(4 个命令)## 命令:# p, pick = 使用提交# r, reword = 使用提交,但修改提交说明# e, edit = 使用提交,但停止以修正提交# s, squash = 使用提交,但合并到前一提交# f, fixup = 同 squash,但丢弃提交说明# x, exec = 使用 shell 运行命令(该行剩余部分)# b, break = 在此处停止(使用 'git rebase --continue' 继续)# d, drop = 移除提交# l, label = 为当前 HEAD 打上标签# t, reset = 重置 HEAD 到标签# m, merge = 创建合并提交

之后按照需要修改即可

终止变基

# 如果操作失误或想放弃gitrebase--abort# 回到变基前的状态

继续变基

注意一定要在解决冲突之后,并且保存文件之后,再add否则将会把<<<<<<<、=======、>>>>>>> 这样的冲突标记提交上去,这样就乱了

# 解决冲突后# 保存文件后gitadd.gitrebase--continue

merge

合并操作

注意1:在合并操作之前需要保证分支最新
注意2:是谁往谁上合并

1、确保你在 test 分支上

gitcheckouttest

2、先获取远程最新代码

gitfetch origin

3、确保本地 main 分支是最新的

gitcheckout maingitpull origin maingitcheckouttest# 切换回你的分支

4、将 main 分支合并到你的分支

gitmerge main# 在当前分支(test)上合并 main 分支

reset

复原操作,撤销变更,可以使暂存区恢复到之前的状态(当前修改也有保留,但是存储起来了)
这种恢复是通过移动HEAD指针的形式实现的

# HEAD指针指回,工作区保持不变gitreset 53c2688

硬恢复

没有commit的修改都会丢失,工作区完全恢复到历史状态,HEAD指针也指回历史状态。

gitreset--hardf9fd6
gitreset--hardHEAD~1
gitreset HEAD^

还可以结合HEAD@{n}来撤销之前的撤销

gitreset--hardHEAD@{1}

软恢复

所有当前修改会变成暂存状态(git add 过的状态),可以重新提交。

# 只移动 HEAD 到 53c2688,但工作区文件保持不变gitreset--soft53c2688

revert

也是撤销变更的一种

restore

只修改工作区/暂存区的文件内容,不进行HEAD指针的移动

工作区修改了但是我想复原

这样做就把之前在工作区的修改撤销了

gitrestore.

暂存区修改了但是我不想提交上去

也就是说使用了git add

gitrestore--staged.

注意:这个时候修改仍然存在,是在工作区,暂存区的修改已经撤销了
如果想在把工作区的修改撤销 还需要一步git restore .

clean

git clean -fd(ds)

如何从新建立一个仓库

本地

1、确保用户名和邮箱是自己的

gitconfig--global--list

2、生成SSH密钥
ssh-keygen:生成 SSH 密钥工具
-t ed25519:指定密钥算法为 ed25519(推荐,安全且短)
-C “邮箱”:给密钥加注释,方便在 GitHub 上识别

ssh-keygen-ted25519-C"你的GitHub邮箱"

3、
ssh-agent -s:启动 SSH 代理并输出需要设置的环境变量
eval “$( … )”:把这些环境变量立即加载到当前终端
结果:当前 shell 拥有可用的认证代理

eval"$(ssh-agent-s)"

4、把私钥注册到代理
ssh-add:把私钥注册到代理
~/.ssh/id_ed25519:你本机的 ed25519 私钥路径
结果:后续 git/ssh 操作会自动用这把钥匙认证

ssh-add ~/.ssh/id_ed25519

5、
-l:列出当前代理里已加载的密钥指纹
结果:看到一条 ED25519 指纹就表示成功

ssh-add-l

6、打印公钥内容(可以公开)

你需要把这一整行复制到 GitHub

cat~/.ssh/id_ed25519.pub

github

1、在设置里面的SSH key添加刚才复制的代码



2、创建新仓库

点击右上角的 “+” 号 → 选择 “New repository”
Repository name: 仓库名称(如:smart_car_ros)

Description: 可选,简短描述

Public/Private: 选择公开或私有

Initialize this repository with:

不要勾选 “Add a README file”

不要勾选 “.gitignore”

不要勾选 “License”

点击 “Create repository”

3、复制这个仓库的地址

回到本地

7、测试连接

ssh-Tgit@github.com

8、初始化

gitinit

9、添加仓库地址

gitremoteaddorigin<仓库地址>

10、推送

gitpush-uorigin master

自动合并失败,修正冲突然后提交修正的结果。

1.查看哪些文件有冲突

gitstatus

会出现

位于分支test您有尚未合并的路径。 (解决冲突并运行"git commit") (使用"git merge --abort"终止合并) 要提交的变更:........未合并的路径: (使用"git add <文件>..."标记解决方案)

2.打开冲突文件,你会看到

<<<<<<<HEAD // 当前分支的代码 int value=100;=======// 被合并的分支的代码(main) int value=200;>>>>>>>main

3.解决冲突文件(推荐在vscode的合并编辑器当中修改)

删除 <<<<<<< HEAD、=======、>>>>>>> main 标记
然后修改具体内容

4.将修改后的文件添加到暂存区

gitadd<文件名>gitadd.

5.修改完成后进行提交

gitcommit-m"注释"

与合作者共事时,合作者在远程新建了仓库

# 1. 获取远程所有分支的最新信息gitfetch origin
# 2. 查看远程分支,确认存在gitbranch-r
# 3. 创建本地分支并切换到该分支gitcheckout-b<新分支>origin/<新分支># 或者使用 --track 参数gitcheckout--trackorigin/<新分支>

git仓库中的特殊文件

.gitignore

忽略不需要版本控制的文件
指定哪些文件/目录不被 Git 跟踪,通常用于编译产物、临时文件、敏感信息等。
这个文件放在哪里就递归的忽略以下的所有文件夹当中的内容

1、文件名/
该文件夹下的所有内容
2、*.o
所有.o结尾的文件test.o 123.o

# ROS 工作空间编译产物build/ devel/ install/ log/# Python__pycache__/ *.py[cod]*$py.class *.so .Python venv/ env/# C++*.o *.so *.a *.exe *.dll# IDE.vscode/# 日志和临时文件*.log *.bag *.bag.active *.tmp

当 .gitignore 不生效时,使用git rm -r --cached < 文件名/文件夹名 >移除已跟踪的文件

.gitmodules

管理子模块配置 引入外部依赖
[submodule “文件名”]
path = 相对当前文件(工程文件)的路径
url = 子模块的远程仓库地址
branch = 跟踪的分支(默认跟踪远程仓库的 main 分支)

[submodule"yolov5"]path=yolov5 url=https://github.com/ultralytics/yolov5.git[submodule"ros_ws/src/odin_ros_driver"]path=ros_ws/src/odin_ros_driver url=https://github.com/manifoldsdk/odin_ros_driver.git branch=main[submodule"NeuPAN"]path=NeuPAN url=https://github.com/ManifoldTehLtd/NeuPAN

.gitkeep

保留空目录 需要提交空目录时

.gitmessage

提交信息模板 规范提交格式

# <类型>: <简短描述>## 类型:# feat: 新功能# fix: 修复bug# docs: 文档更新# style: 代码格式# refactor: 重构# test: 测试相关# chore: 构建/工具## 示例:# feat: 添加DWA局部规划器## 详细描述(可选):# - 实现动态窗口法算法# - 添加参数配置## 关联问题: #123# 测试方法: rosrun navigation dwa_planner## 影响范围:
http://www.jsqmd.com/news/868669/

相关文章:

  • 【Feed 高并发架构实战】:雪花 ID + 三级缓存 + 计数旁路设计详解
  • 运算符的种类以及基本用法
  • Linux 进程地址空间
  • HTML实现DOCX文档版题库图文考试系统(修订)
  • ikd-Tree:FAST-LIO2中的增量式地图管理结构
  • 求职用前程无忧还是智联招聘?选对平台少走弯路
  • prerender-loader完全指南:轻松实现Webpack预渲染提升首屏加载速度
  • nodejs后端服务如何接入taotoken实现异步调用多模型对话能力
  • S200驱动器报A1489故障
  • Oracle Redo日志与Undo回滚段损坏恢复实战
  • 企业直播核心功能深度指南:互动、录制与数据分析
  • 基于FPGA实现ADC366X系列芯片配置及数据采集
  • 终极指南:快速掌握Vue 3树形结构组件的完整使用技巧
  • Paper2Poster深度解析:多智能体架构如何重塑学术海报生成范式
  • 【电池】插电式混合动力汽车PHEVs性能的模拟【含Matlab源码 15452期】
  • 你的 FlashAttention 真的在跑吗?几个简单方法确认
  • Linux库制作与使用(二):ELF文件与链接过程
  • 2026年靠谱的温州卡包批量定做公司哪家好 - 品牌宣传支持者
  • Android动态换肤终极指南:5分钟掌握零入侵皮肤切换框架
  • 快速复习C语言
  • 【飞机】数据驱动的多传感器飞机健康监测系统【含Matlab源码 15551期】
  • 3大实战技巧:使用mootdx高效获取与处理通达信财务数据
  • 老木匠、临界质量与Log曲线——一个46岁架构师的AI生存哲学
  • 2026聚氨酯砂浆生产厂家哪家好?聚氨酯砂浆定制厂家技术全解析 - 栗子测评
  • ascend-transformer-boost (ATB) - Transformer推理加速实战
  • JDK6→JDK7→JDK8 重点技术更新(精简背诵版)
  • 【仅限首批200名开发者】Gemini多模态搜索性能诊断工具包(含Latency Heatmap生成器+跨模态Embedding可视化插件)
  • TranslucentTB:重构Windows任务栏视觉体验的技术架构深度解析
  • 陈,跳台记录仪 大鼠跳台记录仪 小鼠跳台记录仪
  • 安装docker和显卡支持