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 基本命令简述
关于工作区、暂存区、本地仓库 的操作:
命令说明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 以列表形式查看指定文件的历史修改记录
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 diffgit 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)不同版本之间
- 工作区和暂存区的差异
gitdiff 列出详细差异,e y键前进后退
gitdiff -- filename1 filename2 ... 查看多个文件在工作区和暂存区间的差异
- 工作区和版本库的差异
gitdiff HEAD 工作区与最新版本库间的差异
gitdiff commitID 工作区与某提交版本间的差异,commitID是版本ID,git log获取版本hash
gitdiff HEAD -- filename1 filename2 ... 指定文件在工作区与最新版本库间的差异
gitdiff commitID -- filename1 filename2 ... 指定文件在工作区与某版本库间的差异
- 暂存区和版本库间的差异
gitdiff--cached 暂存区和最新版本库(HEAD)间的差异
gitdiff--cached commitID 暂存区和指定版本间的差异
gitdiff--cached -- filename1 filename2 ... 指定文件在暂存区与最新版本库间的差异
gitdiff--cached commitID -- filename1 filename2 ... 指定文件在暂存区与某版本库间的差异
- 不同版本间的差异
gitdiff commit1ID commit2ID 版本1和版本2间的差异
gitdiff 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 :添加文件到暂存区:
gitadd * 添加所有跟踪、未跟踪文件的更改到暂存区
gitadd. 添加所有已跟踪、未跟踪文件的更改到暂存区
gitadd-u.-u 只添加已跟踪文件的修改到暂存区
gitadd filename 指定文件
gitadd 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# rebasegit config pull.ff only # fast-forward onlygit 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 :查看合并是否成功
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]:删除远程分支
参考文献
多用方可熟练!!
https://haicoder.net/git/git-status.html
https://www.cnblogs.com/ygbh/p/17470075.html#_label3_0_2_0
版权归原作者 干了这碗汤 所有, 如有侵权,请联系我们删除。