分布式版本控制工具Git--基本操作指令
安装完配置name/email
$ git config --global user.name="..."
$ git config --global user.email="..."
初始化git仓
$ git init
随后都隐藏$
此时项目文件夹内生成.git隐藏文件夹
目录下
各层文件作用
-
hooks:存放一些shell脚本
-
info:包含git仓库的一些信息
-
logs:保存所有更新的引用记录。logs文件夹有refs文件夹和HEAD文件
(1)HEAD文件保存的是所有的操作记录,使用git reflog查询的结果就是从这个文件来的
(2)refs文件夹中一般会有两个文件夹:
- heads: 存储所有本地分支的对象,每个本地分支名对应一个文件名称。这些分支文件中存储的是对应本地分支下的操作记录。使用git branch查看本地所有分支时,查询出的分支就是heads文件夹下所有文件的名称。
- remotes:存储所有远程分支的对象,每个远程分支对应一个文件名称。这些分支文件中存储的是对应远程分支下的操作记录
-
objects:存放所有 git 对象,哈希值一共40位,前 2 位作为文件夹名称,后 38 位作为对象文件名
-
refs:引用,一般有三个文件夹:
(1)heads:存储所有本地分支的对象,每个本地分支名对应一个文件名称,文件中存储了分支最近一次提交commit对应的id(是一个哈希值)。
(2)remotes:远程仓库信息,其中\refs\remotes\origin\HEAD记录了当前分支指向的远程分支,即当前分支提交到的远程分支
(3)tags: 发布重要版本时,用于标记此里程碑。 -
COMMIT_EDITMSG:存储着最近一次的提交信息,Git系统不会用到这个文件,只是给用户一个参考
-
config:存储当前仓库的配置信息
-
description:描述信息
-
HEAD:HEAD指针,它指向了当前分支,这个文件记录了当前分支是哪个分支。
-
index:暂存区(stage),是一个二进制文件
操作指令
推送入仓
git status
查看状态
- 未入仓的文件状态为 Untracked(未跟踪)
git add 文件名
将文件添加至暂存区
- 此时状态为 Staged(暂存)
git commit 文件名
将文件提交至本地库,编写注释完成提交 或者
git commit -m "注释/解释内容" 文件名
直接带注释提交
- 此时状态为 Unmodify(未修改),即版本库中的文件快照内容与文件夹中完全一致
CRLF警告
直接
git config --global core.autocrlf false
解释:由于不同系统的换行符不同引起的警告,无碍
版本回退穿梭
版本更新
- 修改了某个文件后,此文件的status变为 Modified(已修改)
需要重新对该文件进行add,commit操作
git add 文件名
git commit -m "注释/解释内容"
可不跟文件名
git log 文件名
查看该文件历史记录
git log --pretty=oneline 文件名
可简易查看
版本回退
git reset --hard HEAD^
回退到上次操作
git reset --hard HEAD~n
回退n次操作
版本穿越
git reflog 文件名
查看历史记录的版本号
git reset --hard 7位版本号
版本号的穿越
还原文件
git restore 文件名
撤销修改过的文件内容,已修改未add
删除某个git文件(已在仓中)
git rm 文件名
此时该文件状态变为 deleted
然后
git commit -m "日志msg"
完成此操作
Git的三个区
-
工作区(Working Directory)
电脑上的硬盘目录 -
本地库(Repository)
工作区中的隐藏目录.git就是Git的本地版本库 -
暂存区(Stage)
一般存放在.git下的index文件,有时也称为索引
图片源自网络
Git分支操作
分支的作用,举个例子:产品上线的同时又要修改bug,又要开发新功能供给上线,分支让主生产(主线程)不受影响的情况下完成版本迭代
创建分支
git branch 分支名
创建分支
git branch -v
查看分支
分支为镜像不影响主分支
切换分支
git checkout 分支名
切换至分支
git checkout -b 分支名
一步完成(创建加切换)
合并分支
git checkout master
先切换至主干
git merge 目标分支名
把目标分支合并到当前分支
此处出现的问题:版本冲突(本地库)
- 冲突原因:不同分支都做出了修改,系统无法决定合并哪个分支
- 解决方法:人工干预,不能将其他开发人员的代码覆盖或者del掉
👇
git diff
:查看冲突,对比(vim也能查看)
双方共同解决(对冲突文件rebuild)vim a.txt
git commit -m "fix conflict"
git add a.txt
git commit -m "fix conflict"
顺利解决
删除分支
git checkout master
先切换至主干
git branch -d 分支名
删除分支
关联远程库
创建SSH Key
ssh-keygen -t rsa -C 邮箱地址
创建SHH Key
会生成一个类似二维码的output和一个sha-256的哈希
用户本地生成一个.ssh的文件夹,其中包含公钥和私钥
公钥用于建立远程库链接时的凭据
视为创建成功
测试连接性:
ssh -T git@github.com
返回
连接成功
关联远程库
git remote add origin https://github.com/aabbcc/a.git
关联一个远程库
git push -u origin main
(第一次要用-u) 把当前的main分支推送至远程库(push之前先fetch!!!避免冲突!!!)
git pull orgin main
拉取远程库至main分支
git clone https://github.com/.....
从远程库中克隆
git remote
查看远程库的信息(加-v是详细信息)
git remote rm origin
移除远程库
远程库与本地库
三种状态
先执行git fetch origin 分支名
匹配远程库
然后执行git status
-
本地库比远程库新(fetch后可放心push)
-
远程库比本地库新(fetch后首先pull,避免冲突!)
-
本地库与远程库版本一致