这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
git
本地库连接github远程库:
git remote add origin git@github.com:yourname/learn.git
git branch -M main
git push -u origin main
- -M: 是 --move --force的缩写。
- --move(-m): Move/rename a branch.
- --force(-f): 即使新命名的branch名存在也执行。
-
第一次推送master分支时,需要加上-u参数,可以将本地的master分支推送到远程master上,
并且实现两者的同步,以后就不需要这个参数了:$ git push origin main
基础
创建仓库并推送
使用git 打开文件夹 输入 git init 创建一个仓库
基本操作-命令
- 状态查看操作
- git status
- 查看工作区、暂存区状态
- 添加操作
-
git add[file name]
(
git add .: 当前目录全部添加到暂存取) -
将工作区的“新建/修改”添加到暂存区
- 提交操作
-
git commit -m “commit message”[file name]
-
将暂存区的内容提交到本地库
-
git commit -a:
加了-a,在 commit 的时候,能帮你省一步 git add ,但也只是对修改和删除文件有效, 新文件还是要 git add,不然就是 untracked 状态
推送本地库:
git push -u origin main

密码 key:********
- 查看、操作版本的前进和后退
操作指针的前进和后退进行版本的前进和回退
查看历史版本 git log
--pretty=oneline(以一行显示)

--oneline (显示一部分哈希值,日志)

reflog (显示指针移动次数)

基于索引值操作[推荐]
- git reset --hard [局部索引值](reflog操作之后显示的)
- 使用^符号:只能回退
- git reset --hard HEAD^
- 一个^表示一步,n个表示n步
- git reset --hard HEAD~3
- (以波浪线连接,数字为要回退的版本,比如这里是回退三个版本)
公钥

得到密钥

直接复制会破怪密钥格式,输入指令复制:
clip < ~/.ssh/id_rsa.pub

工作区域、暂存区域、Git仓库
Git的工作流程:
- 在工作目录中添加、修改
- 将需要进行版本管理的文件放入暂存区域
- 将暂存区域的文件提交到Git仓库
Git管理的文件有三种状态:
- 有修改(modified)
- 已暂存(staged)
- 已提交(committed)
将工作目录的文件放在Git仓库只需要两步:
git add 文件名
git commit -m “对本次文档的说明”
项目级别/仓库级别,仅在当前本地范围内有效
- git config user.name tom_pro
- git cinfig user.email goodMorning_pro@cocovs.com
系统用户级别:登陆当前操作系统的用户范围
- git config --global user.name tom_glb
- git config --global goodMorning_pro@cocovs.com
使用Linux cat命令 查看config(配置)
cat(英文全拼:concatenate)命令用于连接文件并打印到标准输出设备上。
$ cat .git/config
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[user]
name = tom_pro
email = goodMorning_pro@cocovs.com
使用vim编辑文件 vim 文件名
退出vim编辑,Esc+:wq
git将不同版本的修改添加进.git文件中
git branch/checkout:提交、切换分支
git branch <分支名> :创建一个新的分支
git checkout <分支名> :切换到当前分支
git merge 分支和合并
将两个分支合并到一起。就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。
git merge:在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。

git rebase第二种合并分支的方法
实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase 的优势就是可以创造更线性的提交历史
Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

git在提交树上移动
HEAD是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。
分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。操作是指图中的c1,分支是main

查看HEAD指向
cat .git/HEAD
查看HEAD指向的引用
git symbolic-ref HEAD
相对引用 git log
通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用 git log 来查查看提交记录的哈希值。
并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8。
比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入fed2 而不是上面的一长串字符。
通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。
两个简单的用法:
- 使用
~<num>向上移动多个提交记录,如~3 - 使用
^向上移动 1 个提交记录
~操作符
如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~。该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次),指定向上移动多少次。
可以直接使用 -f 选项让分支指向另一个提交。
git branch -f main HEAD~3,命令会将 main 分支强制指向 HEAD 的第 3 级父提交。
撤销变更 reset or revert
在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。
主要有两种方法用来撤销变更 :
-
git reset通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
-
git revert虽然在你的本地分支中使用
git reset很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!为了撤销更改并分享给别人,我们需要使用git revert。撤销的提交记录后面居然多了一个新提交!这是因为新提交记录
C2'引入了更改 —— 这些更改刚好是用来撤销C2这个提交的。也就是说C2'的状态与C1是相同的。revert 之后就可以把你的更改推送到远程仓库与别人分享啦。

远程仓库
下载github项目
在目标文件夹中右键进入git
git clone git@github.com:william-zk/RB_Tree.git
常用操作清单
| 命令 | 功能 |
|---|---|
| git init | 在本地的当前目录里初始化git仓库 |
| git status | 查看当前仓库的状态 |
| git add -A | 增加目录中所有的文件到缓存区 |
| git add file | 增加相应文件到缓存区 |
| git commit -m "信息" | 将缓存区中更改提交到本地仓库 |
| git log | 查看当前版本之前的提交记录 |
| git reflog | 查看HEAD的变更记录,包括回退 |
| git branch -b branch_name | 建立一个新的分支 |
| git diff | 查看当前文件与缓存区文件的差异 |
| git checkout -- file | 取消更改,将缓存区的文件提取覆盖当前文件 |
| git reset --hard 版本号 | 回退到相应版本号,同样也可以回退到未来的版本号 |
| git clean -xf | 删除当前目录中所有未追踪的文件 |
| git config --global core.quotepath false | 处理中文文件名 |