来源
- 本文主要是对照y总的教程写的一下小笔记
- 这里找到了一个很好地练习网站
git基本概念及操作
-
配置用户
git
操作之前,我们首先需要对本地的信息初始化
具体有什么用忘记了,只是记得提交的时候好像有个全局用户,局部用户,但是不重要,之后在研究
目前都用全局就okgit config --global user.name zzg git config --global user.email zzg645453374@163.com
- 有时候需要用到单独仓库单独的用户,即局部用户配置
git config user.name TName git config user.email asd@gmail.com
-
初始化之后可以进行查看,
linux
下是用户根目录.gitconfig
文件中
git仓库
初始化仓库
md
用户搞完之后,就需要真正进行git
操作了,首先我们需要有这么一个git
仓库
进入本地的某个文件夹,git init
指令会将该文件夹初始化为一个git
仓库
- 这里有一点需要清楚,
git和github不是一个概念
。真正要用到的其实是git
,而github
作为远程的版本库,而且使用的人比较多,和git
是两个概念 - 此时就要说一下版本库的问题了
git中的区域概念
md
git
中的抽象区域可以分为3部分,分别是工作区,版本库,暂存区
(印象中是4部分,但是y总说3部分,可能是之前记错了?)
-
工作区:进行操作的地方,通俗讲就是你
git init
的那个文件夹就是你的所有操作都会在工作区内,不管是分支如何改变,所有的分支所有的节点都只有一个工作区,并不是每一个节点一个工作区
-
版本库:
commit
之后存放的位置首先本地是具有一个版本库的,你的所有修改,版本更替节点回退等等操作都在版本库中有记录
- 那么此时就需要再次与
github
进行区分
github
会远程存放你的版本库,但是与github
进行交互用的是push和pull
操作,某种意义上将,这两个操作与github
没有关系
这两个操作在git
操作中属于与远程进行交互,而远程的仓库不仅有github
着一个平台,包括国内的gitte
等一种平台,只要是性质相同,都可以进行相同的操作
在此github只是一个个例,一定记住github和git操作是独立的两码事
- 那么此时就需要再次与
-
暂存区:
add
操作之后文件到达的地方在我的理解中,这个
add
操作有点像是copy
一份,因为之后有一个操作叫做git diff
,他会检测本地(工作区)与暂存区(add
之后)同一个文件的改动- 比如我将
readme.txt
add
到了暂存区,然后我对本地文件进行了修改,修改的是工作区的内容,而暂存区是之前提交的,所以add
到暂存区应该是copy
了一个备份
- 比如我将
提交以及版本库相关操作
md
首先介绍一个git status
操作,会显示当前仓库的状态,我感觉显示的就是工作区与暂存区的状态
如果修改之后没有add
,则会显示红色,add之后会显示绿色
如果既有add又有未add
的,好像是上下两种都列出来,但是同一个文件没试过,之后试一下
-
提交版本库commit
git commit -m "modefy readme.txt"
commit
操作会将暂存区的改动提交给版本库,会永远留存(不手动删除版本的话应该是永久)- 这里再提一嘴,到目前为止均与远程
github
无关,区分清楚 - commit 提交之后,该记录就会永远被记录
- 这里再提一嘴,到目前为止均与远程
-
对版本库的一些简单操作
-
git log
会显示版本库从根节点到当前节点(当前版本)的路径,即这条线上的所有版本(从下往上显示)
这里就会有一个HEAD指针的概念,就是所有的版本类似于一棵树状结构,而当前库是那个版本就看HEAD指针指向哪里
但是一般人不做很复杂的项目,对HEAD
指针操作可能比较少,像我就是用github
作为远程同步备份,通常都是一条线走下去,就不怎么用到(从来没用过)HEAD
的回退操作git log
显示的信息比较全,好像有一个git log --pretty=oneline
(最后一个单词记不清了,大概就是这么条指令)会显示的简洁一点,显示的信息一个版本只有一行,但我觉得没啥用
-
git reset --hard HEAD~
(最后有一个~
)简单的版本回退操作,最后的小~可以用^(键盘6)代替,效果相同,有几个代表回退几个版本
比如HEAD^^^,就是回退3个版本 -
git reflog
显示版本库的迭代过程,主要是清楚的列出每个版本都干了啥(
包括版本回退操作也会有
)
配合后续有个回退操作,reflog
指令显示的内容在开头会有一串编号,其实是版本的哈希值的前几位(7位好像) -
git reset --hard b552acd
将版本回退到某个时期,编号就是
reflog
显示的编号
-
-
HEAD指针
简单来说HEAD指针通常指向最近一次提交记录的节点,即当前在其基础上工作的提交记录
-
通常来说
HEAD
指向的是Branch
,也就是分支随着每次commit
而不断更新版本库,但是这种更新都是会永久留存的
比如我们有时候想对版本进行修改,但是不希望提交,比如Debug
加断点输出,就可以分离HEAD
-
git checkout 58df8b3
将
HEAD
指针指向58df8b3
所代表的记录,此时HEAD
处于头指针分离的状态,在此基础上的commit
等修改不会直接写入版本库
编号有git log
获得(哈希值的前7位) -
git checkout -b NewBranch
如果想保存分离状态下的修改,只需要在此处新建一个分支即可,那么修改就会写入到版本库
git branch NewBranch
&&git switch NewBranch
||git checkout NewBranch
效果相同
-
git checkout main^
切换
HEAD
指针到main^
【main^
相当于main
的父节点,几个^
就是几层父节点】
这种方法比直接输入哈希值方便- 这样会直接进入
HEAD
分离状态 - 有时候会回退很多次,比如7次,就要
^^^^^^^
,为了方便,可以git checkout main~7
- 这样会直接进入
-
git branch -f main HEAD~3
强制将
main
移动到HEAD
的三级父亲
HEAD~3
也可以换成哈希值- 注意,此时
HEAD
不一定需要指向该分支,这个指令是全局操作的
- 注意,此时
-
回退操作
-
git revert HEAD~
将当前分支的撤销操作作为一次修改,生成一次新的提交
-
git reset HEAD~1
将当前分支回退
-
这里要注意一下两个参数的意思,是
Destination
的意思-
git reset main^^
把当前分支(比如asd
)移动到main
的两级父节点 -
git revert bugFix^^^
把bugFix
三级父节点的那次提交撤销掉,并把该操作作为新提交(
revert
的可能有点绕,我们假设在a
位置新建了a.txt
,然后经过乱七八糟的操作到达了b
节点,此时git revert a
,就会在b
的位置commit
一下,commit
的内容就是回退a
操作,也就是回到了新建a.txt
之前的状态)
-
-
-
git分支
分支概念
-
分支相当于不同的前进方向
比如我在当前位置,在某一个时刻新建了
new_branch
然后在main
中提交了几次之后,想要在new_branch
的位置进行另一个方向的开发,就可以切换到该分支,然后继续commmit
新分支commit
之后,与main
的分支属于两条不同的分支,类似于树状结构,两条分支都可以永久保存
分支操作
-
git branch branch_name
在当前位置新建
Branch
- 注意,新建的
branch
不会直接出去一块,而是在原位置,相当于在该位置多了一个可以操作的指针,这个概念在HEAD头指针分离很重要
- 注意,新建的
-
git switch branch_name
切换到
branch_name
的branch
git checkout branch_name
也可以,相同的效果,不过checkout
属于旧指令,一般都可以用
在 Git 2.23 版本中,引入了一个名为 git switch 的新命令,最终会取代 git checkout,因为 checkout 作为单个命令有点超载(它承载了很多独立的功能)。
-
git merge branch_name
【没看懂,不知道干啥的】假设当前有两个伸出来的分支,
branch_name
和main
,当前位置在main
,想将branch_name
合并到main
上,使用该指令- 注意,后面跟的参数是被合并的分支,合并到当前位置的分支
- 合并操作是将两个分支的修改合并,如果冲突我也不知道会咋样、、、没实际用过这个指令
- 合并后还会有个
git merge main
的操作,不知道干啥的
-
git rebase main
【也没看懂是干啥的,两个合并操作都没看懂】- 注意,后面跟的参数是合并到,也就是当前分支合并到后面参数所代表的分支位置
远程
md
远程操作其实很多,但是普通常用的也就push
、pull
、clone
,就光介绍一下这几个吧
-
在
git
的概念里远程其实不等于在github
上,远程只是独立于当前位置的一个概念【自己的理解,读不懂可以跳过,我自己也不知道理解的对不对】
【其实我也没看懂远程是个啥】
远程之前的操作
git config --global user.name "NCpaste"
git config --global user.name NCpaste.zg@gmail.com
远程交互操作
【Git&Github】
【心得】
git clone https://github.com/NCpaste/Tese
- 载入远程仓库到本地
git push
git pull
git fetch origin master
git merge origin/master
git remote
远程仓库操作git remote -v