git指令学习

文章目录

SSH设置

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

公钥

在github端的SSH Keys

私钥

存储在本地

基础

init

初始化仓库

bash 复制代码
git init

clone

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

bash 复制代码
git clone <在github上复制的地址>

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

bash 复制代码
git clone --recursive <在github上复制的地址>

config

bash 复制代码
# 查看所有配置
git config --global --list

# 查看用户名
git config --global user.name

# 查看邮箱
git config --global user.email

# 查看特定配置
git config user.name
git config user.email

add---暂存

添加文件到暂存区

bash 复制代码
git add .

commit---提交

提交文件到本地git仓库

bash 复制代码
git commit -m"这里输入提交注释"

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

bash 复制代码
git commit 

status

查看当前工作区的状态

1、所处的分支

2、尚未暂存以备提交的变更:

(使用 "git add/rm <文件>..." 更新要提交的内容)

(使用 "git restore <文件>..." 丢弃工作区的改动)

3、未跟踪的文件:

(使用 "git add <文件>..." 以包含要提交的内容)

bash 复制代码
git status

diff

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

bash 复制代码
git diff

git add之后,查看修改

bash 复制代码
git diff --cached

会显示

bash 复制代码
diff --git a/readme_cn.md b/readme_cn.md
index e51fdd4..999b3b8 100644
--- 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_publisher
   Subscribers:
 
   Publishers:

branch

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

bash 复制代码
git branch 

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

bash 复制代码
git branch -v 
bash 复制代码
* chore/repo-restructure 9d28933 clean
  main                   d0636e5 [落后 3] Tune visual follow and diagnostics
  test               2e971d9 添加注释readme

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

bash 复制代码
git branch -vv 

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

bash 复制代码
* chore/repo-restructure 9d28933 [origin/chore/repo-restructure] clean
  main                   d0636e5 [origin/main: 落后 3] Tune visual follow and diagnostics
 test               2e971d9 添加注释readme

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

bash 复制代码
git branch -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

查看提交日志

bash 复制代码
git log

--graph:表示图形化表示(增加了连线)

--oneline :表示一行显示(更加简洁)

bash 复制代码
git log --graph --oneline 

--all:表示所有的日志

bash 复制代码
git log --all --oneline 

pull

拉取并合并

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

bash 复制代码
git pull

push

推送至远程github仓库

bash 复制代码
git push

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

bash 复制代码
git push <远程仓库名> <本地分支名>:<远程分支名>
bash 复制代码
git push <远程仓库名> <本地分支名>:<远程分支名>

fetch

从远程下载但是不合并

bash 复制代码
git fetch

switch

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

bash 复制代码
git switch <分支名称>

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

bash 复制代码
git switch -

rm

不会改变仓库,只会改变暂存区和工作区

1.删除文件---工作区和暂存区删除

bash 复制代码
git rm file.txt

2.删除目录

-r表示递归

bash 复制代码
git rm -r directory/

3.使用通配符

bash 复制代码
git rm *.log

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

bash 复制代码
git rm --cached file.txt

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

remote

列出远程仓库名称

bash 复制代码
git remote

列出地址

bash 复制代码
git remote -v

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

bash 复制代码
git remote add < 仓库名 > < 仓库地址 > 

删除

bash 复制代码
# 删除远程仓库连接
git remote remove < 仓库名 >

重新命名

bash 复制代码
# 重命名远程仓库
git remote rename < 原名称 > < 新名称 >

checkout(多功能集合体)

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

bash 复制代码
git checkout <分支名称>

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

bash 复制代码
git checkout -b <新分支名称>

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

bash 复制代码
git checkout -f <分支名称>

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

bash 复制代码
git checkout --track origin/dev

git checkout -b <本地分支名> <远程仓库名>/<远程分支名>

2.恢复文件

修改了文件但是要放弃这个修改

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

bash 复制代码
git checkout -- file.txt	#单个文件	只恢复 file.txt
git checkout .	#当前目录所有文件	恢复当前目录下所有修改过的文件
git checkout -- *.txt	#匹配模式的文件	恢复所有 .txt 文件
git checkout -- dir/	#整个目录	恢复 dir 目录下的所有文件

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

3.分类HEAD头

bash 复制代码
git checkout <哈希值>

进阶

fork

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

PR(Pull Request)

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

remote---远程仓库操作

1.显示信息

bash 复制代码
# 列出已配置的远程仓库
git remote
# 输出:origin

# 查看详细信息
git remote -v
# 输出:
# origin  https://github.com/user/repo.git (fetch)
# origin  https://github.com/user/repo.git (push)

2.添加远程仓库

bash 复制代码
# 添加一个新的远程仓库
git remote add <仓库名> <地址>
git remote add origin https://github.com/user/repo.git

3.删除远程仓库

bash 复制代码
git remote rm origin

复杂

HEAD头机制

什么是HEAD头

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

查看HEAD头

bash 复制代码
cat .git/HEAD 

显示:(指向分支)

ref: refs/heads/master

或者显示(指向提交)

f492d0a609f526be1583d3cf93486c882b9f48c2

分离HEAD头

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

bash 复制代码
git checkout f492# 输入哈希值的前几位即可

会显示

注意:正在切换到 'f492'。

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

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

bash 复制代码
git switch - #一步操作之后 
git checkout master# 多步操作之后使用这条命令快速回到最新分支

移动HEAD(相对引用)

^---移动至父节点
bash 复制代码
git checkout HEAD^
git checkout main^# 或是这种
~ < num >---移动至上< num>个节点
bash 复制代码
git checkout HEAD~4

git reflog

查看所有引用日志

可以查看HEAD头的历史位置,可以查看HEAD@{n}恢复

bash 复制代码
git reflog

rebase

变基操作

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

交互式变基

bash 复制代码
git rebase -i < 基准点 >

例如:

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

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

bash 复制代码
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 = 创建合并提交

之后按照需要修改即可

终止变基

bash 复制代码
# 如果操作失误或想放弃
git rebase --abort

# 回到变基前的状态

继续变基

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

bash 复制代码
# 解决冲突后
# 保存文件后
git add .
git rebase --continue

merge

合并操作

注意1:在合并操作之前需要保证分支最新

注意2:是谁往谁上合并

1、确保你在 test 分支上

bash 复制代码
git checkout test

2、先获取远程最新代码

bash 复制代码
git fetch origin

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

bash 复制代码
git checkout main
git pull origin main
git checkout test  # 切换回你的分支

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

bash 复制代码
git merge main# 在当前分支(test)上合并 main 分支

reset

复原操作,撤销变更,可以使暂存区恢复到之前的状态(当前修改也有保留,但是存储起来了)

这种恢复是通过移动HEAD指针的形式实现的

bash 复制代码
# HEAD指针指回,工作区保持不变
git reset 53c2688

硬恢复

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

bash 复制代码
git reset --hard f9fd6
bash 复制代码
git reset --hard HEAD~1
bash 复制代码
git reset HEAD^

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

bash 复制代码
git reset --hard HEAD@{1}

软恢复

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

bash 复制代码
# 只移动 HEAD 到 53c2688,但工作区文件保持不变
git reset --soft 53c2688

revert

也是撤销变更的一种

restore

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

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

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

bash 复制代码
git restore .

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

也就是说使用了git add

bash 复制代码
git restore --staged .

注意:这个时候修改仍然存在,是在工作区,暂存区的修改已经撤销了

如果想在把工作区的修改撤销 还需要一步git restore .

clean

git clean -fd(ds)

如何从新建立一个仓库

本地

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

bash 复制代码
git config --global --list

2、生成SSH密钥

ssh-keygen:生成 SSH 密钥工具

-t ed25519:指定密钥算法为 ed25519(推荐,安全且短)

-C "邮箱":给密钥加注释,方便在 GitHub 上识别

bash 复制代码
ssh-keygen -t ed25519 -C "你的GitHub邮箱"

3、

ssh-agent -s:启动 SSH 代理并输出需要设置的环境变量

eval "$( ... )":把这些环境变量立即加载到当前终端

结果:当前 shell 拥有可用的认证代理

bash 复制代码
eval "$(ssh-agent -s)"

4、把私钥注册到代理

ssh-add:把私钥注册到代理

~/.ssh/id_ed25519:你本机的 ed25519 私钥路径

结果:后续 git/ssh 操作会自动用这把钥匙认证

bash 复制代码
ssh-add ~/.ssh/id_ed25519

5、

-l:列出当前代理里已加载的密钥指纹

结果:看到一条 ED25519 指纹就表示成功

bash 复制代码
ssh-add -l

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

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

bash 复制代码
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、测试连接

bash 复制代码
ssh -T git@github.com

8、初始化

bash 复制代码
git init

9、添加仓库地址

bash 复制代码
git remote add origin <仓库地址>

10、推送

bash 复制代码
git push -u origin master

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

1.查看哪些文件有冲突

bash 复制代码
git status

会出现

bash 复制代码
位于分支 test
您有尚未合并的路径。
  (解决冲突并运行 "git commit")
  (使用 "git merge --abort" 终止合并)

要提交的变更:
	....
	....
未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

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

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

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

删除 <<<<<<< HEAD、=======、>>>>>>> main 标记

然后修改具体内容

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

bash 复制代码
git add < 文件名 >
git add .

5.修改完成后进行提交

bash 复制代码
git commit -m "注释"

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

bash 复制代码
# 1. 获取远程所有分支的最新信息
git fetch origin
bash 复制代码
# 2. 查看远程分支,确认存在
git branch -r 
bash 复制代码
# 3. 创建本地分支并切换到该分支
git checkout -b <新分支> origin/<新分支>
# 或者使用 --track 参数
git checkout --track origin/<新分支>

git仓库中的特殊文件

.gitignore

忽略不需要版本控制的文件

指定哪些文件/目录不被 Git 跟踪,通常用于编译产物、临时文件、敏感信息等。

这个文件放在哪里就递归的忽略以下的所有文件夹当中的内容

1、文件名/

该文件夹下的所有内容

2、*.o

所有.o结尾的文件test.o 123.o

bash 复制代码
# 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 分支)

bash 复制代码
[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

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

bash 复制代码
# <类型>: <简短描述>
#
# 类型:
#   feat: 新功能
#   fix: 修复bug
#   docs: 文档更新
#   style: 代码格式
#   refactor: 重构
#   test: 测试相关
#   chore: 构建/工具
#
# 示例:
# feat: 添加DWA局部规划器
#
# 详细描述(可选):
# - 实现动态窗口法算法
# - 添加参数配置
#
# 关联问题: #123
# 测试方法: rosrun navigation dwa_planner
#
# 影响范围:
相关推荐
eLIN TECE4 小时前
Golang 构建学习
开发语言·学习·golang
Karry_6664 小时前
[特殊字符] Git 提交项目 全套命令(按顺序执行)
git
chase。4 小时前
【学习笔记】skrl: 模块化、灵活的强化学习库深度解析
笔记·学习
计算机安禾4 小时前
【Linux从入门到精通】第39篇:版本控制Git服务器搭建——Gitea/GitLab私有化部署
linux·服务器·git
lst04264 小时前
Git 巨大失误案例记录 (2026-05-01)
大数据·git·elasticsearch
nashane5 小时前
HarmonyOS 6学习:HAR包与HSP包的选择与优化指南
学习·华为·harmonyos·harmonyos 5
MegaDataFlowers5 小时前
英语六级我还在背单词:Unit 1(Lesson 1)
学习
maaath5 小时前
【maaath】Flutter for OpenHarmony 学习答题应用实战开发
学习·flutter·华为·harmonyos
donecoding6 小时前
Git Worktree:一个仓库同时在多个分支工作,告别 stash 地狱
git