根据视频进行整理:尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)
文章归档于:https://www.yuque.com/u27599042/qy17ty


Git 简介

Git 是什么

  • Git 是一个免费的、开源的分布式版本控制系统
  • Git 为多人员协作的项目代码管理提供了方便

版本控制

  • 版本控制,就是记录文件的修改记录,记录文件内容的变化,以便将来查阅特定版本的修订情况,方便进行文件历史版本的查看与切换

集中式版本控制

  • 集中式版本控制工具中只有一个单一的进行文件版本集中管理的服务器,在该服务器中保存了所有文件的所有历史版本,协同工作人员都是通过客户端连接服务器取出最新的文件进行修改,文件修改的合并都是在该服务器中进行的
  • 优点:管理员可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统。
  • 缺点:如果服务器一旦宕机,那么将谁都无法提交更新,也就无法协同工作。

分布式版本控制

  • 在分布式版本控制中,存在一个代码托管中心,代码托管中心(远程库)负责所有文件的托管与管理,远程库是分布式版本控制中的一个代码库,所有开发人员在进行开发时,都会将远程库克隆到本地,在本地有一个与远程库一样的代码库,每个开发人员在自己本地的代码库中进行文件的修改,修改完成后将自己的本地库推送到远程库,在远程库进行文件的托管与管理
  • 分布式版本控制系统相对于集中式版本控制系统:
    • 服务器断网的情况下也可以进行开发,因为每个开发人员的版本控制是在本地进行的,修改完成后,最终只需要推送与远程库进行合并
    • 每个客户端保存的也都是整个完整的项目,包含历史记录,更加安全,当发生故障,事后都可以用其他客户端的本地仓库进行恢复。

Git 工作机制

代码托管中心

  • 代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库
  • 代码托管中心(远程库)的分类:
    • 局域网代码托管中心
      • GitLab
    • 互联网代码托管中心
      • GitHub(外网)
      • Gitee 码云(国内网站)

Git 下载与安装

Git 下载

  • Git 官网:https://git-scm.com/
  • Git 下载淘宝镜像:https://registry.npmmirror.com/binary.html?path=git-for-windows/

Git 安装

  • Git 详细安装教程(详解 Git 安装过程的每一个步骤):https://blog.csdn.net/mukes/article/details/115693833

Git 命令

在 Git 的 Bash 命令行中可以直接使用 linux 命令

设置用户签名

  • 用户签名的作用是区分对文件进行修改的不同操作者的身份。
  • 用户的签名信息在每一个文件提交历史版本的提交信息中能够看到,以此确认本次提交是谁做的。
  • Git 安装完成后只需要设置一次用户签名,且用户签名是必须设置的,不设置用户签名,提交代码会报错。
  • 注意,用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系,设置用户签名是为了能够确认本次提交是谁做的
# 设置用户名git config --global user.name 用户名# 设置用户邮箱# 邮箱可以不用真实存在,Git 不会验证邮箱是否真实存在,格式正确即可。git config --global user.email 邮箱

查看用户签名

  • 进入到 Windows 本地的用户家目录查看用户签名:C:/ => 用户 => 当前登录Windows的用户对应的文件夹 => .gitconfig

初始化本地库

  • 初始化本地库,让 Git 获取到项目的管理权,让 Git 能够管理项目
git init
  • 注意,生成的 .git 目录默认是隐藏的
    • Windows 查看隐藏目录

查看本地库状态

git status
  • master 为主分支,默认情况下,只有一个主分支(master / main)
  • 新建文件再次查看

本地分支重命名

git branch -m 旧分支名 新分支名

本地文件添加到暂存区

将指定的文件添加到暂存区

# 将某个指定文件添加暂存区git add 文件名# 将多个指定文件添加暂存区git add 文件名1 文件名2 文件名3 ...
  • 查看文件添加暂存区后的状态

将指定的目录及其下文件添加到暂存区

git add 目录# 提交当前目录及其下所有被删除、被修改和新增的文件到数据暂存区git add .
  • 当前在 a 目录下新建了 txt.txt 文件,在 a/b 目录下也新建了 txt.txt 文件,在 a/b/c 目录下也新建了 txt.txt 文件

将所有文件添加到暂存区

git add *

  • 提交所有修改的文件和新建的文件到数据暂存区,不包括删除的文件
  • 将当前所有存在的文件添加到暂存区
git add *

git add -u & git add –update

  • 提交所有被删除的文件和修改的文件到数据暂存区,不包括新建的文件
git add -ugit add --update

git add -A & git add –all

  • 提交所有被删除、被修改和新增的文件到数据暂存区
git add -Agit add --all

添加某个类型的文件到暂存区

# 添加当前目录下所有 html 文件到暂存区git add *.html

本地文件提交到本地库

将暂存区内容全部提交

git commit

将指定文件提交

  • 可以指定已跟踪文件进行提交,包含工作区和暂存区
git commit 文件名git commit 文件名1 文件名2 ...

提交文件同时指定本次的提交描述信息

  • 上述命令都会进入 vi 命令界面输入本次的提交描述信息
# 提交文件的同时指定本次的提交描述信息git commit 文件名... -m <本次提交描述信息>

将所有已跟踪文件修改提交

git commit -am <本次提交描述信息># 相当于执行# 将已跟踪的被删除和修改的文件提交到暂存区git add -u# 将暂存区中的文件提交到本地库git commit -m <message>

删除文件

rm

  • Linux 中的命令,删除工作区文件,不会提交本次删除操作到暂存区
  • 本地库中的文件版本记录仍为该文件未被删除,需要将本次删除操作添加到暂存区并提交,在本地库中记录该文件当前的历史版本为删除
rm 文件名

git rm 文件名 [–cache | –force | -f]

  • 删除工作区文件,并提交本次删除操作到暂存区
  • 如果当前要删除的文件被修改了,且没有进行修改操作的提交,则此时执行此命令进行该文件的删除会报错
  • 如果此时需要删除此文件,可以将修改操作先提交后再进行文件的删除
  • 或者执行强制删除文件 git rm -f 文件名git rm -force 文件名,如果进行强制删除,则之前没有提交的修改操作不会形成文件的历史版本,修改操作会被删除操作覆盖替换,强制删除后工作区文件会被删除
  • 也可以执行 git rm --cache 文件名 使该文件不被 Git 追踪,工作区文件仍然存在,然后即可删除文件
git rm -f 文件名git rm --force 文件名# 从缓存中删除该文件# 使文件不被 Git 追踪git rm --cache 文件名

查看版本信息

git reflog

  • 查看精简的版本信息
git reflog

git log

  • 查看详细的版本信息
git log

版本穿梭

  • 重置到指定的版本
git reset 版本号
  • 第一次 commit 时的状态,后面的实例都会穿梭回该版本

–hard

  • 将穿梭到指定的版本,并且清除暂存区和工作区
  • 穿梭前的状态:
  • 由于 5.txt 没有被跟踪,也就是没有被 Git 管理,所以其不会受到任何影响,但是被 Git 管理的工作区部分和暂存区都会被 Git 清除
    • 工作区中已提交的 2.txt 3.txt 和已经提交到暂存区的 4.txt 都被清除

–soft

  • 将穿梭到指定的版本,但是工作区、暂存区都不会做任何变化,所有的在 HEAD(当前所在版本的指针)和穿梭到的那个commit 版本之间的所有变更会提交在暂存区中,不清除暂存区和工作区。即穿梭的两个版本之间的差别会提交到暂存区中
  • 穿梭前的状态:
  • 穿梭后的状态:

–mixed

  • 该选项是默认的
  • 将穿梭到指定的版本,工作区不会被更改,所以所有从 HEAD(当前所在版本的指针)到穿梭到的那个 commit 版本之间的所有变更会保存在工作区中,即不清除暂存区,被标示为已变更,会清除暂存区的内容
  • 穿梭前的状态:
  • 穿梭后的状态:

Git 分支

分支概述

  • 在项目的管理与版本控制过程中,为了能够实现项目能够持续为用户提供服务,同时项目开发能够推进多个任务,我们可以为每个任务创建一个单独分支,主分支用于为用户持续提供服务,其他分支用于项目任务的开发。使用分支意味着可以把每个任务的开发实现从开发主线上分离开来,开发每个分支的时候,不会影响主线分支的运行。
  • 一个分支可以理解为就是主分支的一个单独的副本。(分支底层其实也是指针的引用)

分支的好处

  1. 同时并行推进多个功能开发,提高开发效率。
  2. 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

查看分支

git branch -v
  • 使用该命令,可以查看当前所有分支,其中带 * 号的代表当前所在的分支。

创建分支

git branch 分支名
  • 新创建的分支会将主分支 master 的内容复制一份,形成一个 master 分支的副本

切换分支

git checkout 分支名

合并分支

git merge 分支名
  • 该命令用于把指定的分支合并到当前分支上
  • 如果要将其他分支合并到主分支中,需要在主分支中执行合并分支命令

正常合并

  • hot-fix 分支对代码进行了修改,而 master 分支没有对代码进行修改,此时将 hot-fix 分支合并到 matser 分支为正常合并。
  • 正常合并,即要合并到当前分支的分支中的修改与当前分支中的修改没有发送冲突

冲突合并

  • 合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改,即合并分支时发送了冲突,Git 无法替我们决定使用哪一个分支中的修改进行合并,必须人为决定使用哪个分支的修改进行合并。
  • master 分支中修改并提交:
  • hot-fix 分支修改并提交:
  • 合并分支:
  • 手动进行分支合并:
  • 手动合并文件,手动打开编辑文件,手动进行文件修改内容的合并,手动选择发生冲突的部分需要保留哪个分支的修改内容
  • 修改保存后,需要将手动进行冲突合并的文件添加到暂存区,然后提交修改:
    • 注意:此时使用 git commit 命令时不能带文件名,因为两个分支都对同一个文件进行了修改,如果带了文件名会报错,Git 不知道要提交哪个分支的修改
    • 将其他分支的内容合并到当前分支,其他分支的内容是不会发生修改的,仍然是合并之前的内容,发生修改的只是当前的分支(将其他分支内容合并到当前分支)

.git 文件中查看当前分支


.git 文件中查看当前分支所在版本

  • 根据 HEAD 文件中的目录进行查看

Git 远程仓库操作(GitHub)

GitHub 创建远程仓库


仓库创建完成:

远程仓库的操作

命令名称作用
git remote -v查看当前所有远程地址别名
git remote add 别名 远程地址起别名
git push 别名 分支推送本地分支上的内容到远程仓库
git clone 远程地址将远程仓库的内容克隆到本地
git pull 远程库地址别名 远程分支名将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并

查看当前本地所有远程仓库地址别名

git remote -v

为远程仓库地址创建别名

为远程仓库创建别名后,后续从远程仓库拉取和向远程仓库推送代码操作,可以直接使用别名即可

git remote add 别名 远程地址

推送本地库到远程仓库

将本地仓库推送到远程仓库时,需要指定远程仓库的链接或本地取的别名,指明要推送到哪个远程仓库,以及要推送到远程仓库的分支

git push 别名或远程仓库链接 分支





拉取远程库到本地库

拉取远程库代码到本地时,需要指明要拉取的远程仓库,以及要拉取远程仓库的哪一个分支

git pull 远程库地址别名或链接 远程分支名

拉取远程库到本地库:

克隆远程仓库到本地

克隆远程仓库到本地时,不需要登录账号,直接利用远程仓库的地址克隆到本地即可

git clone 远程地址

将远程仓库demo1克隆到本地E://git-clone


clone 会做如下操作:
1、拉取代码
2、初始化本地仓库
3、自动为克隆的远程仓库创建别名(默认为origin)

邀请加入团队





然后将邀请函发送给被邀请的人,被邀请的人,登录github账号后,打开邀请函链接,同意邀请。

同意之后,加入协作

之后被邀请人就可以将代码推送到远程仓库上。

Windows 凭据管理器


保存于 Windows 凭据中的 GitHub 凭据,在 Git 进行本地仓库向远程仓库推送和拉取时使用

ssh免密登录

进入电脑 Windows 系统当前用户的家目录,删除 .ssh 目录

打开 Git 的 bash 命令行窗口,运行命令重新生成 .ssh 秘钥目录

# 使用如下命令生成 ssh 密钥# -t 指明使用的加密算法为 rsa# -C 指明当前生成的密钥是针对于哪个Github账号ssh-keygen -t rsa -C 创建Github账号使用的邮箱




查看并复制公钥,使用在 Github 账号上配置的公钥与当前拥有与之匹配的私钥将 GitHub 账号和当前主机配对




当前电脑客户端接下来再往远程仓库 push pull 东西的时候使用 SSH 连接就不需要登录了。


github 仓库中的文件情况

拉取远程仓库到本地