1. 一些概念
- 工作区:就是你在电脑里能看到的目录;
- 暂存区:stage区 或 index区。存放在 :工作区 / .git / index 文件中;
- 版本库:本地仓库,存放在 :工作区 / .git 中
- 关于 HEAD
- 是所有本地分支的游标(指针);
- HEAD既可以指向某个分支,还可以指向某个分支的某个(次)提交;
- HEAD指向谁,谁就是和当前工作区、暂存区、相关联的分支,即:对于add、checkout、commit命令去操作的分支对象!
- HEAD的存在非常重要,因为它提供了对当前工作区状态的快速访问和管理;
- 相关命令:
git checkout branch_name命令切换分支,HEAD会指向所切换到的分支。
git checkout commit_hash命令切换到某个具体的提交,HEAD会指向该提交。
- master和origin的关系
- master 表示本地仓库主分支(名称);
- origin 是远程仓库的代指;origin 是远程Git仓库的默认名称;
- origin 是远程仓库的主分支?
- 例如在使用:git clone https://github.com/ArduPilot/ardupilot.git 下载远程仓库代码时,在后续的操作中,默认会将 https://github.com/ArduPilot/ardupilot.git 指向的远程仓用origin来表示!
- 本地仓库
远程仓库的拷贝(这个说法不太准确) - 远程仓库
- 用于多个本地仓库的协调开发;
- 用于备份本地仓库;
- 分支
- 分支也称为“快照”
- 一个分支代表一条独立的开发线;
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作,最后还可以合并到主分支:
- 只有仓库才存在所谓分支,工作区和暂存区不存在分支的说法;本地仓库有分支,本地分支;远程仓库有分支,远程分支;
- 相关命令:
- 参考文献:http://rogerdudler.github.io/git-guide/index.zh.html
- 在远程开好分支,本地直接拉下来;
git checkout -b feature-branch origin/feature-branch //检出远程的feature-branch分支到本地 - 本地开好分支,推送到远程;
git checkout -b developer_gen3_new_branch_name //在本地创建分支
git push --set-upstream origin developer_gen3_new_branch_name //推送到远程 - git branch + 分支名字:创建本地分支
- git checkout -b <分支名> :创建并切换到新的本地分支
- git checkout<分支名>: 切换到本地分支
- git branch 查看当前分支
- git branch -a:查看全部分支(包含本地和远程)
- git branch -v:查看每一个(本地)分支的最后一次提交
- git branch --merged:查看哪些(本地)分支已经合并到当前(本地)分支
- git branch --no-merged : 查看哪些(本地)分支还没有合并到当前(本地)分支
- git branch --no-merged master:查看当前未合并到master分支的有哪些?
- git branch --merged master:查看当前已合并到master分支的有哪些?
- git merge <分支名>:希望要把哪个分支合并到当前所在的分支
- git branch -d [branchname]:删除本地分支
- git push origin --delete [branchname]:删除远程分支
2. Git 基本命令简述
- 参考文献:https://www.runoob.com/git/git-basic-operations.html
- 关于工作区、暂存区、本地仓库 的操作:
命令 | 说明 |
---|---|
git remote -v | 查看远程仓库的地址 |
git add | 添加文件到暂存区 |
git status | 查看仓库当前的状态,显示有变更的文件。 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit | 提交暂存区到本地仓库。 |
git reset | 回退版本。 |
git rm | 将文件从暂存区和工作区中删除。 |
git mv | 移动或重命名工作区文件。 |
git checkout | 分支切换。 |
git switch | 更清晰地切换分支(Git 2.23 版本引入)。 |
git restore | 恢复或撤销文件的更改(Git 2.23 版本引入)。 |
- 关于远程仓库、本地仓库相关的操作:
命令 | 说明 |
---|---|
git remote | 远程仓库操作 |
git clone | 从远程获取代码库 |
git clone -b 分支名 仓库地址 | clone 指定分支 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
git submodule update --init | 初始化子模块 |
git submodule update --init --recursive | 下载子模块代码 |
- 日志
命令 | 说明 |
---|---|
git log | 查看历史提交记录 |
git blame | 以列表形式查看指定文件的历史修改记录 |
- Git 标签
https://www.runoob.com/git/git-tag.html
3. Git 服务器
- 自己搭建服务器
- 使用 github
- 参考:https://www.runoob.com/git/git-server.html
4. fork 源作者更新后如何同步更新且不覆盖自己仓库的代码
- https://blog.csdn.net/luoyeyilin/article/details/108994031
- 试了一下,github上的 sync fork 操作并不会覆盖掉自己仓库下master分支中自己编写的代码…
5. Git 配置自定义编辑器
- 查看当前编辑器
git config --global core.editor
执行命令后没显示则表示没配置 - 指定一个编辑器
git config --global core.editor 编辑器名
6. 指令大全用法案例
6.1 本地
6.1.1 git remote :查看远程仓库地址origin
- git remote -v
6.1.2 git --help :帮助
- git --help
- git help -a
查看所有子命令 - git help -g
查看相关的概念 - 向前、向后 一行:
e, y - 输入git --help 或git subCmd --help 后出现冒号 “:” 或 “press h for help or q to quit” 的:
按下 e, y 进行翻页
6.1.3 git status :显示工作目录和暂存区的状态
所谓状态的包括(对于状态的详细解释)
- 拟提交的变更 这是已经放入暂存区,准备使用 git commit 命令提交的变更。
- 未暂存的变更 这是工作目录和暂存区快照之间存在差异的文件列表。
- 未跟踪的文件 首次添加到目录中的文件。
- 已忽略的文件
实例 | 描述 |
---|---|
git status | 显示工作目录和暂存区的状态。 |
git status -s | 以精简的方式显示文件状态。 |
git status --ignored | 显示工作目录和暂存区的状态,列出包括被忽略的文件。 |
查看文件的具体修改详情请移步 git diff | git diff 或 git diff -stat |
git status --ignored:
6.1.4 .gitignore :添加忽略文件 / 文件夹
- git上传项目时有一些目录和文件是不需要上传的,如node_modules、package-lock.json等,容易导致他人拉取后冲突。可以使用git add xx 选择性上传文件,但很麻烦。
- 工作目录下的 .gitignore 可以配置过滤文件、文件夹;
- . gitignore 语法:
#忽略.idea文件夹及文件夹下文件
.idea
#忽略以.iml结尾的文件
*.iml
# 忽略*.o和*.a文件
*.[oa]
# 忽略*.b和*.B文件,my.b除外
*.[bB]
!my.b
# 忽略dbg文件和dbg目录
dbg
# 只忽略dbg目录,不忽略dbg文件
dbg/
# 只忽略dbg文件,不忽略dbg目录
dbg
!dbg/
# 只忽略当前目录下的dbg文件和目录,子目录的dbg不在忽略范围内
/dbg
- . gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m ‘update .gitignore’
6.1.5 git diff :查看工作区、暂存区、版本库之间的差异
查看、比较被git管理的文件在工作区、暂存区和版本库之间的差异。但只针对已跟踪的文件!
四个情景下文件的差异的比较:
1)工作区和暂存区
2)工作区和版本库
3)暂存区和版本库
4)不同版本之间文章来源:https://www.toymoban.com/news/detail-760171.html
- 工作区和暂存区的差异
git diff 列出详细差异,e y键前进后退
git diff -- filename1 filename2 ... 查看多个文件在工作区和暂存区间的差异
- 工作区和版本库的差异
git diff HEAD 工作区与最新版本库间的差异
git diff commitID 工作区与某提交版本间的差异,commitID是版本ID,git log获取版本hash
git diff HEAD -- filename1 filename2 ... 指定文件在工作区与最新版本库间的差异
git diff commitID -- filename1 filename2 ... 指定文件在工作区与某版本库间的差异
- 暂存区和版本库间的差异
git diff --cached 暂存区和最新版本库(HEAD)间的差异
git diff --cached commitID 暂存区和指定版本间的差异
git diff --cached -- filename1 filename2 ... 指定文件在暂存区与最新版本库间的差异
git diff --cached commitID -- filename1 filename2 ... 指定文件在暂存区与某版本库间的差异
- 不同版本间的差异
git diff commit1ID commit2ID 版本1和版本2间的差异
git diff commit1ID commit2ID -- filename1 filename2 ... 指定文件在版本1和版本2间的差异
- 常用的option
--stat 简洁的展示差异
其他,如路径约束等
- 如何获取版本hash?
上文提到的 commitID 即 hash 值;
git log : 查看详细历史记录,按提交时间倒叙排列,包含提交时间,提交作者,提交备注以及提交的hash值;
git log --pretty=oneline : 格式化log形式,每条log只有一行,只包含 完整的hash值 和 提交的备注;
git log --oneline : 格式化log形式,每条log只有一行,只包含 短hash值 和 提交的备注;
6.1.6 git add :添加文件到暂存区:
git add * 添加所有跟踪、未跟踪文件的更改到暂存区
git add . 添加所有已跟踪、未跟踪文件的更改到暂存区
git add -u . -u 只添加已跟踪文件的修改到暂存区
git add filename 指定文件
git add index/ 指定文件夹
6.1.7 git commit :工作区或暂存区提交到版本库
# 将暂存区内容提交到版本库, 会跳进编辑器以输入提交信息
git commit
# 将某些已被跟踪的文件提交到版本库(包含工作区和版本库)
git commit [file1] [file2] [...]
# 将暂存区内容提交到版本库, 无需进入编辑器输入提交信息
git commit -m [message]
# 跳过 git add, 将所有已被跟踪的文件更改提交到版本库
git commit -am [message]
# 使用一次新的commit, 替代上一次提交,如果代码没有任何新变化, 则用来改写上一次commit的提交信息
git commit --amend -m [message]
6.1.8 git config :管理配置文件
-
git config --list
查看配置文件 -
git config --edit
编辑配置文件 -
git config --global core.editor 编辑器名如gedit
指定git的默认编辑器
6.2 远程
6.2.1 git pull :拉取远程分支并与本地分支合并
-
pull 前
pull后,工作区也会被更新,因此pull前最好先add和commit防止代码丢失。
pull 前 先配置一些merge的属性:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
git config pull.rebase false --global # 全局属性--global
- git pull 拉取与本地当前分支同名的远程分支,然后合并到当前本地分支,并在本地创建一个提交
-
git pull <远程主机名> <远程分支名>:<本地分支名>
如: git pull origin master:adrc-v1.0 将远程的master分支拉取并合并到本地的adrc-v1.0
如果远程某分支与当前分支合并,则冒号后面的部分可以省略 -
合并冲突
- pull后提示冲突:手动合并冲突 ~> add ~> commit ~> push ~> 检查合并是否成功 git log
- 用 git status 或 git diff --stat 或 git diff --name-only --diff-filter=U 查看冲突的文件列表
- git diff --diff-filter=U 则可以看到冲突的具体内容,按e翻页
- gedit 冲突文件名:手动解决冲突
- git add 冲突文件 或 git add .
- git commit :提交合并
- git log :查看合并是否成功
- pull后提示冲突:手动合并冲突 ~> add ~> commit ~> push ~> 检查合并是否成功 git log
6.2.1 git push 推送本地当前分支到远程仓库
- git push 只推送当前分支,其他分支不理
- push时报错:fatal: Authentication failed for ‘https://github.com/xxxxxl/ardupilot.git/’
只需要把密码替换为token即可,如何获取token则参考:https://blog.csdn.net/weixin_63031041/article/details/128731242
6.2.3 git clone 克隆远程仓库到本地
-
git clone 仓库地址
默认克隆master分支 -
git clone -b 分支名 仓库地址
只克隆指定分支 -
git submodule update --init --recursive
初始化并下载子模块
6.3 分支
查看、创建、切换、合并、删除
- 在远程开好分支,本地直接拉下来;
git checkout -b feature-branch origin/feature-branch //检出远程的feature-branch分支到本地 - 本地开好分支,推送到远程;
git checkout -b developer_gen3_new_branch_name //在本地创建分支
git push --set-upstream origin developer_gen3_new_branch_name //推送到远程 - git branch + 分支名字:创建本地分支
- git checkout -b <分支名> :创建并切换到新的本地分支
- git checkout<分支名>: 切换到本地分支
- git branch 查看当前分支
- git branch -a:查看全部分支(包含本地和远程)
- git branch -v:查看每一个(本地)分支的最后一次提交
- git branch --merged:查看哪些(本地)分支已经合并到当前(本地)分支
- git branch --no-merged : 查看哪些(本地)分支还没有合并到当前(本地)分支
- git branch --no-merged master:查看当前未合并到master分支的有哪些?
- git branch --merged master:查看当前已合并到master分支的有哪些?
- git merge <分支名>:希望要把哪个分支合并到当前所在的分支
- git branch -d [branchname]:删除本地分支
- git push origin --delete [branchname]:删除远程分支
6.4 查看提交历史、哈希、commit Id
- git log
- git log 分支名
- git log --reflog
- git log --format=oneline
6.5 标签 tag
- 给最新的提交大标签:git tag -a tag -m tagmsg
- 给某个提交贴标签:git tag -a tag hash
- 查看标签:git log --decorate
- 查看所有标签:git tag
参考文献
多用方可熟练!!
https://haicoder.net/git/git-status.html
https://www.cnblogs.com/ygbh/p/17470075.html#_label3_0_2_0文章来源地址https://www.toymoban.com/news/detail-760171.html
到了这里,关于ardupilot开发 --- git 篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!