一只会飞的旺旺
文章92
标签72
分类8
Git教程从入门到入土

Git教程从入门到入土

小卖铺上新啦!ChatGPT账号大甩卖! 一键直达

简介

Git 是一个用于管理源代码的分布式版本控制系统。

那么什么是版本控制?简而言之,版本控制是用于跟踪文件更改的系统。修改文件时,版本控制系统会记录并保存每个更改。这允许您随时还原以前版本的代码。

发展历程

本地版本控制系统

最初的版本控制系统,它们使用简单的数据库或文件复制的方式来保存不同的版本,但是容易出错和丢失数据。例如 RCS。

集中式版本控制系统

后来出现的版本控制系统,它们使用一个中央服务器来保存所有文件的修订版本,而客户端通过网络连接来取出或提交更新。这样可以方便地管理权限和协作,但是也有单点故障和必须联网的缺点。例如 CVS、SVN和 Perforce。

分布式版本控制系统

最新的版本控制系统,它们允许每个客户端完整地镜像整个代码仓库,包括所有的历史记录。这样可以提高速度和安全性,也可以支持更灵活的协作模式。例如 Git、Mercurial、Bazaar 和 Darcs

作用

  • 跟踪代码历史记录
  • 方便团队协作处理代码
  • 便于代码溯源,查看谁进行了哪些更改
  • 将代码部署到过渡或生产环境

安装

Windows

  1. 下载最新的 Git for Windows 安装程序

  2. 成功启动安装程序后,应会看到 Git 安装程序向导屏幕。按照“下一步”和“完成”提示完成安装。默认选项对于大多数用户来说非常明智。

  3. 打开命令提示符(如果在安装过程中选择不使用 Windows 命令提示符下的 Git,则打开 Git Bash)。
    image-20230526151632523

  4. 使用以下命令配置您的 Git 用户名和电子邮件,注意替换信息

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

Linux

  1. 在 shell 中,使用 apt-get 安装 Git:

    $ sudo apt-get update
    $ sudo apt-get install git
    
  2. 通过键入 git --version 验证安装是否成功:

    $ git --version
    git version 2.9.2
    
  3. 使用以下命令配置您的 Git 用户名和电子邮件,注意替换信息

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

MacOS

  1. 下载最新的 Git for Mac 安装程序。Git for Mac installer

  2. 按照提示安装 Git。

  3. 打开终端并通过键入 git --version 验证安装是否成功:

    $ git --version
    git version 2.9.2
    
  4. 使用以下命令配置您的 Git 用户名和电子邮件,注意替换信息

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

基本概念

Git是一个版本控制系统,包括三个主要组件:存储库(Repository)、工作树(Working Tree)和索引(Index)。了解这些组件以及Git中的文件状态对于有效的协作和代码管理至关重要。

主要组件

image-20230527093735968

  1. 存储库(Repository):存储库是跟踪项目文件变化的“容器”。它保存了所有的提交(Commits),即特定时间点上文件的快照。可以使用Git日志访问提交历史记录。
  2. 工作树(Working Tree):工作树,也称为工作目录,包含当前正在处理的文件。它类似于一个文件系统,您可以根据需要查看和修改文件。
  3. 索引(Index):索引,也称为暂存区域(Staging Area),是准备提交的中间步骤。它在工作树和存储库之间起到桥梁作用。当您在工作树中对文件进行更改时,索引会跟踪并将其标记为已修改,然后才能提交更改。

工作流程

基本的Git工作流程包括以下步骤:

  1. 修改文件:根据项目需求修改工作树中的文件。
  2. 暂存更改:有选择性地暂存要包含在下一次提交中的更改。暂存允许您准备具有特定修改的提交,同时排除其他修改。
  3. 提交更改:执行提交操作,永久保存更改。此过程将索引中的文件作为快照存储在存储库中。在提交时,通常会包含描述性消息以总结所做的更改。

文件状态

image-20230527093759496

Git中的文件可以存在三种主要状态:

  1. 已修改:当您修改文件时,更改仅存在于工作树中,尚未包含在存储库或索引中。
  2. 已暂存:暂存是指准备要包含在下一次提交中的更改的过程。处于已暂存状态的文件已添加到索引中,并且其修改将在即将进行的提交中排队等待。
  3. 已提交:一旦提交更改,Git将索引中的文件作为快照存储在存储库中。已提交的

远程存储库和本地存储库

image-20230527095236101

  • 远程存储库托管在多个团队成员之间共享的远程或异地服务器上。
  • 本地存储库托管在本地计算机上供单个用户使用。

虽然我们可以在本地存储库中利用 Git 版本控制功能,但协作功能(例如与团队成员一起拉取和推送代码更改)将更适合远程存储库。

SSH密钥

SSH密钥是什么

SSH 密钥是一种用于 SSH(安全外壳)网络协议的访问凭证。SSH 是一种用于在不安全的开放网络上进行远程机器之间的认证和加密的安全网络协议。SSH 可用于远程文件传输,网络管理和远程操作系统访问。SSH 这个缩写也用来描述一组用于与 SSH 协议交互的工具。

如何生成SSH密钥

  1. 执行下面命令创建密钥,此命令将使用电子邮件作为标签创建新的 SSH 密钥

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    
  2. 系统将提示您“输入要在其中保存密钥的文件”。您可以指定一个文件位置, 或者按“Enter”键接受默认 的文件位置。

    > Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
    
  3. 下一个提示会要求您输入一个安全 的密码短语。 密码短语会为 SSH 增加一层额外 的安全性, 并且每次使用 SSH 密 钮时都需要输入密码短语。 如果有人获得了存储私钥的计算机的访问权限,他们也可能获得使用该密钥的任何系统的访问权限。为密钥添加密码短语可以防止这种情况发生。

  4. ssh-agent是另一个属于SSH工具套件的程序。ssh-agent负责保存私钥。可以把它想象成一个钥匙链。除了保存私钥外,它还代理使用私钥对SSH请求进行签名的请求,以便私钥不会不安全地传递。

  5. 在将新的SSH密钥添加到ssh-agent之前,首先确保ssh-agent正在运行,通过执行:

    $ eval "$(ssh-agent -s)"
    

    一旦ssh-agent运行起来,以下命令将把新的SSH密钥添加到本地SSH代理。

    $ ssh-add ~/.ssh/id_rsa
    

    新的SSH密钥现在已经注册并准备好使用了!

分支

什么是分支

Git 分支本质上是一个独立的开发线。它将您的工作与其他团队成员的工作隔离开来。

image-20230529140907770

image-20230529140951104

创建分支

git branch issue1

image-20230529141047313

切换分支

git checkout issue1

对于新存储库,Git 默认将 HEAD 指向主分支。更改 HEAD 指向的位置将更新您当前的活动分支。

~(波浪号)和 ^(插入符号)符号用于指向相对于特定提交的位置。这些符号与提交引用一起使用,通常是 HEAD 或提交哈希。

image-20230529142453301

每当切换到工作树中具有未提交更改(或添加了新文件)的另一个分支时,这些未提交的更改也将传递到切换到的新分支。您提交的更改将提交到新切换的分支。

但是,如果 Git 发现新切换分支中的文件与上一个分支中的未提交更改之间存在冲突,则不允许切换到另一个分支。在切换分支之前,必须先提交或存储这些更改。可以使用如下命令进行暂存

git stash

合并分支

  • git merge
    保留对合并分支的所有更改和历史记录。在许多合并提交后,修订历史记录可能会变得复杂。
  • git rebase
    保持干净的修订历史记录,因为合并的提交附加到目标分支的末尾。冲突可能比合并方法更频繁地发生,需要立即解决。

image-20230529143023576

标记

Git 标记用于标记和标记历史记录中的特定提交。标记通常用于指示发布版本,其中版本名称(即 v1.0)是标记的名称。有两种类型的 Git 标记:

  • 轻量级标记
    轻量级标记类似于不会更改的分支。它只是直接指向历史记录中的特定提交。轻量级标签主要临时用于本地工作区。
  • 带注释的标记
    带注释的标记是校验和的,通常在您计划标记重要提交时使用。您可以添加注释、签名、日期以及标记者的姓名和电子邮件。

简单的工作流程

developer - review pr

开始

创建存储库

创建新的存储库

此示例假定你已有一个要在其中创建存储库的现有项目文件夹。

首先 cd 到根项目文件夹,然后执行 git init 命令。

cd /path/to/your/existing/code 
git init

以下命令具有同等效果

git init <project directory>

image-20230527100019061

克隆已有存储库

如果已在中央存储库中设置了项目,则可以使用git clone获取本地工作副本.

git clone <repo url>

Git 支持几种不同的网络协议和相应的 URL 格式。例如SSH,HTTP等

image-20230527100521011

代码提交

Git 不会自动保存您所做的每项更改。您必须通过暂存这些更改来告诉 Git 要记录哪些更改。暂存后,可以提交更改,以便将它们记录在存储库中。

image-20230527102658500

现在,您已经克隆或初始化了存储库,您可以向其提交文件版本更改。以下示例假定您已在 /path/to/project 处设置了一个项目。此示例中执行的步骤如下:

  • 将目录更改为 /path/to/project
  • 创建一个包含内容的新文件 hello.txt “hello git”
  • git 将 hello.txt 添加到存储库暂存区域
  • 创建一个新提交,其中包含一条消息,描述在提交中完成了哪些工作

image-20230527101911038

执行此示例后,存储库现在会将 hello.txt 添加到历史记录中,并将跟踪文件的未来更新。

git add

git add命令用于将文件的更改添加到暂存区(即将更改的文件添加到下一次提交中)。它将修改过的文件从工作目录添加到Git的暂存区,准备进行提交。使用git add可以选择性地将特定文件或整个目录添加到暂存区。

git commit

git commit命令用于将暂存区中的更改提交到本地代码仓库。提交操作将创建一个新的提交记录,该记录包含了暂存区中文件的当前状态。每次提交都需要包含一个描述性的提交消息,以便更好地描述所做的更改。

推送仓库

如果用 git clone 创建本地库,就可以用 git push 同步远程库。如果用 git init 创建本地库,就要先在托管服务上建远程库,再用 Git URL 链接本地库。

git remote

git remote add <remote_name> <remote_repo_url>

此命令会将 远程存储库映射到本地存储库中 。映射远程存储库后,可以将本地分支推送到该存储库。

git config

git config是一个命令行工具,用于配置Git安装或单个仓库的选项。这些选项可以影响Git的行为和外观,例如你的用户名、邮箱、文本编辑器、别名等。Git存储配置选项在三个不同的文件中,分别对应于本地仓库、用户或整个系统的设置。你可以用不同的标志来指定配置选项的作用范围,也可以直接编辑纯文本文件来修改。

配置文件:

  • 系统级:$(prefix)/etc/gitconfig。这里的选项对系统上所有用户和仓库都有效。使用–system标志来设置或读取这个文件中的选项。
  • 用户级:~/.gitconfig。这里的选项只对当前用户和他的所有仓库有效。使用–global标志来设置或读取这个文件中的选项。
  • 仓库级:.git/config。这里的选项只对当前仓库有效。使用–local标志或不使用任何标志来设置或读取这个文件中的选项。

当这些文件中的选项发生冲突时,本地设置会覆盖用户设置,用户设置会覆盖系统设置。如果你打开任何一个文件,你会看到类似以下内容:

[user]
    name = John Smith
    email = john@example.com
[alias]
    st = status
    co = checkout
    br = branch
    up = rebase
    ci = commit
[core]
    editor = vim

git push

git push -u <remote_name> <local_branch_name>

此命令会将 < local_branch_name > 下的本地存储库分支推送到 < remote_name > 的远程存储库。

差异分析

git diff

Git diff 是一个命令,它可以比较两个数据源,并显示它们之间的差异。数据源可以是提交、分支、文件等。例如,你可以使用 git diff 来:

  • 查看你已经修改但尚未暂存的变化(git diff)。
  • 查看你已经暂存但尚未提交的变化(git diff --staged)。
  • 查看两个提交之间的差异(git diff commit1 commit2)。
  • 查看两个分支之间的差异(git diff branch1 branch2)。
  • 查看你的工作目录和一个特定提交之间的差异(git diff commit)。

暂存更改

git stash

git stash 命令获取未提交的更改(暂存和未暂存),保存这些更改以供以后使用,然后从工作副本中还原它们。

您可以使用 git stash pop 重新应用以前隐藏的更改,会从存储中删除更改,并将它们重新应用于工作副本。

或者,您可以将更改重新应用于工作副本,并将它们保留在存储中,通过使用用 git stash apply

下图是关于git statsh命令作用文件的范围:

image-20230601162344522

忽略文件

Git 将工作副本中的每个文件视为以下三件事之一:

  • tracked: 先前已暂存或提交的文件;
  • untracked: 尚未暂存或提交的文件
  • ignored: 一个 Git 被明确告知忽略的文件。

忽略的文件通常是构建工件和计算机生成的文件,这些文件可以从存储库源派生,否则不应提交。一些常见的例子是:

  • 依赖项缓存,例如 /node_modules/packages 的内容
  • 编译的代码,例如 .o.pyc.class 文件
  • 生成输出目录,例如 /bin/out/target
  • 运行时生成的文件,例如 .log.lock.tmp
  • 隐藏的系统文件,例如 .DS_StoreThumbs.db
  • 个人 IDE 配置文件,例如 .idea/workspace.xml

.gitignore

.gitignore 是一个文件,用于指定 Git 应该忽略的文件。已经被 Git 跟踪的文件不受影响。

.gitignore 文件中的每一行都是一个匹配模式,可以使用通配符、前缀、后缀等规则来匹配文件或目录。

.gitignore 文件可以放在项目的根目录或任何子目录中,也可以放在 $GIT_DIR/info/exclude 或由 core.excludesFile 配置变量指定的文件中。

.gitignore 文件的作用是让 Git 忽略一些不需要版本控制的文件,比如编译生成的文件、临时文件、编辑器生成的文件等。

管理存储库

git status

git status 命令显示工作目录和暂存区域的状态。它使你能够查看哪些更改已暂存,哪些尚未暂存,以及哪些文件未被 Git 跟踪。状态输出不会显示有关已提交项目历史记录的任何信息。

git log

git log 命令显示已提交的快照。它允许您列出项目历史记录、对其进行过滤并搜索特定更改。

git tag

git tag是指向 Git 历史记录中特定点的引用。标记通常用于捕获用于标记版本(即 v1.0.1)的历史记录点。标签就像一个不会改变的分支。与分支不同,标签在创建后没有进一步的提交历史记录。

撤销变更

Git 最有价值的功能之一是能够撤消错误。当您进行新提交时,Git 会存储项目的快照,以便您可以在需要时返回到早期版本。

git checkout

git checkout用于切换工作目录到指定的分支、标签或提交记录。

如下: 根据一个历史提交,签出一个新的分支

git checkout -b new_branch_without_crazy_commit

git revert

image-20230527104616212

git revert 命令是一种向前移动的撤消操作,它提供了一种撤消更改的安全方法。还原不会删除或孤立提交历史记录中的提交,而是创建一个新的提交,该提交将反向更改指定的提交记录。

示例

image-20230527110259587

我们对存储库进行了 3 次提交,其中我们添加了一个文件 1.txt 并修改了两次其内容。在存储库设置过程结束时,我们传入了 HEAD 引用。这将还原最新的提交。Git revert 期望传入一个提交引用,如果没有提交引用,则不会执行。可以看到执行完成之后,状态回到了上一步提交时.

参数

  • -e –edit : 这是一个默认选项,不需要指定。此选项将打开配置的系统编辑器,并提示您在提交还原之前编辑提交消息
  • –no-edit : 这是 -e 选项的反转。还原不会打开编辑器。
  • -n –no-commit : 传递此选项将阻止 git revert 创建反向提交目标提交的新提交。此选项不会创建新的提交,而是将反向更改添加到暂存索引和工作目录。

git reset

image-20230527104643300

有三种重置模式:

  • Mixed(default)
    移动Head指针,并重置暂存区,当保留工作目录的更改
  • Soft
    只移动Head指针,不改变暂存区和工作目录
  • Hard
    移动Head指针,并且重置暂存区和工作目录,丢弃所有未提交的更改

image-20230529092512688

示例

假设你有一个Git仓库,里面有三个提交,分别是A,B和C,如下图所示:

image

现在你的HEAD和main分支都指向C,你的暂存区和工作目录都和C一致。如果你想回退到B,你可以用不同的reset模式来实现:

  • 如果你用–soft模式,那么只有HEAD会移动到B,而main分支,暂存区和工作目录都不变,如下图所示:

image

这样的话,你可以重新提交C的更改,或者添加其他更改到暂存区。

  • 如果你用–mixed模式(默认),那么HEAD和main分支都会移动到B,暂存区也会重置为B的状态,但工作目录不变,如下图所示:

image

这样的话,你可以重新暂存C的更改,或者放弃它们。

  • 如果你用–hard模式,那么HEAD,main分支,暂存区和工作目录都会移动到B,C的更改会被丢弃,如下图所示:

image

这样的话,你就彻底回退到了B的状态,无法恢复C的更改。

希望这个示例能帮助你理解reset三种模式的区别。

git reset与git revert的区别

  • git revert是一种安全的方式来撤销已经发布的提交,它会创建一个新的提交来逆转之前的更改
  • git reset是一种危险的方式来撤销本地的提交或更改,他会完全删除一个变更集,可能导致数据丢失
  • git revert适合于公共分支,git reset适合私有分支或者实验性分支

git clean

git clean是一个用于删除工作目录中未跟踪文件的命令。未跟踪文件是指在工作目录中创建但没有使用git add添加到Git索引的文件。git clean可以与git reset和git checkout等命令配合使用,以撤销对仓库的修改。

  • git clean -n:这个命令会列出工作目录中将要被删除的未跟踪文件,但不会真正删除它们。这是一个干运行,可以用来检查删除的文件是否正确。
  • git clean -f:这个命令会强制删除工作目录中的未跟踪文件。这是一个危险的操作,因为一旦删除,文件就无法恢复。在使用这个命令之前,最好先备份文件或使用干运行选项。
  • git clean -d:这个命令会删除工作目录中的未跟踪目录,以及它们包含的文件。如果不使用这个选项,git clean只会删除未跟踪的文件,而保留空的目录。
  • git clean -i:这个命令会进入交互式模式,让用户选择要删除的文件或目录。用户可以输入不同的过滤条件,如扩展名、大小、时间等,来筛选要删除的文件。用户还可以预览删除的结果,或取消删除操作。
  • git clean -x:这个命令会删除工作目录中所有的未跟踪文件,包括那些被.gitignore文件忽略的文件。如果不使用这个选项,git clean只会删除那些没有被忽略的未跟踪文件。

git rm

git rm 命令可用于删除单个文件或文件集合。 git rm 的主要功能是从 Git 索引中删除跟踪的文件。

同步存储库

远程仓库允许我们与团队的其他成员共享我们的更改。它们可以位于私人服务器上,也可以位于与您的计算机不同的计算机上,或者使用积压工作等服务托管。无论您的仓库托管在何处,您都需要能够经常将本地仓库与远程仓库同步。您将使用三个命令执行此操作:git push、git pull 和 git merge。

git pull

执行拉取时,最新的修订历史记录将从远程存储库下载并导入到本地存储库。

image-20230529104050805

git push

为了开始与他人共享更改,您必须使用“push”命令将它们推送到远程存储库。

image-20230529104347741

git merge

如果您的本地仓库未更新,则推送到远程仓库将被拒绝

image-20230529104143719

如果是这种情况,您必须使用 git merge 命令从远程存储库获取最新更改,然后才能允许推送。Git 强制执行此操作以确保其他成员所做的更改保留在历史记录中。

image-20230529104233174

git remote

git remote 命令允许您创建、查看和删除与其他存储库的连接。

  • git remote add
    创建与远程存储库的新连接。
  • git remote rm
    删除与名为 <name> 的远程存储库的连接。
  • git remote rename
    将远程连接从 <old-name> 重命名为 <new-name>

git fetch

git fetch 命令将提交、文件和引用从远程存储库下载到本地存储库中。它不会强迫您将更改实际合并到存储库中。Git 将获取的内容与现有的本地内容隔离开来;它绝对不会影响您当地的开发工作。

变更历史提交

git commit –amend

可以通过运行 git commit –amend 来修改同一分支中的最新提交。此命令便于将新的或更新的文件添加到以前的提交中。这也是编辑或向上一次提交添加注释的简单方法。

image-20230529110320003

git rebase

rebase是将提交到一个分支的所有更改应用到新分支的过程。运行 git rebase 并添加 -i 选项以重写、替换、删除和合并历史记录中的单个提交。您还可以:

  • 重写过去的提交消息
  • 将一组提交压缩在一起
  • 添加尚未提交的文件

image-20230529110535662

git cherry pick

将另一个分支中的现有提交应用到存储库中的当前分支

image-20230529111141457

git merge -squash

压缩是将多个提交合并为单个提交的过程。

image-20230529111406929

参考地址

微信支付码 微信支付
支付宝支付码 支付宝支付