git基本原理以及常用命令


git的使用方法

最近从一些网站搜集了一些关于git的资料,这里做一个总结,方便自己以后查阅。

一、版本控制的理解

工作区——————->暂存区———————>版本库

工作区:在本地自己创建的仓库,可以在本地进行修改。

暂存区:就是一个缓冲区,每次要将工作区的内容传入到版本库时,就要先将内容先放进暂存区。

版本库:存放所有已经提交到本地仓库的代码

版本结构:是一种树的结构,可以有多个分支,有master分支,树的一个节点就是一个代码版本

二、本地三个区域的常用操作

工作区:

git init 在本地(自己的计算机上)生成一个代码仓库,标志是.git

git status 查看仓库的状态

git log 查看当前分支的所有版本(不包括回滚)

git reflog查看HEAD 指针的移动路线

工作区->暂存区

git add + xxx.txt 将xxx文件的修改从工作区添加到暂存区

git add . 将工作区的所有文件的修改一并添加到暂存区

ok,这里弄清楚一个概念,这里的add并不是添加一个文件实体,而是添加的是一个文件的修改操作。

例如,想要删除一个a.txt文件,我们应该这样做.

rm a.txt

git add a.txt

就是首先在本地删除这个a文件,然后将这个删除操作添加到staged里面。

git restore 将工作区的文件变成与暂存区相同

git restore --staged a.txt 从暂存区中撤销对a文件的操作

暂存区->版本库

git commit -m"备注信息" 将暂存区的文件传入版本库

代码回滚

git reset --hard HEAD^^ 回退两个版本

git reset --hard HEAD ~100 回退100个版本

如果想要直接跳转到那个版本的话

git reset --hard + hash hash是指版本号对应的hash值

三、本地->云端

git push 将当前分支推送到云端仓库 但是如果是第一次的话 要写成git push -u

git push origin branchname 将本地的某个分支push到云端,直接指认branchname

git clone 必备技能 将别人公开的仓库里面的文件下载到本地

git checkout -b branchname 有两个作用一个是创建branchname 一个是在create的同时checkout到这个分支

git checkout branchname 切换分支

git branch 查看各个分支的信息

git branch branchname 创建新分支

git branch -d branchname 删除本地分支

git merge branchname 将这个分支合并到当前分支

git push -d origin branchname 在远程仓库删除分支

git pull 从云端仓库的当前分支拉取下来并合并到本地的当前分支

git pull origin branchname 从远端仓库的拉取branchname这条分支并与本地的当前分支进行合并

—————————-10.23晚更新————————————-

发现了一个极其有趣的了解git实战的网站

https://learngitbranching.js.org/?locale=zh_CN 可能需要魔法上网(hhh)

花了大概两个小时,通关了。对git多了很多认知,但是有很多不太容易文字记录下来,算了,防止自己忘了在这里就随便记录一些,然后有时间在玩一玩那个网站吧。

git commit 我之前一直以为他是将自己修改后的文件,直接复制粘贴而已,但是其实不是,他储存的其实是上一个版本与这一次commit版本的差异,这是因为git考虑到他的轻量级。

git checkoutgit branch 这个就得好好唠唠。

其实本质上,git checkout操控的是HEAD指针。例如,在游戏中就有一个部分叫做分离HEAD指针,有时候为了更加便捷的操作版本树,我们可以使用git checkout c1 c1指的是某一个提交记录的hash值,可以用git log 来进行查看。此时HEAD与该分支的指针(例如main)分离,因为在一般情况下,HEAD指针往往是指向分支的指针的。

我们再来看看git branch -f main HEAD 这个命令,这是什么意思呢?

翻译过来其实就是,强制将main指针移动到HEAD指针所在的位置,这个不一定是指针,也可以是任意一个提交版本的位置,这个命令就是操控分支指针的命令,当然,也可以用来进行版本的回滚操作。

我们再来看看合并分支操作:

git merge

就是字面意义上的进行合并

例如:当前的分支是main,我想要把bugFix分支合过来,那我的命令就是git merge bugFix

git rebase

举个例子:git rebase main 假定当前的分支是bugFix,我想要将bugFix合并到main。

本质上他是将原bugFix当前所指的版本库copy一份,将其复制到main的下一位,同时main指针往下指,原来的版本依旧保留,但是这样的话会使得代码树更加清爽。(maybe),在保留历史痕迹方面就没有merge保留的清晰。

接下来说一个比较重要的概念

相对引用

git checkout HEAD^ HEAD指针跳转到上一级,之所以叫相对引用,是相对于git checkout c1 这种简单粗暴的移动HEAD指针的方式。

git branch -f main HEAD^ 也是可以的,就是把一个特定版本的hash值换成了一个相对位置而已。

回退版本

git reset

比如说,我想要删除本地的最新版本

git reset HEAD^ 他是相当于把最新的版本隐藏了,就像是没有提交过一样,但是你push到remote的时候,他是不会有变化的

git revert HEAD 他是相当于隐藏了c1,提交了一次c1’,里面存的是c1的修改记录,内容与c0一致。push到remote的时候,remote是有变化的。

整理提交记录

把多人凌乱的提交记录进行整理,可以使得代码树干净整洁一些。

ok,介绍一个我最喜欢也是非常方便的一个指令。

git cherry-pick c1 c2 c3 假定当前的分支是main,就是把全局的c1 c2 c3节点,复制一个副本,然后依次粘贴到main指针下面。同时,main指针进行移动。

与cherry有着差不多功能的一条指令是

可交互的rebase

git rebase -i HEAD~3 这条指令是从你现在的HEAD指针的位置开始,向上移动三个位置,在起始点到倒数第二个点的这些节点中,会出现一个ui,你可以选择其中的一些点,可以进行忽略,排序什么的,然后粘贴到最后一个指向的节点的下面。但是不移动父节点的指针。

git tag 与 git discribe

个人觉得没有什么用

在merge之后,我们知道,假定一种情况

当时的HEAD指针指向main , 同时你想要merge一条bugFix分支,于是你

git merge bugFix ,我们知道这条指令的意思是将bugFix分支merge到main分支。

那么你就会想到如果此时我git checkout HEAD^指向的是哪条分支呢?

实践之后可以知道,就是之前的main分支,因为是将bugFixmerge到main,所以main占主导。

那有些朋友就会问了,如果我想checkout到bugFix怎么办呢?

很简单,git checkout HEDA^2 即可。

下面是local与remote的一些交互操作,有些确实有些蛋疼,没有合作代码的项目经历还真是比较吃亏。

同时还有一点,单纯的列举操作自然没有自己动手实践的理解深,所以看到这的朋友,不妨自己到那个小游戏里面去玩一玩。

不管了,先列举一些我的一些总结,等之后有了git的工作经历在进一步更新吧

其实命令无非就是

git fetch 有两个作用,一是将local与remote相比缺失的记录下载下来,同时改变o/main,也就是origin指针。注意!!!这里是不改变local的main指针的,只是一个下载而已,不改变本地的任何指针。

git pull 可以看做是git fetchgit merge 的结合版,就是在下载之后,将remote分支与local的当前分支合并。

正常我们为了美观一般都git pull --rebase 会使得代码更加简洁一些。

git push pull的反义词,就是将local与remote对比,将local的改进与更新同步到remote,注意!!!当前的分支是什么就push哪一条分支,只push当前的分支。

git clone 将remote仓库,如githubgiteegit lab 的所有文件克隆到本地的仓库,就像是在本地创建了remote的一个副本。

本地分支对远程分支指针的追踪

git checkout -b foo o/main 这句话的意思是在本地创建并切换到foo分支,该分支对origin/main指针进行追踪。

那么什么叫进行追踪呢?就是相当于foo取代了本地的main分支,本地的main分支已经没有用了,他不在可以与远程的main分支进行对应,foo承担了main分支应有的工作。

git push origin main这句话把它进行慢动作的话其实有两个指令:1.找到本地的main分支 2. 将本地的main分支进行push,同时移动o/main指针

git push origin main:foo 冒号前面的是一个位置,表示的是本地的main分支指针所指向的一个位置,后面的是要移动的远程的foo指针,就是将远程的仓库添加从foo到main指针缺少的一段版本,同时将foo指针移动到main的位置

git fetch origin main:foo 原理同上

git pull origin main:foo 原理同上

好,终于更新完了,差不多学会上述的操作就应该差不多了。以后有时间的话,我就再来整理一下。


文章作者: 罗林
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 罗林 !
  目录