玩转Git

68 阅读7分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

Git概述

所谓Git就是分布式版本控制工具,版本就是我们所提交的每一个日志节点就是所谓的代码版本,分布式的概念体现在每一个客户端提取的不是最新版本的快照,而是直接把代码仓库直接Clone到本地库,这样任意一处文件发生故障,都可以用其他客户端的本地仓库进行恢复,并且在远端仓库进行断网的情况下也可以进行开发工作

image-20220517213917595.png

工作区:我们平时新增文件就会处于工作区,在工作区中的文件无法被Git 追踪 所以我们需要 git add 命令将我们的文件添加进暂存区

暂存区:保存了下次将提交的文件列表信息

本地库:存放我们从暂存区提交的信息,我们Push的时候就是将本地仓库的版本推送到远程仓库,在这儿之前的操作都是不用依靠网络来完成,这就是所谓分布式的一大特点。

远程仓库:我们通过Push命令会将我们本地仓库的版本代码推送到远程仓库,远程仓库会替我们管理代码,并且我们在任意客户端上可以将代码Clone下来进行开发

Git常用命令详解

image-20220517213744119.png

一、关于分支的操作命令

命令名称作用
git branch [分支名称]新建分支
git branch [分支名称] [记录节点引用]从某个版本节点应用上新建分支
git branch [-r/-d]查看本地分支列表 -r 查看远端分支列表 -d <分支名称> 删除本地分支
git checkout [分支名称]切换到某个分支 此时的HEAD指针也指向我们切换的分支
git merge [分支名称]将指定分支合并到当前分支,这种合并分支的方式会产生一种合并分支的记录 (可以看出下图1就是通过merge命令合并分支)
git rebase [分支名称]Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去,rebase可以创造更线性的提交历史记录

在高版本的git中切换分支的命令会替换成git switch [分支名称]

image-20220508212055006.png

image-20220508212142661.png

​ master:待变基分支 当前HEAD指针指向的分支

​ bugFix:变基分支 目标分支

​ 当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用 到基分支的最新提交的后面。

二、版本节点引用的Git操作命令

HEAD 引用表示当前操作的节点引用,Git 切换版本,底层其实是移动的 HEAD 指针,分支底层其实也是指针的引用

通过HEAD我们可以选中我们想要移动的提交记录节点 ,其实可以通过checkout 节点记录的hash值进行节点记录的选中,但是由于hash值过长操作不便 所以会出现^的相对引用

命令名称作用
git checkout HEAD^在当前HEAD引用记录节点上,移动到上一个父节点
git checkout HEAD~[移动节点数]在当前HEAD引用记录节点上,移动指定数目的父节点
git branch -f main HEAD~[移动节点数]这个命令会让某个分支强制回到指定数目的父提交上
git branch -f main [节点引用]让分支指向另一个提交记录点
git reset HEAD~1该命令主要是将记录向上移动【撤销提交】(git reset 无法撤销远端分支的提交记录)
reset命令的附加参数:
git reset -soft HEAD~1撤销的文件会自动处于暂存区状态
git reset -mixed HEAD~1撤销的文件状态是未加入暂存区 ,需要git add 指令加入暂存区 (默认就是该参数)
git reset -hard HEAD~1撤销的文件和commit记录都会被删除 ,慎用
git revert HEADreset命令是撤销本地提交 ,如果需要撤销远程仓库提交记录就需要用到该记录

:warning: revert 撤销远端分支之后会生成 一条新的记录 该记录主要是撤销记录节点的父节点相同,然后push到远端就能共享此次撤销了

image-20220508214847172.png

git branch -f main HEAD~3 这个命令会让某个分支强制回到第3级的父提交上

image-20220508215342990.png

-f 选项让分支指向另一个提交记录

image-20220508222326563.png

撤销操作

git reset HEAD~1 该命令主要是将记录向上移动并且reset之后撤销节点分支的变更记录还存在只是处于未加入暂存区状态(git reset 无法撤销远端分支的提交记录)

image-20220509213446828.png

三、整理提交记录

1、git cherry-pick <提交记录号> 将一些提交复制到当前所在的位置(HEAD)下面

应用场景:   我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用 `git cherry-pick` 了。

2、cherry-pick 需要提供hash日志记录值 如果不想使用这种可以使用 交互式的rebase来进行记录的整理

git cherry-pick c3 c2 c1  //将日志记录顺序重排成 c3 c2 c1

git rebase -i HEAD ~[向上调整的记录条数]

四、暂存文件

​ 有这么一个场景,现在你正在用你的 feature 分支上开发新功能。这时,生产环境上出现了一个 bug 需要紧急修复,但是你这部分代码还没开发完,不想提交,怎么办?这个时候可以用 git stash 命令先把工作区已经修改的文件暂存起来,然后切换到 hotfix 分支上进行 bug 的修复,修复完成后,切换回 feature 分支,从堆栈中恢复刚刚保存的内容。

命令名称作用
git stash把本地的改动暂存起来
git stash save “暂存信息”执行存储时,添加备注,方便查找。
git stash apply [stash@{0}]应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即 stash@{0},
git stash list查看stash的存储列表
git stash clear删除所有stash 缓存内容

五、远端仓库相关操作

命令名称作用
git fetch [-all]从远程获取最新版本到本地,不会自动合并分支
合并远端分支到本地仓库:
git cherry-pick origin/master
git rebase origin/master
git merge origin/master//通过这个命令区合并远端分支节点会产生许多的合并记录
git pullpull 默认的行为是 fetch+merge
git pull --rebase行为就是 fetch+rebase

git fetch

1、下载远程仓库下载本地仓库中缺失的提交记录
2、更新远程分支节点指针
这个操作并不会修改本地记录 只是更新分支记录以及节点指针
假设你周一克隆了一个仓库,然后开始研发某个新功能。到周五时,你新功能开发测试完毕,可以发布了。但是5天啊!你的同事这周写了一堆代码,还改了许多你的功能中使用的 API,这些变动会导致你新开发的功能变得不可用。但是他们已经将那些提交推送到远程仓库了,因此你的工作就变成了基于项目旧版的代码,与远程仓库最新的代码不匹配了。


//我们通常的操作是啥 fetch->pull 有冲突解决冲突,合并然后产生一大堆mergeinto 的信息导致分支提交记录不干净?

此时我们就可以使用git pull --rebase 操作会保证分支提交记录的干净整洁

Git学习沙盒:learngitbranching.js.org/?locale=zh_…

Git沙盒模拟:git-school.github.io/visualizing…