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
初始化仓库
gitinitclone
复杂仓库至本地(直接clone不用init)
gitclone<在github上复制的地址>如果下载的模块当中包含子模块,那么使用递归(recursive)的方式进行clone,否则子模块只有一个文件夹
gitclone--recursive<在github上复制的地址>config
# 查看所有配置gitconfig--global--list# 查看用户名gitconfig--globaluser.name# 查看邮箱gitconfig--globaluser.email# 查看特定配置gitconfig user.namegitconfig user.emailadd—暂存
添加文件到暂存区
gitadd.commit—提交
提交文件到本地git仓库
gitcommit -m"这里输入提交注释"直接运行会进入一个文本编辑器,可以编写可换行的注释
gitcommitstatus
查看当前工作区的状态
1、所处的分支
2、尚未暂存以备提交的变更:
(使用 “git add/rm <文件>…” 更新要提交的内容)
(使用 “git restore <文件>…” 丢弃工作区的改动)
3、未跟踪的文件:
(使用 “git add <文件>…” 以包含要提交的内容)
gitstatusdiff
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
查看本地的所有分支以及当前所处的分支(使用*标注)
gitbranchgit branch -v是git branch --verbose的缩写,用于显示本地分支及其最后一次提交信息
gitbranch-v* chore/repo-restructure 9d28933 clean main d0636e5[落后3]Tune visual follow and diagnosticstest2e971d9 添加注释readmegit branch -vv是一个查看本地分支与远程分支跟踪关系的命令,可以让你快速了解每个本地分支对应哪个远程分支,以及同步状态。
gitbranch-vv相比与-v会显示本地分支追踪的远程仓库的远程分支,信息更加全面
* chore/repo-restructure 9d28933[origin/chore/repo-restructure]clean main d0636e5[origin/main: 落后3]Tune visual follow and diagnosticstest2e971d9 添加注释readmegit branch -r可以查看所有的远程分支
gitbranch-rgit 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--onelinepull
拉取并合并
当前所在的分支会从远程仓库拉取同名的远程分支
gitpullpush
推送至远程github仓库
gitpush当有多个远程仓库时(注意不能有空格)
gitpush<远程仓库名><本地分支名>:<远程分支名>gitpush<远程仓库名><本地分支名>:<远程分支名>fetch
从远程下载但是不合并
gitfetchswitch
切换分支,分支名称使用git branch查看
gitswitch<分支名称>回到上一个刚刚切换过来的分支
gitswitch -rm
不会改变仓库,只会改变暂存区和工作区
1.删除文件—工作区和暂存区删除
gitrmfile.txt2.删除目录
-r表示递归
gitrm-rdirectory/3.使用通配符
gitrm*.log4.只从暂存区删除—但保留工作区文件
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.git3.删除远程仓库
gitremotermorigin–staged对暂存区的操作
- git diff --staged
gitdiff--staged比较暂存区和最后一次提交(HEAD)之间的差异
- git restore --staged .
gitrestore--staged.从暂存区移除,恢复到未暂存的状态,但保留工作区的修改
可以理解为撤销git add操作
- 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~4git reflog
查看所有引用日志
可以查看HEAD头的历史位置,可以查看HEAD@{n}恢复
gitreflogrebase
变基操作
使用场景:当分支状态比较杂乱的时候,使用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--continuemerge
合并操作
注意1:在合并操作之前需要保证分支最新
注意2:是谁往谁上合并
1、确保你在 test 分支上
gitcheckouttest2、先获取远程最新代码
gitfetch origin3、确保本地 main 分支是最新的
gitcheckout maingitpull origin maingitcheckouttest# 切换回你的分支4、将 main 分支合并到你的分支
gitmerge main# 在当前分支(test)上合并 main 分支reset
复原操作,撤销变更,可以使暂存区恢复到之前的状态(当前修改也有保留,但是存储起来了)
这种恢复是通过移动HEAD指针的形式实现的
# HEAD指针指回,工作区保持不变gitreset 53c2688硬恢复
没有commit的修改都会丢失,工作区完全恢复到历史状态,HEAD指针也指回历史状态。
gitreset--hardf9fd6gitreset--hardHEAD~1gitreset HEAD^还可以结合HEAD@{n}来撤销之前的撤销
gitreset--hardHEAD@{1}软恢复
所有当前修改会变成暂存状态(git add 过的状态),可以重新提交。
# 只移动 HEAD 到 53c2688,但工作区文件保持不变gitreset--soft53c2688revert
也是撤销变更的一种
restore
只修改工作区/暂存区的文件内容,不进行HEAD指针的移动
工作区修改了但是我想复原
这样做就把之前在工作区的修改撤销了
gitrestore.暂存区修改了但是我不想提交上去
也就是说使用了git add
gitrestore--staged.注意:这个时候修改仍然存在,是在工作区,暂存区的修改已经撤销了
如果想在把工作区的修改撤销 还需要一步git restore .
clean
git clean -fd(ds)
如何从新建立一个仓库
本地
1、确保用户名和邮箱是自己的
gitconfig--global--list2、生成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_ed255195、
-l:列出当前代理里已加载的密钥指纹
结果:看到一条 ED25519 指纹就表示成功
ssh-add-l6、打印公钥内容(可以公开)
你需要把这一整行复制到 GitHub
cat~/.ssh/id_ed25519.pubgithub
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.com8、初始化
gitinit9、添加仓库地址
gitremoteaddorigin<仓库地址>10、推送
gitpush-uorigin master自动合并失败,修正冲突然后提交修正的结果。
1.查看哪些文件有冲突
gitstatus会出现
位于分支test您有尚未合并的路径。 (解决冲突并运行"git commit") (使用"git merge --abort"终止合并) 要提交的变更:........未合并的路径: (使用"git add <文件>..."标记解决方案)2.打开冲突文件,你会看到
<<<<<<<HEAD // 当前分支的代码 int value=100;=======// 被合并的分支的代码(main) int value=200;>>>>>>>main3.解决冲突文件(推荐在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## 影响范围: