文章目录
- SSH设置
- 基础
- 进阶
-
- fork
- [PR(Pull Request)](#PR(Pull Request))
- remote---远程仓库操作
- 复杂
- 如何从新建立一个仓库
- 自动合并失败,修正冲突然后提交修正的结果。
- 与合作者共事时,合作者在远程新建了仓库
- 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 -v 是 git 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
#
# 影响范围: