第一章 Git基础
目标
- 了解Git基本概念和常用命令的作用
- 能够使用Git命令来提交和管理项目代码
推荐:猴子都能懂的git入门教程
Learning git branching
扩展阅读
第一章 Git基础
第二章 GitHub基础
第三章 Git进阶
第四章 GitHub进阶
一、基本概念
1.1 什么是Git
免费的、开源的、分布式版本控制系统,管理项目和代码。快速高效地处理从小型到大型的各种项目。
易于学习,占地面积小,性能极快。
1.2 分布式版本控制工具 VS 集中式版本控制工具
- 集中式版本控制工具
- 集中式:CVS、SVN、VSS
- 单点故障:中央服务器宕机,无法提供更新
- 分布式版本控制工具
客户端提取的不是最新版本的文件快照,而是把代码仓库完整的镜像下来。任何一处文件损坏,其他客户端都有备份。每个客户端对于代码的拉取,都是一次拷贝。
-
断网也可以开发(版本控制在本地也是可以进行的)
-
保留完整的项目(包含历史记录)
-
待阅读
1.3 什么是版本控制?
记录文件内容变化,以便将来查阅特定版本修订情况(版本有哪些变更)的系统。记录文件修改的历史记录,让用户能够查看历史版本,方便版本切换。
- 为什么需要版本控制?
个人开发过渡到团队协作。
- Git简史
1.4 什么是GitHub
Git和GitHub的作用、联系和区别
1.5 Git工作机制
-
工作区
代码存放磁盘的位置
-
暂存区
工作区的代码添加到暂存区,让Git追踪到 -
本地库
提交本地库
生成历史版本 -
远程库
形成历史版本后,可以推送远程库
1.6 Git和代码托管中心
基于网络服务器的远程代码仓库,一般来说,简称远程库
-
局域网
公司自己搭建的服务器,上面部署的GitLab
-
互联网
- GitHub
- Gitee
1.7 Head
Git HEAD是一个指针,它指向当前版本库中最新的提交。HEAD指的就是 .git/HEAD 文件,它存储着当前working directory所处的某次commit,打开文件内容为。
举个例子,假设你正在编写一本书,你可以将Git HEAD比喻为一个指针,它指向当前版本库中最新的提交,也就是你最近写的那一页。当你想要查看你最近写的内容时,你可以使用Git HEAD来查看最新的提交。
1.8 分支
分支是Git中一个重要的概念,它可以帮助开发者以不同的方式来进行开发,而不会影响主分支的开发。可以把分支比喻成一棵树,主分支就是树干,而其他分支就是树枝。每一个分支都有自己独立的开发空间,可以在自己的分支上进行开发,而不会影响到其他分支的开发。
例如,当一个项目需要添加一个新功能时,可以先在自己的分支上进行开发,确保新功能的完成后,再将其合并到主分支上。这样,就可以保证主分支的开发不受新功能的影响。
1.9 Git文件状态
在Git中,文件状态是指文件在版本控制系统中的状态。它可以是已暂存、已提交或已忽略的状态。本文将详细介绍Git中文件状态的三种状态:已暂存、已提交和已忽略。
已暂存:当文件被添加到暂存区时,它的状态就变成了“已暂存”。暂存区是一个临时存储区,用于存储文件的更改,以便在提交之前可以检查这些更改。
已提交:当文件从暂存区提交到本地仓库时,它的状态就变成了“已提交”。提交意味着文件的更改已经被永久保存到本地仓库中,并且可以被其他开发人员检索和使用。
已忽略:当文件被添加到.gitignore文件中时,它的状态就变成了“已忽略”。.gitignore文件用于指定Git忽略某些文件,这些文件不会被添加到暂存区,也不会被提交到本地仓库中。
1.10 版本
Git是一个分布式版本控制系统,它的核心思想是将文件的每一次修改都记录下来,以便以后查看。它把每一次修改都称为一个版本,每一次修改都会生成一个新的版本,并且每一个版本都有一个唯一的标识符,称为版本号。
Git可以让你轻松地回到以前的版本,从而让你轻松地比较不同版本之间的差异,以及恢复以前的版本。Git还可以让你在不同的分支上进行开发,从而让你可以在不同的分支上进行并行开发,从而更加有效地开发。
二、Git的安装
2.1 告知你Git是遵守GPL的
直接点击Next
- GNU General Public License(GPL)是一种自由软件许可证,由自由软件基金会(Free Software Foundation)发布。它允许使用者自由地使用、复制、修改和分发许可证下的软件,但同时也要求使用者在发布修改后的软件时,也必须遵守GPL许可证的条款。GPL许可证的目的是保护软件的自由,防止软件被限制使用或修改。
2.2 选择要安装的组件
推荐不用创建桌面快键方式,不选检查更新。其他的,除了NEW的新特性(可勾不勾选)都要勾选。
.sh
文件是一种脚本文件,它以.sh
作为文件后缀,用于存储一系列的shell命令,可以被Unix或者Linux系统的shell解释器识别和执行。这些脚本文件可以用来自动化系统任务,比如定时执行某些程序,或者在系统启动时自动执行某些脚本。.sh
文件也可以用来实现某些功能,比如设置环境变量,安装软件,编译代码等等。总之,.sh
文件是一种强大的脚本文件,可以让你自动化系统任务,提高工作效率。- TrueType 字体是可缩放的数字字体,意思是它们可以调整到任何大小而不会失去质量。它们被广泛用于印刷和数字媒体,是Mac和Windows计算机最常用的字体格式。TrueType字体也是跨平台兼容的,意思是它们可以在Mac和Windows计算机上使用。
- Scalar2.38新出的功能
2.3 选择一个默认的编辑器
选择Vim
Vim编辑器,尽管强大,但是很难去使用。它的接口不直观,键绑定也很尴尬。
- 是windows默认编辑器因为一些历史原因,它被强烈建议去使用一些现代化的图形编辑器去取代它。
- 这个选项会让
core.editor
选项未设置,会让Git回退到EDITOR环境变量。默认的编辑器是Vim,但是你可以设置成你悬着的其他编辑器。
2.4 是否要修改初始化分支的名字
历史原因可以直接选择让Git决定
- 让Git决定
- 重写新仓库的分支初始命名
2.5 是否要修改你的环境变量
推荐选第一个,第二个没人用
-
只在Git Bash中使用Git:你的PATH不会被修改。你只能子啊Git Bash中使用Git命令行工具
-
从命令行,也可以从第三方软件使用:(推荐)这个选项添加一些最小的Git包装器在你的PATH中去避免弄乱你的环境通过一些的可选的UNIX工具。你能在Git Bash、命令提示、windows PowerShell还有任何第三方软件中在PATH中找到Git
-
使用Git和可选的Unix工具在命令提示中:Git和可选的Unix工具都会被添加到PATH。
警告:这会重写windows工具的“find”和“sort”。只有在你理解这些影响的时候你才能选择这项。
2.6 选择SSH执行程序
- 使用捆绑的:使用git自带的
- 使用外部 OpenSSH
2.7 选择 HTTPS 传输后端
选第一个
- 使用OpenSSL 库:服务器证书会被校验通过 ca-bhgundle.crt 文件
- 使用windos安全渠道库:略
2.8 配置你行结尾的转换符
选第一条
- 检出windows风格,提交Unix风格换行符:Git会转换LF为CRLF当通过文本文件查看时。当提交时,CRLF会被转换为LF,对于跨平台的项目,这被建议用在windows上(
coer.autocrlf
会被设置为true
) - 检出按原样,提交Unix风格换行符:Git不会任何文本结尾换行符文本文件查看时。当提交时,CRLF会被转换为LF,对于跨平台的项目,这被建议用在Unix上(
coer.autocrlf
会被设置为input
) - 检出按原样,提交按原样:不会做任何转换在检出和提交时。在跨平台项目上,这个选项不被建议使用。(
coer.autocrlf
会被设置为false)
2.9 配置使用Git Bash时的终端
第一个
- Use MinTTY(MSYS2默认的终端)
- 使用windows的终端
2.10 选择一下git pull
默认的行为
选第一个
- 默认:
- Rebase:待补充
- Only ever fast-forward:
2.11 选择凭据管理器
第一个
- Git凭据管理器:使用跨平台的凭据管理器
- 没有:不使用凭据管理助手
2.12 其他配置
两个都勾选
- 启用文件缓存机制:文件系统数据中的某些操作会被批量读取并缓存在内存中(core.fscache 被设置为true)。这提供了一个极大的性能提升。
- 启用符号链接(软链接文件)
2.13 配置实验室功能
都不选
- 启动对为控制台的支持:运行运行本地控制台如Node和Python,有bug
- 启用内置的文件系统监控器:自动启动一个内置文件系统观察者,加快共有操作在包括很多文件的工作树中。
2.14 检查是否安装成功
git --version
三、Git 常用命令
3.1 Git的常见配置
在文件夹下右键,打开终端
3.1.1 修改配置
1. 配置提交人姓名:
git config --global user.name “提交人姓名”
(对当前系统用户有效)
2. 配置提交人姓名:
git config --global user.email “提交人邮箱” #
(对当前系统用户有效)
签名的作用区分不同操作者的身份。用户的签名信息在每一个版本的提交信息都能看到,以此确定本次提交时谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码
用户签名与登录git的账号没有任何关系
哪里看设置成功?
xxx表示windows用户名,C:\Users\xxx下的.gitconfig文件
3.1.2 查看个人配置
- 打开终端,输入
git config --list
,查看当前的配置信息。 - 输入
git config --global user.name
和git config --global user.email
,查看全局的用户名和邮箱。 - 输入
git config --local user.name
和git config --local user.email
,查看本地的用户名和邮箱。
3.2 初始化本地库
-
在一个文件夹下,打开终端,输入
git init
,初始化本地库吗,会生成.git文件git init 命令是 Git 中最重要的命令之一,它用于初始化一个新的 Git 仓库。git init 命令可以帮助我们快速初始化一个 Git 仓库,从而开始版本控制。
- 它会创建一个 .git 目录,用于存储与版本控制相关的所有信息。
- 它还会创建一个初始化的 HEAD 文件,指向当前的分支。
- 此外,它还会创建一个 config 文件,用于存储配置信息。
-
通过
ll -a
查看隐藏文件$ ll -a total 4 drwxr-xr-x 1 Lenovo 197121 0 Feb 12 14:58 ./ drwxr-xr-x 1 Lenovo 197121 0 Feb 12 14:58 ../ drwxr-xr-x 1 Lenovo 197121 0 Feb 12 14:58 .git/
3.3 常用命令汇总
git status
它是一个 Git 中最常用的命令之一,用于检查当前仓库的状态。它可以显示本地仓库中被修改的文件,新增的文件,以及被跟踪的文件。此外,它还可以显示本地仓库和远程仓库之间的差异。git status
命令可以帮助我们更好地管理代码,并且可以让我们更容易地发现问题。- Git的
commit -m
命令可以将改动提交到本地仓库,并且在提交时可以添加注释,以便更好地追踪变更。在使用commit -m
命令时,需要在命令后面跟上一个注释,以描述本次提交的内容。 add
命令则可以将新文件或者修改过的文件添加到暂存区,准备提交到本地仓库。git reflog
是 Git 中一个强大的功能,它可以记录每一次提交的操作,以便在需要的时候恢复到之前的状态。它不仅可以记录提交,还可以记录撤销、拉取、推送等操作。git reflog
可以帮助我们恢复误删除的文件,也可以帮助我们恢复误操作的提交。它可以帮助我们恢复到任何想要的状态,而不用担心操作失误。git log
是 Git 中一个非常有用的命令,可以帮助我们查看提交历史。使用git log
命令,可以查看每一次提交的详细信息,包括提交者的名字、提交的注释以及提交的日期等等。此外,git log
命令还可以查看提交之间的差异,以及查看某个文件的提交历史。使用git log
命令,可以让我们更好地理解某个文件的演变历史,并且可以更加精准地定位到某个问题的源头。
3.4 实际案例
-
介绍一下
git reset --hard <version>
:它可以把当前分支回滚到指定的版本号,并且会丢弃当前分支上所有未提交的更改。它可以用来撤销提交,也可以用来重置分支到某个指定的版本号。 -
提交本地库代码
-
首次查看
$ git status On branch master No commits yet nothing to commit (create/copy files and use "git add" to track)
-
新增文件
- vim hello.txt,按i进入插入模式,输入hello git!
- 按ESC 再按V进入观察模式,把光标移到第一行,按yy,再按p复制10行。
- 按ESC,输入:wq保存结果并退出
-
再次查看本地库状态
$ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) hello.txt nothing added to commit but untracked files present (use "git add" to track)
存在违背追踪的文件,文件只在工作区,git没有追踪到文件。
-
-
添加文件到暂存区
-
执行git add “文件名”将文件添加到暂存区
$ git add hegitllo.txt warning: in the working copy of 'hello.txt', LF will be replaced by CRLF the next time Git touches it
换行符由CRLF被替换为LF,在你的工作目录下有你的原始换行符。
-
git status
$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: hello.tx
git rm —cached
可以删除文件,暂存区的文件删掉$ git rm --cached hello.txt rm 'hello.txt' Lenovo@LAPTOP-G1QM4RHU MINGW64 /d/Aworkplace/Git-Space/gitDemo (master) $ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) hello.txt nothing added to commit but untracked files present (use "git add" to track)
再次添加回来
git add hello.txt
-
-
提交
-
提交本地库
git commit
(形成自己的一个历史版本)$ git commit -m "first commit" hello.txt warning: in the working copy of 'hello.txt', LF will be replaced by CRLF the next time Git touches it [master (root-commit) 586fabe] first commit 1 file changed, 20 insertions(+) create mode 100644 hello.txt
586fabe 表示版本号,1个文件被改变,20个插入
-
git status
$ git status On branch master nothing to commit, working tree clean
没有东西需要提交,工作树是干净的
-
git reflog
以及git log
586fabe (HEAD -> master) HEAD@{0}: commit (initial): first commit Lenovo@LAPTOP-G1QM4RHU MINGW64 /d/Aworkplace/Git-Space/gitDemo (master) $ git log commit 586fabe126819aad3d463e6397c7437ccdc34295 (HEAD -> master) Author: consummate <sonsummate> Date: Sun Feb 12 15:44:46 2023 +0800 first commit
586fabe126819aad3d463e6397c7437ccdc34295 完整版本号
586fabe 前七位精准版本号
-
-
修改文件查看状态
$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: hello.txt
modified: hello.txt 是红色表示没有被git追踪也就是没有到暂存区去
执行一下命令
-
git add hello.txt
-
git status
Lenovo@LAPTOP-G1QM4RHU MINGW64 /d/Aworkplace/Git-Space/gitDemo (master) $ git commit -m "second commit" hello.txt warning: in the working copy of 'hello.txt', LF will be replaced by CRLF the next time Git touches it [master ffb4511] second commit 1 file changed, 2 insertions(+), 2 deletions(-) Lenovo@LAPTOP-G1QM4RHU MINGW64 /d/Aworkplace/Git-Space/gitDemo (master) $ git status On branch master nothing to commit, working tree clean
git没有修改的概念,更新就是一行新增,一行删除
-
-
版本穿梭
$ git reset --hard 9818e75 HEAD is now at 9818e75 asda
打开.git目录目录底下有个HEAD文件,里面记录了分支
ref: refs/heads/master
.git\refs\heads目录下的master文件 里面存放了版本号
9818e75b5d51cb201a8b6ea4e59ede2a1fe833ea
切换版本,顶层其实是移动指针
四、 分支
4.1 什么是分支
Git的分支是一种用于管理多个版本的代码的方法,它可以让开发者们在不影响主分支的情况下,对代码进行安全的尝试和实验。每个任务都可以创建分支,分支意味着程序员开发自己分支的时候不会影响主分支的代码,让自己的开发工作和主线分离。
Git的分支可以分为主分支、特性分支、和热修复分支等。
使用Git分支时,首先需要创建分支,然后在分支上进行开发,最后将分支合并到主分支。创建分支的命令为git branch <branch name>
,切换分支的命令为git checkout <branch name>
,合并分支的命令为git merge <branch name>
。
在实际开发中,Git分支可以用来实现多人协作开发,每个人都可以在自己的分支上进行开发,最后将各自的分支合并到主分支上。Git分支还可以用来实现多版本的管理,比如可以在主分支上开发新版本,而旧版本的代码可以保留在另外的分支上。
好处:
- 多个功能可以并行开发
- 某个功能开发失败,不会影响其他分支
4.2 Git分支的语法
比较简单,主要有以下几个命令:
git branch
:用于列出当前所有分支- -v
git checkout
:用于切换分支git merge
:用于合并分支git branch -d
:用于删除分支
# 列出当前所有分支
git branch -v
# 创建新分支
git branch new_branch
# 切换到新分支
git checkout new_branch
# 合并分支
git merge master
# 删除分支
git branch -d new_branch
合并分支(无冲突的情况)
-
git checkout new_branch
.git下HEAD内容是
ref: refs/heads/new
.git\refs\heads 下也有了新文件 new 文件存了版本号
-
修改分支下的hello.txt文件,并提交
-
切换为master分支
git checkout master
-
将new分支上的内容合并到master
git merge new
-
合并成功
$ git merge new Updating 9818e75..caef644 Fast-forward hello.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
合并分支(冲突)
-
切换到new分支,在第二行后添加 new
-
切换到master分支同样修改第二行
-
合并new分支到master上
$ git merge new Auto-merging hello.txt CONFLICT (content): Merge conflict in hello.txt Automatic merge failed; fix conflicts and then commit the result. Lenovo@LAPTOP-G1QM4RHU MINGW64 /d/Aworkplace/Git-Space/gitDemo (master|MERGING)
合并冲突在hello.txt,自动合并失败,修复冲突,然后提交结果。
-
git status
$ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add <file>..." to mark resolution) both modified: hello.txt
-
vim hello.txt
hello gitttt hello gitttt <<<<<<< HEAD hello gitttt new master ======= hello gitttt new new >>>>>>> new hello gitttt hello gitttt hello gitttt hello gitttt
<<<<<<< HEAD 当前分支的代码 ======= 合并的分支的代码 > > > > > > > new
都做了修改,git不知道合并那个,人为合并,
- 打开hello.txt文件,去掉特殊符号,对于冲突的部分保留你想要的,比如我两个都想要都保留,也可以只保留一个。
hello gitttt hello gitttt hello gitttt new master hello gitttt new new hello gitttt hello gitttt hello gitttt hello gitttt
-
git add hello.txt
-
提交本地库,但是不能带文件名 git
git commit -m "xxxx"
五、团队协作机制
5.1 团队内协作(同一个远程库)
5.2 跨团队协作(不同远程库,多任务可以并行开发)
参考资料
第一章
尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)_哔哩哔哩_bilibili
学习路线
附录
Git快速下载地址:https://npm.taobao.org/mirrors
/git-for-windows/