Git学习

一、版本控制和安装介绍

工程设计领域中,使用“版本控制”管理工程蓝图的设计过程。在 IT 开发可以使用版本控制思想管理代码的版本迭代。

1.目的

协同修改:支持在服务器对同一个文件多人协同地修改; 数据备份:同时保存目录及文件的当前状态与每次提交时的历史状态; 版本管理:不保存版本间的重复数据以节约存储空间;

为此,SVN 和 Git 分别采用增量式管理 和文件系统快照 的方式。

权限控制:对团队协作者进行权限控制(SVN 和 Git 共有);审核团队外开发者贡献的代码(Git 独有); 历史记录:查看修改者、修改时间、修改内容、日志信息等项目;将本地文件恢复到某一指定的历史状态; 分支管理:允许开发团队同时优雅地推进多条生产线任务,提高效率。

2. 工具

版本控制工具是版本控制思想的实现。

2.1 集中式版本控制工具

如:CVS、SVN、VSS 等。

  • 仅云端库有版本历史记录,本地库仅有最新的版本;
  • 无法完全避免单点故障的问题。

单点故障:一个主机连接多个处理节点,主节点负责分发任务,而子节点负责处理业务,当主节点发生故障时,会导致整个系统发故障。

image-20220827211244519

image-20220827211244519

image-20220827211204909

image-20220827211204909

#2.2 分布式版本控制工具

如:Git、Mercurial、Bazaar、Darcs 等。

  • 云端库和本地库都会为各个版本历史记录存档;
  • 从根本上避免了单点故障。

image-20220827211230657

image-20220827211230657

#3.Git 简介

#3.1 Git:分布式版本控制系统

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

下图就是分布式版本控制工具管理方式:

image-20221006131925125

image-20221006131925125

仓库(版本库):相当于一个专门用来存放代码的目录。这个目录里面的所有文件都可以Git管理,每个文件的增删改查都能被Git跟踪到

#3.2 发展史

image-20220827211720552

image-20220827211720552

#3.3 优势

  • 大部分操作在本地完成,不需要联网;
  • 完整性保证;
  • 尽可能添加数据,而不是删除或修改数据;
  • 分支操作非常快捷流畅;
  • 与 Linux 命令全面兼容。

#4.Git 软件的安装

从 https://git-scm.com/downloadsopen in new window 下载对应操作系统的二进制可执行文件。

直接下一步的过程就不介绍了

1.安装到无空格的英文路径下(这是软件安装过程中的规范,防止因程序的不健壮而引发未知错误);

image-20220827211905363

image-20220827211905363

2.选择需要安装的组件;

image-20220827211916721

image-20220827211916721

3.选择 Visual Studio Codeopen in new window 用于 Git 的默认文本编辑器;

image-20220827212000737

image-20220827212000737

4.设置在执行git init命令后,由 Git 自行定义新存储库的初始分支名称——master

image-20220827212024257

image-20220827212024257

5.设置PATH环境变量——保持默认;

image-20220827212111362

image-20220827212111362

6.选用内置的 OpenSSH 作为 SSH 可执行文件;

image-20220827212130586

image-20220827212130586

7.选择 OpenSSL 库作为 HTTPS 传输端;

image-20220827212142376

image-20220827212142376

8.使用默认配置转换文本文件中的行尾;

image-20220827212154165

image-20220827212154165

9.使用默认配置,选用 MinTTY 作为 Git Bash 的终端;

image-20220827212206242

image-20220827212206242

10.对于执行git pull命令后的行为保持默认;

image-20220827212223848

image-20220827212223848

11.选用默认的授权助手;

image-20220827212233762

image-20220827212233762

12.其他杂项设置;

image-20220827212247326

image-20220827212247326

13.保持对实验性选项的禁用后安装 (Install);

image-20220827212312589

image-20220827212312589

二、本地库操作

1.git的结构

image-20221006131836575

image-20221006131836575

image-20220827212525927

image-20220827212525927

#2.Git 远程库——代码托管中心

#2.1 git工作流程

代码托管中心用于维护 Git 的远程库。包括在局域网环境下搭建的 GitLab 服务器,以及在外网环境下的 GitHubopen in new window 和 Gitee (码云)open in new window

一般工作流程如下:

1.从远程仓库中克隆 Git 资源作为本地仓库。

2.从本地仓库中checkout代码然后进行代码修改

3.在提交前先将代码提交到暂存区。

4.提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。

5.在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。

团队内部协作

image-20220827212710234

image-20220827212710234

跨团队协作

image-20220827212722660

image-20220827212722660

#2.2 Github:开源社区

Github线上仓库结构介绍

image-20221006132339079

image-20221006132339079

Github Issues

作用:发现代码BUG,但是目前没有成型代码,需要讨论时用;或者使用开源项目出现问题时使用

fork与git clone的区别

1.区别

git clone 是在自己电脑直接敲命令,结果是将github仓库中的项目克隆到自己本地电脑中了(就是下载过来)

fork是直接访问github网站,在项目页面中点击fork,然后自己github项目中就会多出一个复制的项目

2.用法

如果我们想要修改他人github项目的话,我们直接git clone代码到本地是不能push的,所以我们使用fork,先把代码复制到自己的github仓库,然后git clone到本地修改,然后在提交push(这里的push是push到自己github仓库了,我们自己的github仓库中的代码是fork源的一个分支),这时候我们想要把修改的代码提交给他人的话,就可以在自己github上pull requests,等其他人看到后就可以把代码做一个合并

#3.初始化配置

以本地计算机的G:\Desktop\git的工作目录,在其中新建一个项目文件夹git_demo后打开。

执行git init对git存储库初始化

查看.git文件夹中的信息

文件./.git/config用于记录该本地库的配置信息。

注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡 乱修改。

#3.1 设置签名

签名由user. name (用户名)和user. email (Email地址)组成,用于对不同开发者的身份作区分,包括项目/仓库级别、系统用户级别。

这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。 项目/仓库级别与系统用户级别必须有一个设置生效。

#3.1.1 项目/仓库级别

具有更高的优先级签名; 各个本地库的签名信息相互独立,互不干扰。

git config user.name "dselegent"
git config user.email dselegent@qq.com

配置文件的修改保存在:<Project>/.git/config文件中。

image-20220827214121295

image-20220827214121295

#3.1.2 系统用户级别

若未设置项目/仓库级别的签名时,使用用户级别的签名。

git config --global user.name "dselegent"
git config --global user.email dselegent@qq.com

配置文件的修改保存在:~/.gitconfig文件中。

image-20220827214440210

image-20220827214440210

级别优先级

  • 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别 的签名
  • 如果只有系统用户级别的签名,就以系统用户级别的签名为准
  • 二者都没有不允许

#3.2 配置编辑器

使用命令git config [--global | --system] core.editor [...]为 Git 的配置编辑器。

#3.3 配置信息

使用命令git config --list查看 Git 的配置信息。

image-20220827214826684

image-20220827214826684

#4.版本控制

#4.1 在项目中新建文件

G:\Desktop\git中新建文件test1.txt后打开。

hello git!
#4.1.1 查看状态

使用git status查看工作区、暂存区状态

image-20211126104411928

image-20211126104411928

对于master分支,本地库暂未有任何被提交的内容、暂存区亦未有任何可提交的内容(可用git add命令追踪新建的文件), 存在未追踪的文件test1.txt (可用git add <file>... 命令将文件载入暂存 区以待提交)。

#4.1.2 添加到暂存区

git add test1命令将文件test1.txt添加到暂存区。

警告:此时根据转换文本文件行尾换行的配置,默认按照Windows风格检出后用Unix的风格替换提交(将LF转换为CRLF) ,本地工作目录不受这一替换的影响。

对于master分支,本地库暂未有任何被提交的内容、暂存区有以下新文件的改变可被提交:test1.txt (可用git rm --cached <fi1e>... 命令将文件撤出暂存区)。

从暂存区撤出文件的命令不会影响工作区的文件。

touch 文件名 创建文件

git add 文件名 将文件添加到暂存区

git add 文件名1 文件名2 文件名3 将多个文件添加到暂存区

git add . 添加当前目录下的文件到缓存区,注意有空格在.前面

#4.1.3 提交到本地库

git commit test1 -m 'first commit'命令将文件test1.txt提交到本地库。

master分支上创建了一个根提交(ID号:da56888) 。注释内容为: first commit 。这次提交修改/新建了1个文件,插入了1行内容。

对于master分支,暂存区暂未有任何可提交的内容,工作目录的文件系统树完全一致。

#4.2 修改文件内容

对文件test.txt做出 1 处修改后保存:

hello git!
second
#4.2.1 查看状态

对于master分支,存在未暂存的修改: test1.txt (可用git add <file>... 命令将文件更新到 暂存区以待提交或用git restore <file>... 命令丢弃工作目录的更改)。暂存区没有可提交的修改(可用git add 命令将修改添加到暂存区或用git commit -a 将修改暂存后立即提交)。

#4.2.2 添加到暂存区

image-20220827215839107

image-20220827215839107

#4.2.3 提交修改到本地库

使用git commit text -m "My second commit”命令提交修改到本地库,而不必单独用编辑器注释修改。

image-20220827220146316

image-20220827220146316

#4.3 查看提交的版本记录

image-20220827220308190

image-20220827220308190

每一个提交记录(commit)都有一个hash值作为提交记录的键,与提交人、提交时间以及提交注释对应。在当前的版本中,有(HEAD -> master)的标记,即用HEAD指针指向当前版本。

版本间的切换通过移动HEAD指针完成。

若日志信息太多,可用空格键向下翻页、b键向上翻页、q键退出。

  • 可用git 1og --pretty=oneline 命令以每个提交历史仅占1行的方式显示日志;

  • 可用git 1og --oneline命令显示更简略的日志信息,此时只截取显示40位hash值的前7位;

  • 可用git reflog 命令显示带HEAD指针移动次数的简略信息。.

git reflog命令可显示HEAD指针前后的全部提交日志;其他日志查看命令只显示从当前版本往后的提交日志。

DS@DS MINGW64 /g/Desktop/git/git_demo (master)
$ git log --pretty=oneline
a087691b1b36033551860de2923512caaa593b06 (HEAD -> master) My second commit
da568881807198113fa60debe615bcd0cc7834e1 first commit

DS@DS MINGW64 /g/Desktop/git/git_demo (master)
$ git log --oneline
a087691 (HEAD -> master) My second commit
da56888 first commit

DS@DS MINGW64 /g/Desktop/git/git_demo (master)
$ git reflog
a087691 (HEAD -> master) HEAD@{0}: commit: My second commit
da56888 HEAD@{1}: commit (initial): first commit

#4.4 版本的切换

版本前进后退的本质是HEAD指针的位置的移动。

#4.4.1 版本的直达

使用git reset --hard <hash_len_7>命令。

#4.4.2 版本后退

方法一

使用git reset --hard HEAD[^...]执行版本的后退(每个^符号后退 1 版,不加^符号则恢复成当前指针所指位置的状态)。

git reset --hard HEAD^ 表示回退一个版本

git reset --hard HEAD^^ 表示回退两个版本

git reset --hard HEAD^^^ 表示回退三个版本

git reset --hard HEAD^^^^ 表示回退四个版本

image-20220827221518210

image-20220827221518210

方法二

使用git reset --hard HEAD~[NumberOfSteps]执行版本的前进(~符号后的数字注明了连续后退的步数)。

git reset --hard~3 表示回退三个版本

image-20220827222013161

image-20220827222013161

做了第三次提交之后才回退版本

#4.4.3 reset 命令的 3 个参数

使用git help <command>命令用浏览器查看特定命令的本地帮助文件,如git help reset

--soft 仅在本地库移动HEAD指针。

image-20220827222244789

image-20220827222244789

--mixed

在本地库移动HEAD指针,且重置暂存区。

image-20220827222307688

image-20220827222307688

--hard

在本地库移动HEAD指针,且重置暂存区和工作区。

image-20220827222526891

image-20220827222526891

#4.5 文件的删除与找回

前提:文件存在时的状态提交到了本地库。 核心: 1.文件删除前已提交到本地库:git reset --hard <HistoricalRecords> 2.文件删除前未提交到本地库:git reset --hard HEAD

#4.5.1 创建待删除文件

创建test2.txt文件,并写入一行内容:test2。

添加到暂存区后提交:

image-20220827222902821

image-20220827222902821

#4.5.2 删除文件

删除文件

rm -rf 文件名 通知要删除某文件

git rm 文件名 删除缓存区的该文件

git reset . 清空暂存区所有文件

git commit -m"注释" 将仓库文件删除

使用rm test2.txt命令删除test2.txt文件。

image-20220827223002700

image-20220827223002700

删除后的状态

image-20220827223027325

image-20220827223027325

暂存并提交

image-20220827223136817

image-20220827223136817

#4.5.3 找回文件

将版本回退到删除文件前的那个版本,即可完成对文件的找回。

image-20220827224402028

image-20220827224402028

若文件的删除变化只添加 (add) 到了暂存区而未提交 (commit) 到本地库,则可使用git reset --hard HEAD命令找回文件。

#4.6 文件差异性比较

对于test1.txt文件,修改前:

image-20220827224506801

image-20220827224506801

修改后:

image-20220827224545434

image-20220827224545434

  • 使用git diff <filename>命令默认用于当前文件与暂存区对应文件的差异比较:

  • 若使用git diff <hash_len_7|HEAD|HEAD^[^...]> <filename>命令,则可用于当前文件与特定历史版本或已暂存前文件的差异比较。

  • 使用不带文件名的diff命令则可比较工作区的所有文件。

image-20220827224705855

image-20220827224705855

#4.7 分支管理

Git 分支是由指针管理起来的,可以快速创建、切换、合并与删除,适用于大型项目的开发。在分支上开发,调试后合并到主分支的策略使每个人的开发模块式相互独立不影响到其他人。 1.主分支(默认的master分支)只用来发布重大版本更新(各版本可以有不同的标签以便于查找); 2.日常开发应该在其他分支上完成,如develop; 3.对于新增功能 (feature) 、用于预发布 (release) 、Bug 修复 (bug/hot_fix) 的临时性分支,应在使用完毕后及时删除,以免分支的混乱。 4.多人开发时,可分别创建自己专属的分支,当阶段性工作完成后应该合并到上级分支。

image-20220827224809698

image-20220827224809698

#4.7.1 创建分支

使用git branch <BranchName>命令创建名为<BranchName>的新分支,如git branch hot_fix

#4.7.2 查看分支

使用git branch -v命令可查看分支的详细 (verbose) 信息(哈希值和名称)。

image-20220827224931315

image-20220827224931315

列出全部分支后,分支名称前以星号*标注的是当前分支。 当前分支已在各命令行的括号()中提及。

#4.7.3 切换分支

使用git checkout <BranchName>切换到指定分支,如git checkout hot_fix

image-20220827225046032

image-20220827225046032

#4.7.4 合并分支

hot_fix分支中产生修改:

image-20220827225236563

image-20220827225236563

使用git checkout master命令切换到接受合并的分支后,在使用git merge <BranchName>命令合并分支:

image-20220827225451370

image-20220827225451370

#4.7.5 分支合并的冲突产生

分支的同一位置同时发生不同的修改时,将在相互合并分支时产生冲突。需要执行手动的冲突解决。 在hot_fix分支上修改,添加到暂存区后提交:

image-20220827225832007

image-20220827225832007

master分支中的同一位置做出不同的修改,添加到暂存区后提交

image-20220827230801336

image-20220827230801336

并尝试将hot_fix合并到master

image-20220827230808987

image-20220827230808987

自动合并失败;需要手动修复冲突,然后提交结果。

#4.7.6 分支合并的冲突解决

image-20220827230851233

image-20220827230851233

不同于 SVN,Git 产生冲突后,不会产生新的额外文件。

对于产生冲突的文件,Git 会在冲突发生出做出特定的标记:

image-20220827230923330

image-20220827230923330

hello git!
ds
<<<<<<< HEAD         ---
hot_fix2:master		 --- 这是当前分支的内容
=======				
hot_fix2			---
>>>>>>> hot_fix		 --- 这是用于合并的内容

1.编辑文件,删除特殊符号,把文件修改到满意为止后保存退出; 2.使用git add <filename>命令将此文件添加暂存区; 3.使用git commit -m "fix merge"命令提交冲突修复(执行冲突修复时不能添加具体的文件名)。

image-20220827231307442

image-20220827231307442

#4.7.7 删除分支

注意在删除分支时要退出该分支

1 先切换到别的分支: git checkout master

2 删除本地分支: git branch -d hot_fix

3 若是删除不了能够强制删除,git branch -D hot_fix

4 有必要的状况下,删除远程分支:git push origin --delete hot_fix

image-20220827231520070

三、远程库操作

1.推送到远程库

#1.1 创建github仓库

创建新仓库 (github.com)open in new window

image-20221006163144237

image-20221006163144237

#1.2 创建远程库地址别名

git remote -v 查看当前所有远程地址别名

git remote add [别名] [远程地址]

注意:需要先切换到自己的本地仓库

如果还没有创建本地仓库,那么使用   git init  命令创建本地放仓库,然后进入本地仓库目录,使用

git remote add [别名] [远程地址]   命令。

image-20221006163319039

#1.3 推送

git push [别名] [分支名]

image-20221006163529176

image-20221006163529176

image-20221006163609629

image-20221006163609629

#2.加入团队并推送

#2.1 克隆项目到本地

git clone 仓库地址

image-20221006164655915

image-20221006164655915

效果

  • 完整的把远程库下载到本地

  • 创建 origin 远程地址别名

  • 初始化本地库

#2.2 添加新成员加入团队

image-20221006164837999

image-20221006164837999

image-20221006164827658

image-20221006164827658

image-20221006165016543

image-20221006165016543

image-20221006165030823

image-20221006165030823

#2.3 推送更新到远程库

1.更改用户名

image-20221006184421259

image-20221006184421259

2.修改文件并提交到本地库

image-20221006170100066

image-20221006170100066

3.推送到远程库

image-20221006184352833

image-20221006184352833

image-20221006184333691

image-20221006184333691

image-20221006184344102

image-20221006184344102

#3.远程库的 SSH 登录

在 Windows 10 系统中,凭据管理器为我们记录了 GitHub 的 Windows 凭据,再次从终端经过 GitHub 写数据时,可自动保持登录状态。但其他 OS 不一定有这样的功能,因此不便于频繁地提交版本。 为此,可以使用 SSH 登录的方式访问远程库。

不同于 SSH 登录,使用 HTTPS 的方式可以在多个 GitHub 帐号间管理仓库。

image-20220827231735884

image-20220827231735884

#3.1 在本地 Home 目录生成 GitHub 公/私钥

cd ~进入当前用户的根目录

rm -rvf .ssh 删除.ssh 目录

使用命令ssh-keygen -t <KeyType> -C <Annotation|AccountEmailAddress>在本地 Home 目录生成 GitHub 公/私钥。

ssh-keygen -t rsa -C dselgent@qq.com

image-20220827232018116

image-20220827232018116

#3.2 查看 .ssh 目录下的文件

cd .ssh

cat id_rsa.pub

image-20220827232355616

image-20220827232355616

将秘钥全部复制

#3.3 在 GitHub 配置该 SSH 公钥

登录 GitHub 账户后,进入Settings中的SSH and GPG keys项执行配置:

image-20220827232156887

image-20220827232156887

image-20220827232550986

image-20220827232550986

#3.4 更改在本地的远程库地址

使用git remote set-url <Alias4RemoteRepositoryAddress> <RemoteRepositoryAddress>命令,将远程库地址由 HTTPS 方式切换为 SSH 方式:

image-20220827233228262

image-20220827233228262

也可以直接添加一个新的别名origin_ssh

image-20221006192328180

image-20221006192328180

随后,即可使用 SSH 的方式免密读写 GitHub 的内容。

image-20221006192705628

image-20221006192705628

image-20221006192719254

image-20221006192719254

#4.解决冲突

#4.1 冲突的产生

冲突的产生:本地仓库与线上不一致时未git pull就开始编写代码 并且在编写完代码后试图git push

image-20221006193046462

image-20221006193046462

#4.2 解决冲突

  • 要点
    • 如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
    • 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
  1. 首先我要在两个本地库更改test2.txt中的内容

dselegent

image-20221006194022775

image-20221006194022775

dselegent-gmail

image-20221006194132829

image-20221006194132829

  1. dselegent推送到远程库

image-20221006194251330

image-20221006194251330

image-20221006194305353

image-20221006194305353

image-20221006194313397

image-20221006194313397

  1. dselegent-gmail推送到远程库

image-20221006194350085

image-20221006194350085

  1. dselegent-gmail中使用git pull origin master拉取最新的内容

pull=fetch+merge

git fetch [远程库地址别名]

git merge [远程库地址别名/远程分支名】

git pull [远程库地址别名] [远程分支名]

image-20221006194801202

image-20221006194801202

image-20221006194846829

image-20221006194846829

image-20221006195232425

image-20221006195232425

  1. dselegent-gmail推送到远程库

image-20221006195309995

image-20221006195309995

image-20221006195326732

image-20221006195326732

image-20221006195334121

image-20221006195334121

#5.跨团队协作

这里先把dselegent-gmail退出团队用来做示例

  1. 点击右上角fork

image-20221006195537205

image-20221006195537205

image-20221006200645023

image-20221006200645023

  1. 克隆到本地

image-20221006200507493

image-20221006200507493

  1. 修改文件推送到远程库

image-20221006200627526

image-20221006200627526

  1. Pull Request

image-20221006200928505

image-20221006200928505

image-20221006200916957

image-20221006200916957

  1. dselegent中接收

    image-20221006201438135

    image-20221006201438135

image-20221006201507387

image-20221006201507387

image-20221006201542512

image-20221006201542512

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值