Git 工作区、暂存区和版本库的概念
工作区:就是你在电脑里能看到的目录。
暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage, index),标记为 “master” 的是 master 分支所代表的目录树。
当对工作区修改(或新增)的文件执行 “git add” 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
git拉取代码基本的命令:
下载代码
git clone https://github.com/ultralytics/yolov5
设置用户名,邮箱
git config --global user.email "simple.sheng@aiwinn.com"
git config --global user.name "simple.sheng"
查看远程仓库的地址
git remote -v
修改远程仓库的地址
git remote set-url origin http://192.168.1.1/3rdpartys/opencv_4.5.2.git
创建并切换分支
git checkout -b v0.9rc1
切换分支
git checkout master
更新代码到本地
git pull
查看代码的状态
git status .
查看当前使用分支
git branch
查看所有分支
git branch -a
将暂存区的单个文件去掉,就是将绿的变红
git reset HEAD <file>
将暂存区中添加所有文件去掉,就是将绿的变红
git reset HEAD
放弃本地修改,直接覆盖
git reset --hard
退回到某个指定的版本
git reset bb2b53300f --hard
撤销对某个文件的修改
文件在工作区的改坏了,可以用该命令进行还原
git checkout -- 文件名
git新建分支并上传分支的代码:
#查看当前分支
git branch
#查看所有的分支
git branch -a
例如我要建一个名称为nolog的分支
新建并切换到nolog的分支
git checkout -b nolog
若已有nolog的分支,切换到nolog的分支
git checkout nolog
将nolog分支下,要上传的代码提交,第三步在origin后面跟上当前分支的名称
git add .
git commit -m "nolog branch"
git push origin nolog
查看本地分支
git branch
查看远程分支
git branch -r
删除本地未合并的分支
git branch -D 分支名
删除本地已合并的分支
git branch -d 分支名
删除远程分支
git push origin –delete nolog #删除远程分支
git branch -d nolog #删除本地分支
submodule相关的命令:
下载子项目
git submodule init # 初始化本地配置文件
git submodule update # 从该项目中抓取所有数据并检出父项目中列出的合适的提交。
添加子模块:
git submodule add http://192.168.1.100:3000/simple.sheng/image.git
然后 将.gitmodule 和 image 提交到git中
删除子模块:
rm -rf 子模块目录 删除子模块目录及源码
vi .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目
vi .git/config 删除配置项中子模块相关条目
rm .git/module/* 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可
在使用https git拉取代码时,每次git pull的时候都会让输入用户名和密码
进入项目目录
git config --global credential.helper store
如果要清除用户名和密码
运行一下命令缓存输入的用户名和密码
git config --global credential.helper wincred
清除掉缓存在git中的用户名和密码
git credential-manager uninstall
git pull 提示 git branch --set-upstream-to=origin xxx
当前分支与远程分支并未建立联系,需要执行一下 git branch --set-upstream-to=origin/ 操作
若当前是main的分支,输入命令:
git branch --set-upstream-to=origin/main main
该命令让当前分支和远程分支建立联系之后,就可以进行git pull,git push的操作了。
git commit后,如何撤销本地commit的代码
例如:
git add test.txt
git commit -m "update"
执行完commit后,还没有执行push,若想要撤销这次的commit,可以使用git reset --soft HEAD^,使用git reset --hard HEAD^,这样连暂存区的文件也撤销了
命令解释:
HEAD^ 表示上一个版本,即上一次的commit,几个^代表几次提交,如果回滚两次就是HEAD^^
也可以写成HEAD~1,如果进行两次的commit,想要都撤回,可以使用HEAD~2
--soft
不删除工作空间的改动代码 ,撤销commit,不撤销add
--hard
删除工作空间的改动代码,撤销commit且撤销add
如果commit后面的注释写错了,可以运行git commit --amend
进入vim编辑模式,修改完保存即可
撤回历史的提交记录
若想撤回上一次的提交记录,即回到上上个版本
git rebase -i 版本的id号
然后弹出一个交互的命令行,将前几行的pick改回drop,然后按esc,:wq进行保存,即删除了最近的提交记录。
.gitignore文件用法及配置
语法规范
# 注释该行
* 匹配零个或多个字符
*.a表示忽略.a文件
*.[oa]表示忽略所有以.a和.o结尾的文件,*~忽略所有以~结尾的文件
[]用来用来匹配括号内的任一字符,如[abc],也可以在括号内加连接符,如[0-9]匹配0至9的数
?用来匹配单个字符
! 用来否定忽略
比如前面用了*.txt,然后使用!*a.txt,则这个a.txt不会被忽略
/ 正斜杠在前:匹配项目跟目录;如/bin表示忽略根目录下的bin文件,/bsp表示忽略根目录下的bsp文件
夹,但不忽略子目录里的user/bsp文件夹
正斜杠在后:匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;如bsp/表示忽略bsp文件夹里
的所有文件
** 匹配多级目录,可在开始,中间,结束
忽略优先级
1.忽略bin文件
#忽略所有的.bin文件
*.bin
2.否定忽略link.bin
#不忽略目录下的link.bin
!link.bin
#不忽略obj目录下的link.bin
!/obj/link.bin
3.忽略某目录的.txt,不包括其子目录的.txt
#忽略doc/notes.txt, 不包括doc/server/arch.txt
doc/*.txt
4.忽略某目录内所有的.pdf文件
#忽略所有的 .pdf 文件在doc的任意子目录下的
doc/**/*.pdf
5.忽略当前目录.c,不忽略子目录.c
#忽略cat.c,不忽略 build/cat.c
/*.c
6.忽略当前路径下的Proj文件夹,该文件夹下的所有内容都会被忽略
#忽略当前路径下的Proj文件夹,该文件夹下的所有内容都会被忽略
Proj/
7.忽略Proj文件夹子目录文件夹
#忽略Proj文件夹子目录Obj文件夹里的所有文件
Proj/Obj/
8.忽略根目录下的某文件
#忽略根目录下的bin文件
/bin
9.忽略/foo, a/foo, a/b/foo等
#忽略/foo, a/foo, a/b/foo等
**/foo
10.忽略a/b, a/x/b, a/x/y/b等
#忽略a/b, a/x/b, a/x/y/b等
a/**/b
11.忽略当前路径的某文件
#忽略当前路径的config.php文件
config.php
git上传文件夹,但不上传里面的内容
例如results的文件夹
.gitignore中下面一行,不会保证了不会上传results里面的内容
results/
在results的文件夹中添加.gitkeep的空文件,然后使用以下命令,将该文件推送到git的远程仓库
git add -f resullts/.gitkeep