Git阶段学习总结
Git的入门学习
(这篇博客本来是昨天发布的,但由于博客园网站默认不显示文章到主页,所以今天重新发布该博客,还望海涵)
由于本次实验需要使用Git的分支操作,在学习分支的过程中,萌生出对目前Git的所学所思做一个梳理,以便后续复习查阅。(该知识梳理为课堂PPT的内容与Git入门实践课程的结合,如有错误,还请批评指正。)
Git简介
Git原理
Git将每个文件的每个版本作为一个副本进行保存,允许多个commit共享一个文件副本(进而节省存储新版本的空间)。因此,Git中每个版本均以副本形式存储,创建分支的速度与版本历史复杂程度无关。
相比之下,传统版本控制工具通过存储版本之间的改变以存储版本,创建分支的速度与版本历史复杂程度有关。Git存储发生变化的文件(而非代码行), 不变化的文件不重复存储。
Git安装
在终端中使用git version命令可以查看所安装的Git版本。
添加SSH关联
在 2021 年 8 月 GitHub 更新后,已经不再允许使用账户密码操作 GitHub,必须使用 SSH 密钥登陆。所以我们可以在系统中创建 SSH 公私钥,并将公钥放到 GitHub 指定位置。如此操作即可生成 GitHub 账户对于当前系统中的 Git 授权。
在终端执行ssh-keygen
按几次回车生成公私钥,公私钥存放在主目录下的隐藏目录 .ssh
中的两个文件:id_rsa.pub和id_rsa中。(Window中存储在当前用户的.ssh文件夹中)
打开id_rsa.pub文件,将其中的公钥内容复制出来。然后在GitHub网页上添加公钥:Title 自定义,把内容粘贴到 Key 中,点击绿色按钮添加 SSH Key 即可。
使用SSH的好处:
- 免密码推送,执行
git push
时不再需要输入用户名和密码了;- 提高数据传输速度。
配置Git
使用下面这两个命令来进行一些本地配置
user.email
:写入你自己注册 GitHub 账号的邮箱user.name
:你自己的 GitHub 账号名字
设置成功后,可以使用git config -l
可以查看配置信息。
完成后系统自动生成 Git 的配置文件,就是主目录中的隐藏文件.gitconfig
此配置文件也可以手动修改
克隆GitHub上的仓库到本地
git clone
跳转到想要复制的仓库,点击Clone or download 选择使用SSH,复制SSH连接,使用 git clone + [仓库地址]
命令即可。
克隆以后,进入本地仓库主目录,主目录中有个.git隐藏目录,它里面包含了仓库的全部信息,删掉这个目录,仓库就变成普通的目录了。使用Git Bash打开此目录,可以看到命令行前缀有一个(master),这是我们当前所在的分支名。
当我们 在GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 master。GitHub 可以看成是免费的 Git 服务器,在 GitHub 上创建仓库,会自动生成一个仓库地址,主机就是指代这个仓库,主机名就等于这个仓库地址。
克隆一个 GitHub 仓库(也叫远程仓库)到本地,本地仓库则会自动关联到这个远程仓库,执行
git remote -v
命令可以查看本地仓库所关联的远程仓库信息
Git 要求对本地仓库关联的每个远程主机都必须指定一个主机名(默认为 origin),用于本地仓库识别自己关联的主机,
git remote
命令就用于管理本地仓库所关联的主机,一个本地仓库可以关联任意多个主机(即远程仓库)。克隆远程仓库到本地时,还可以使用
-o
选项修改主机名,在地址后面加上一个字段作为本地仓库的主目录名
git init
git init
命令用于将当前目录变成一个本地仓库,但是由于GitHub的存在,我们很少用到此命令。
Git基础操作
Git仓库的三大区域
Git 本地仓库有三大区域:工作区、暂存区、版本区。
各个工作区域
- 工作区(workspace):可直接编辑,相当于工作副本。
- 暂存区(staging):记录工作区中被修改过且修改被添加到暂存区的文件。
- (版本区)本地仓库:即位于本地的版本仓库。
- 远程仓库:即位于远程的版本仓库。
基本命令介绍
git status
通过Git Bash打开仓库主目录,执行git status
来查看整个仓库的状态
创建文件进行修改,再次执行此命令可以看到命令行前缀又发生了一些微小的变化,红色 master 后面出现了 *
星号,这表示工作区或暂存区有变化,对文件进行增删改操作都会出现这个星号。
git add
使用 git add [文件名]
命令跟踪此新建文件,即把新增文件添加到暂存区。(其中 git add .
命令可以将全部文件添加到暂存区,如果对多个文件或目录进行了增删改)
git reset
git add
命令是将这些修改添加到暂存区,暂存区记录的只是修改。如果要撤销暂存区的修改执行 git reset -- [文件名]
或者 git rm --cached [文件名]
命令即可:(如果省略最后的文件名,则把暂存区的全部修改撤销)
git diff
git diff
,它可以用来查看工作区被跟踪的文件的修改详情。执行此命令会跳转到新的页面,即工作区修改详情页,按 Q
退出此页面:
使用 git diff --cached
查看暂存区的全部修改。此命令也会跳到新的页面,即暂存区修改详情页。
git commit
接下来,将执行 git commit
命令把暂存区的修改提交到版本区,生成一个新的版本。其有一个必须的选项-m
用来提供该提交的备注:
提交后,暂存区的修改被清空,执行 git log
查看提交记录,紫色框中的十六进制序列号就是提交版本号,这是很重要的信息,每个提交都有自己单独的版本号,就像公民身份证号一样。
上面的提交信息,提交版本是按倒叙排列的,即最近的提交排在最上面,可以使用 git log --reverse
命令查看时间正序排列的信息。
git commit -a
命令可以将未添加到暂存区的修改,也就是工作区的修改也一并提交,但会略过未被跟踪的文件。但此方法并不提倡,谨慎的做法是按照刚才的顺序,修改工作区 - 提交到暂存区 - 随时使用git status
查看仓库状态 - 将暂存区的修改提交到版本区生成一次新的提交。
git log
命令 git log
,它用来查看版本区的提交历史记录,此命令也会跳到新页面
关于查看提交历史记录的命令,有些常用的选项介绍一下:
git log [分支名]
查看某分支的提交历史,不写分支名查看当前所在分支git log --oneline
一行显示提交历史git log -n
其中 n 是数字,查看最近 n 个提交git log --author [贡献者名字]
查看指定贡献者的提交记录git log --graph
图示法显示提交历史
git branch -avv
git branch -avv
,它用来查看全部分支信息
上图有三行信息,依次说明:
第一行,开头的星号表示当前所在分支,绿色的 master 是分支名,之所以是绿色,也是因为它是当前所在分支。后面第二项是版本号,第三项中括号里面蓝色的字,表示此分支跟踪的远程分支的名字,这也是克隆远程仓库到本地时的默认设置 -- 创建 master 分支并自动跟踪远程同名分支;冒号后面黑色文字表示本地分支领先其跟踪的远程分支一个提交。最后一项是提交时填写的备注信息。
第二行,是 Git 指针信息,它指向远程仓库的 master 分支。
第三行,远程分支信息。
git push
最后一个环节,将本地新增的提交推送到 GitHub 远程仓库中,命令是 git push
,后面不需要任何选项和参数,此命令会把本地仓库 master 分支上的新增提交推送到远程仓库的同名分支上,因为当前所在的分支就是 master。
版本回退
如果发现提交的文件有误,可以修改此文件然后再次添加到暂存区、提交、推送,也可以撤销最近一次提交,修改文件后重新提交推送。后一种方法如下所示:
首先执行 git reset --soft HEAD^
撤销最近的一次提交,将修改还原到暂存区。--soft
表示软退回,对应的还有 --hard
硬退回。HEAD^
表示撤销一次提交,HEAD^^
表示撤销两次提交,撤销 n 次可以简写为 HEAD~n
。软退回一个提交后执行 git branch -avv
命令查看分支信息:
可以看到本地仓库的 master 分支的版本号已经发生了变化,变成了前一次提交的版本号,中括号里也有提示信息,本地分支 master 落后其跟踪的远程分支 origin/master 一个提交。
执行 git status
查看仓库状态,上一个提交中的修改全部扔回了暂存区:
重写修改后,执行 git add .
命令将新的修改添加到暂存区,然后执行 git commit
命令生成新的提交。但是此时再执行 git status
和 git branch -avv
查看仓库状态和分支状态:
可以看到本地仓库的master分支与远程仓库的origin/master分支再提交版本上有了冲突,又叫提交时间线分叉。因为刚才的提交不是基于远程仓库origin/master分支的最新提交版本,而是撤回了一个版本。这种情况下要将本地master分支推送到远程仓库需要加一个选项 -f
,它是 --force
的简写,这就是强制推送:
执行 git branch -avv
看一下分支信息,本地 master 与远程 master 的版本号一致,前四位都是 e290(通常看两个版本号是否一致,只需比对前四位)
本地仓库commit变化记录
如果此时发现刚才撤销前的提交是正确的,即刚才的版本回退操作都是误操作。这是可以使用 git reflog
命令,它会记录本地仓库所有分支的每一次版本变化。
reflog
记录只存在于本地仓库中,本地仓库删除后,记录消失。执行此命令如下图所示:
如果想回退到5c04那个版本(撤销之前的提交版本),可以直接执行命令 git reset --hard [版本号]
。也可以执行 git reset --hard HEAD@{2}
命令,其中 HEAD@{2}
就是上图第 3 行第 2 列所示,这个命令的意思是回到当前分支最近两次提交版本变化前。
Git分支操作
Git命令别名设置
Git中的一些命令的重复度极高,比如 git status
和 git branch -avv
等,Git 可以对这些命令设置别名,以便简化对它们的使用,设置别名的命令是 git config --global alias.[别名] [原命令]
,如果原命令中有选项,需要加引号。别名是自定义的,可以随意命名,设置后,原命令和别名具有同等作用。(该设置是对Git的本地配置,无需多次配置)
自己设置的别名要记住,也可以使用 git config -l
命令查看配置文件。
git fetch刷新本地分支信息
git fetch
,它的作用是将远程仓库的分支信息拉取到本地仓库,注意,仅仅是更新了本地的远程分支信息。
举例说明,首先在GitHub页面上对文件进行修改并增加一次提交。
在本地主目录执行 git fetch
命令,然后执行 git branch -avv
查看分支信息:
可以看到,本地分支 master 的版本号无变化,而远程分支已经更新。所以,fetch
命令的作用是刷新保存在本地仓库的远程分支信息,此命令需要联网。
如果想要让本地master分支的提交版本变为最新版,可以执行 git pull
命令来拉取远程分支到本地,pull
是拉取远程仓库的数据到本地,需要联网,而由于前面执行过 git fetch
命令,所以也可以执行 git rebase origin/master
命令来实现 “使本地 master 分支基于远程仓库的 master 分支”。
Git分支操作
创建新的本地分支
应用场景:一个项目上线了1.0版本,研发部门需要开发1.1和1.2两个测试版,增加不同的新功能,测试版的代码不能再正式版所在的分支上,此时需要新的分支来存放不同版次的代码。
执行 git branch [分支名]
可以创建新的分支,此命令创建新分支后并未切换到新分支,还是在 master 分支上,执行 git checkout [分支名]
切换分支,checkout
也是常用命令,先给它设置别名,然后切换分支。
另一个常用的命令 git checkout -b [分支名]
创建分支并切换到新分支。
新建的本地分支信息,它们的版本号与主分支 master 一致,这是因为在哪个分支上创建新分支,新分支的提交记录就与哪个分支一致。新建分支并无跟踪任何远程分支,所以没有 master 分支中的中括号和括号内的蓝色远程分支名。
将新分支中的提交推送至远程仓库
在当前分支上开发一个新的功能,增加一个文件,生成一个新的提交到本地仓库。推送的正常逻辑是推送到远程仓库的同名分支。
执行 git push [主机名] [本地分支名]:[远程分支名]
即可将本地分支推送到远程仓库的分支中,通常冒号前后的分支名是相同的,如果是相同的,可以省略 :[远程分支名]
,如果远程分支不存在,会自动创建。
上图命令可以简写为 git push origin dev1
。
本地分支跟踪远程分支
当我们再次在 dev1 分支上修改并提交,推送到远程仓库时还是要输入上面的那个长长的命令。而使得本地分支跟踪远程分支后,就可以和master分支一样,直接使用git push命令推送了。
执行这个命令 git branch -u [主机名/远程分支名] [本地分支名]
将本地分支与远程分支关联,或者说使本地分支跟踪远程分支。如果是设置当前所在分支跟踪远程分支,最后一个参数本地分支名可以省略不写(注意,第一个参数是远程分支名,第二个参数才是本地分支名,与push相反)
这个命令的 -u
选项是 --set-upstream
的缩写。执行 git branch --unset-upstream [分支名]
即可撤销该分支对远程分支的跟踪,如果撤销当前所在的分支的跟踪,分支名可以省略不写。
Tips:在推送的时候,加个
--set-upstream
或其简写-u
选项可以在推送时就自动跟踪远程分支。
删除远程分支
删除远程分支,使用 git push [主机名] :[远程分支名]
,如果一次性删除多个,可以这样:git push [主机名] :[远程分支名] :[远程分支名] :[远程分支名]
。此命令的原理是将空分支推送到远程分支,结果自然就是远程分支被删除。另一个删除远程分支的命令:git push [主机名] --delete [远程分支名]
。删除远程分支的命令可以在任意本地分支中执行。
本地分支的更名与删除
使用 git branch -D [分支名]
删除本地分支,同样地,此命令也可以一次删除多个,将需要删除的分支名罗列在命令后面即可。在此之前,先介绍一个极少用到的命令:给本地分支改名 git branch -m [原分支名] [新分支名]
,若修改当前所在分支的名字,原分支名可以省略不写。
注意:当前所在的分支不能被删除
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!