关于学习git时的一些疑惑与笔记
- SSH相关问题
- SSH是什么?
- SSH有什么作用?
- 如何在github配置SSH?
- 分支
- 什么是本地分支,远程分支?
- main主分支与master主支?
- 为什么要把master分支修改为main分支?
- 什么时候用分支?
- git与github的使用
- 第一次创建仓库,并往仓库里面上传文件的命令行是什么?
- 第二次及以后想往仓库里面上传文件的命令行是什么?
- 从别的仓库切换过来,并且上传文件的命令行是什么?
- git相关问题
- origin是什么?
- git是什么?
- 什么是“版本控制”?
- Git又为什么被冠以“分布式”的名头呢?
- git解决了哪些问题?
- git 的实现原理?
- git常用命令:
- 更改查看自己的用户名、邮箱:
- 对仓库进行初始化:
- 切换分支:
- 查看缓存状态:
- 将文件添加到缓存区:
- 将文件添加到本地仓库commit:
- 查看提交日志:
- 让git来忽略不需要提交的文件:
- 创建、查看、移动到、删除、合并分支:
- 将github上的文件clone到本地:
- 查看当前链接的远程git仓库的名字:
- 将本地仓库push到远程仓库:
- 疑惑:
SSH相关问题
SSH是什么?
SSH(Secure Shell,安全外壳)是一种网络安全协议。
SSH有什么作用?
通过加密和认证机制实现安全的访问和文件传输等业务。
如何在github配置SSH?
1.检查SSH keys是否存在
(https://www.jianshu.com/p/259773014e03)
2.生成新的ssh key
3.将ssh key添加到GitHub中
更详细的配置:
[如何在github配置SSH详细指南]
分支
什么是本地分支,远程分支?
本地分支对应的是本地仓库,远程分支对应的是远程仓库。
远程仓库指的是在github、gitee这些网站上的仓库,所有人都以远程仓库的文件作为最新版本。
本地的分支在本地的电脑的一个文件夹里,也就是每个人自己的工作区,每次clone,都是把最新版本的文件clone到这个git文件夹里。
这样,在自己的电脑上操作,就不会影响到远程仓库,而且每个人都可以负责不同的模块。
main主分支与master主支?
2020年10月1日后,Github会将所有新建的仓库的默认分支从master修改为main(由于),这就导致了一些旧仓库主分支是master,新仓库主分支是main的问题,分支名字不一样,main和master分支就不一样,尽管想表达的都是主分支的意思。
为什么要把master分支修改为main分支?
自2020年六月起,由于“Black Lives Matter”抗议活动持续发酵,而计算机行业中对master与slave这两个词的使用引起了部分人的反感。
在抗议声起、社会动荡加剧之时,更多的人认为这些包含历史文化因素的词汇已经过时,且应当被替换,于是多个开源项目开始采取行动替换冒犯性的术语,其中包括 PHPUnit 和 Curl、OpenZFS 等。
不仅仅是master与slave,还有许多相关的词汇如whitelist与blacklist都被计划更改为allowList与denyList。
正如 ZDNet 所说,继续使用这些带有种族色彩的词汇可能会延长种族歧视。一些学者在 2018 年的期刊上写道,“这些术语不仅反映了种族主义文化,而且还强化、合法化和延续了它。”
而 LinkedIn 的软件工程师 Gabriel Csapo 也在 Twitter 上表示,他也正在提出更新 Microsoft 内部库的请求,并删除任何带有种族歧视色彩的短语。
什么时候用分支?
假设我们要给当前主分支上的项目新增文件与功能,但是还不能确定是否需要,我们就可以在主分支的基础上创建一个新的分支,等待新分支文件一切都处理准备好了,再合并过来
git与github的使用
第一次创建仓库,并往仓库里面上传文件的命令行是什么?
这是在github上创建一个新的仓库,提供的引导代码,里面说明了第一次创建仓库,并往仓库里面上传文件的命令是什么。
需要注意的是:git remote add origin <SSH>
这个链接各人不相同,改成自己的。
如何改SSH链接呢?
点击SSH,复制后面的链接
第二次及以后想往仓库里面上传文件的命令行是什么?
就git push
,不用在加-u origin main
了
从别的仓库切换过来,并且上传文件的命令行是什么?
1.首先git init
2.链接仓库git remote add origin <SSH>
3.创建新文件之后,输入git add .
4.git commit -m "名字"
5.git push -u origin main
git相关问题
origin是什么?
origin代表的是远程仓库的名字,本来远程仓库的链接很长一串,给它取个origin名字,每次上传的时候就不用敲很长一串的仓库链接了,只需要敲origin就可以代表仓库链接,进行上传
git是什么?
Git是一种分布式版本控制系统。
什么是“版本控制”?
版本控制这个说法多少有一点抽象。事实上,版本控制这件事儿我们一直在做,只是平时不这么称呼。举一个栗子,boss让你写一个策划案,你先完成了一稿,之后又有了一些新的想法,但是并不确定新的想法是否能得到boss的认可,于是你保存了一个初稿,之后在初稿的基础上另存了一个文件,做了部分修改完成了一个修改稿。OK,这时你的策划案就有了两个版本——初稿和修改稿。如果boss对修改稿不满意,你可以很轻易的把初稿拿出来交差。
在这个简单的过程中,你已经执行了一个简单的版本控制操作——把文档保存为初稿和修改稿的过程就是版本控制。
Git又为什么被冠以“分布式”的名头呢?
这里的“分布式”是相对于“集中式”来说的。把数据集中保存在服务器节点,所有的客户节点都从服务节点获取数据的版本控制系统叫做集中式版本控制系统,比如svn就是典型的集中式版本控制系统。中心版本仓库必须始终可用。如果中心仓库挂掉了,那么整个版本管理过程也将停止,程序员节点间无法进行协作,这就像集线器(hub)挂掉后,所有连接到hub上的主机节点间的网络也就断开无法相互通信一样。
与之相对,Git的数据不止保存在服务器上,同时也完整的保存在本地计算机上,所以我们称Git为分布式版本控制系统。
Git的这种特性带来许多便利,比如你可以在完全离线的情况下使用Git,随时随地提交项目更新,而且你不必为单点故障过分担心,即使服务器宕机或数据损毁,也可以用任何一个节点上的数据恢复项目,因为每一个开发节点都保存着完整的项目文件镜像。
git号称分布式版本管理系统,本质上是没有像subversion中那个所谓的“中心仓库”的。每个程序员都拥有一个本地git仓库,而不仅仅是一份代码拷贝,这个仓库就是一个独立的版本管理节点,它拥有程序员进行代码生产、版本管理、与其他程序员协作的全部信息。即便在一台没有网络连接的机器上,程序员也能利用该仓库完成代码生产和版本管理工作。在网络ready的情况下,任意两个git仓库之间可以进行点对点的协作,这种协作无需中间协调者(中心仓库)参与。
git解决了哪些问题?
我们可以为每一次变更提交版本更新并且备注更新的内容;
我们可以在项目的各个历史版本之间自如切换;
我们可以一目了然的比较出两个版本之间的差异;
我们可以从当前的修改中撤销一些操作;
我们可以自如的创建分支、合并分支;
我们可以和多人协作开发;
我们可以采取自由多样的开发模式。
Git解决了版本控制方面的很多问题,但最核心的是它很好的解决了版本状态存储(即文件变更过程存储)的问题。
git 的实现原理?
我们说到,Git很好的解决了版本状态记录的问题,在此基础上实现了版本切换、差异比较、分支管理、分布式协作等等炫酷功能。那么,这一节我们就先从最根本的讲起,看看Git是如何解决版本状态记录(即文件变更过程记录)问题的。
我们都有版本记录的经验,比如在文档撰写的关键点上保留一个备份,或在需要对文件进行修改的时候“另存”一次。这都是很好的习惯,也是版本状态记录的一种常用方式。事实上,Git采取了差不多的方式。
在我们向Git系统提交一个版本的时候,Git会把这个版本完整保存下来。这是不是和“另存”有异曲同工之妙呢?不同之处在于存储方式,在Git系统中一旦一个版本被提交,那么它就会被保存在“Git数据库”中。
看看git仓库内容的指令:ls
不显示开头是.的文件,只显示文件夹和开头不是.的文件
我们通过find .git命令查看新生成的空git仓库的结构,会发现其中有一个objects文件夹,这就是git数据库的存储位置。
git的基本流程是什么?
举个例子:
在我的家族祠堂里,存放着一本《菊花宝典》,家庭的每个成员,都会复制一本放在自己房间里,偷偷练习,这个复制成为clone,家族里,以祠堂里面的正本为准,其他的都是副本,有一天,我想到一个新的招式(新的功能),于是就把新的招式加入add到《菊花宝典》副本里,等新招式(新功能)彻底完成以后,就取个名字commit -m "名字"加入到副本里,为了让家族里的每个成员都学会这招式,于是我就把自己的副本拿到祠堂里进行对比,把新增的招式添加Push到正本里,在我更新《菊花宝典》以后,其他成员就可以用最新的《菊花宝典》来代替Pull自己的副本。
以上就是git的初步概念。
如果文件还在工作区里,那么文件就是Untracked状态,也可以称为Unstage。
已追踪称为stage
注意:Pull会直接更新到工作区,把手头上的东西都更新掉了,新文件覆盖旧文件,没有提醒地直接覆盖掉
所以我们可以先用fetch更新到本地版本库,再用diff对比区别,没问题再合并过来
git常用命令:
更改查看自己的用户名、邮箱:
1.git config --global user.name <用户名>
(1)、git config --global user.name <用户名>
作用:更改自己的用户名。
用户名有什么用?
就像网名,在commit提交的时候,团队伙伴能够看到是谁提交的,这个用户名和git登录没有什么关系。
例如:
git config --global user.name Xiaofei Li
意义:更改用户名为Xiaofei Li
(2)、git config --global user.name
作用:查看自己的用户名
(3)、git config --global user.email <邮箱>
作用:更改自己的邮箱
邮箱在git有什么意义?
方便团队成员联系你,如果代码有问题的话,可以在git里面看到你的邮箱
(4)、git config --global user.email
作用:查看自己的邮箱
对仓库进行初始化:
2.git init
作用:对仓库进行初始化,如果当前文件目录里面没有.git文件夹,那么就创建一个git文件夹,如果当前文件夹下面已经有git文件夹,那么就初始化里面内容。
切换分支:
3.git branch -M main
作用:初始化git之后,会默认显示master,由于前面讲过,master在2020年之后换成了main,所以自己要有意识地把master分支切换成main分支,如果git分支和仓库分支不对,上传文件会失败
查看缓存状态:
4.git status
作用:查看哪些文件夹在add缓存区,哪些是修改的新的,没加入add缓存区,红色就是Untrack未追踪文件,绿色就是stage追踪文件
将文件添加到缓存区:
5.git add .
(1)、git add .
作用:这个.代表全部的意思,是将当前文件夹里面所有Untrack文件夹添加到缓存区,变成stage追踪的文件
(2)、git add <文件名>
作用:单独将某个文件添加到缓存区
将文件添加到本地仓库commit:
6.git commit -m “评论”
(1)、git commit -m “评论”
作用:将缓存区的所有内容写个评论,上传到本地仓库中,这个评论一般是“完成了xx功能”
(2)、git commit -a -m “名字”
作用:add与commit一行命令完成两个操作,让更新的文件从工作区一下跳到本地版本库
(3)、git commit -am “名字”
作用:-a和-m其实是可以合在一起写的,add与commit一行命令完成两个操作,让更新的文件从工作区一下跳到本地版本库
查看提交日志:
7.git log
作用:查看前面提交过的所有版本、上传人的名字、邮箱、日期、评论等(谁瞎写代码,就能找到!)
进入log之后退出:轻轻按下q
让git来忽略不需要提交的文件:
8.touch .gitignore
作用:用touch创建.gitignore文件,在实际开放中,肯定会遇到不需要提交的文件,我们就需要让git来忽略这些文件,在.gitignore文件里面添加需要忽略的文件的的名字和后缀,就表示我们要忽略的文件,添加完成之后,即使这个要忽略的文件是Untrack状态也不会出现在git status里面了
创建、查看、移动到、删除、合并分支:
9.git branch <分支名>
(1)、git branch <分支名>
例如: git branch bad-girl
创建一个叫坏女孩的分支
作用:假设我们要给当前主分支上的项目新增文件与功能,但是还不能确定是否需要,我们就可以在主分支的基础上创建一个新的分支,等待新分支文件一切都处理准备好了,再合并过来,但是这个命令并不能立刻让我们移动到这个创建的新分支上
(2)、git branch
作用:查看分支,按q退出
(3)、git checkout bad-girl
作用:切换到bad-girl分支,而且文件夹里的文件是直接从master主支那里复制过来的
(4)、git branch -d <分支名称>
作用:对分支进行删除,但是这里会有一个提示,因为分支没有完全合并,问是否确定要删除,如果确定的话-d用-D
(5)、git branch -D <分支名称>
作用:对分支进行删除,很肯定,这次没有提示
(6)、git checkout -b temp
作用:创建一个新分支,并且立刻切换到新分支里面来,这行代码的意思是:创建一个名字叫temp的新分支,并且-b立刻切换到这个新分支上来
(7)、git merge temp
作用:把别的分支合并到当前所处的分支上,这里指的是,把temp分支上的内容合并到main分支上
Download ZIP方式与Clone方式有什么区别?
如果我们直接选择Download,就只会下载当前最新版本文件,而其中的历史版本和记录不会下载,也就是ZIP文件里面.git文件夹
将github上的文件clone到本地:
9.git clone <SSH链接>
作用:将github上的文件clone到本地
查看当前链接的远程git仓库的名字:
10.git remote -v
作用:查看当前链接的远程git仓库的名字,以后仓库多了,防止把文件传错仓库,每次换文件夹传文件之前查看一下是不是自己要传的仓库,origin代表的是远程仓库的名字,本来远程仓库的链接很长一串,给它取个origin名字,每次上传的时候就不用敲很长一串的仓库链接了,只需要敲origin就可以代表仓库链接,进行上传
将本地仓库push到远程仓库:
10.git push -u origin <分支名字,一般为main>
作用:如果是第一次push 就要写-u origin <分支名字>,如果是第二次及以后,只需要写git push,这是把本地仓库的文件上传到github远程仓库
疑惑:
HEAD->master又是什么?
我也不懂,好像版本回退的时候用的多,挖个坑,什么时候看懂了再回来讲