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 checkout 与git 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 fetch 与git merge 的结合版,就是在下载之后,将remote分支与local的当前分支合并。
正常我们为了美观一般都git pull --rebase 会使得代码更加简洁一些。
git push pull的反义词,就是将local与remote对比,将local的改进与更新同步到remote,注意!!!当前的分支是什么就push哪一条分支,只push当前的分支。
git clone 将remote仓库,如github 、gitee、git 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 原理同上
好,终于更新完了,差不多学会上述的操作就应该差不多了。以后有时间的话,我就再来整理一下。