跳转至

版本控制 —— Git

Git 是一个版本控制系统,它被广泛用于协作软件开发项目。通过 Git,开发者可以跟踪文件的变化,协调多人对同一代码库的修改,以及回滚到之前的版本。它是一个分布式版本控制系统,意味着每个开发者都可以在本地拥有完整的代码仓库,并可以独立地工作,而不受网络连接的限制。

Git 的诞生背景

Git 是由 Linus Torvalds 于 2005 年开始开发的,最初是为了管理 Linux 内核开发而创建的。当时,Linux 内核开发团队使用的分布式版本控制系统 BitKeeper 出现了争议,因此 Torvalds 决定开发一个新的系统。Torvalds 在设计 Git 时借鉴了许多现有版本控制系统的优点,并为其加入了许多新特性。Git 的设计目标之一是速度,它能够在处理大型项目时保持高效。

Git 于 2005 年正式发布,很快就受到了开源社区的欢迎。随着时间的推移,Git 逐渐成为了最流行的版本控制系统之一,被广泛应用于软件开发和其他领域。 Git 拥有庞大的开发者社区,许多开源项目和商业项目都选择使用 Git 进行版本控制。此外,许多网站和服务,如 GitHub、GitLab 和 Bitbucket,提供 Git 仓库托管和协作工具,进一步推动了 Git 生态系统的发展。

Git 持续得到改进和发展,定期发布新版本以提供更好的性能、功能和安全性。同时,Git 也受到了许多其他版本控制系统的影响,并在不断地与其他工具和平台集成,以适应不断变化的开发需求。

Git 的优势和用途

Git 是一个强大的分布式版本控制系统,具有许多优势和广泛的用途。

Git 的优势

  1. 分布式版本控制:每个开发者都拥有本地的完整版本库,可以在没有网络连接的情况下工作。这种架构使得协作更加灵活和高效。
  2. 版本管理:Git 可以跟踪文件的每一次修改,轻松查看历史版本、比较差异并回滚到任意版本。这有助于团队协作和代码管理。
  3. 分支管理:Git 的分支操作非常快速和便捷,可以轻松创建、合并和删除分支,支持并行开发和实现复杂的工作流程。
  4. 高效性能:Git 的设计目标之一是高效性能,即使处理大型项目和大量历史数据,仍能保持速度快。
  5. 灵活性:Git 具有强大的配置选项和可扩展性,可以根据团队或项目的需求进行定制和扩展。
  6. 开源社区:Git 是开源的,拥有庞大的社区支持和活跃的开发者,可以获取大量的工具、插件和支持。

Git 的用途

  1. 版本控制:主要用于跟踪和管理软件开发过程中的代码变更,保证团队协作的效率和代码质量。
  2. 协作开发:多人协作开发同一项目时,Git 提供了分支管理和合并功能,支持团队并行开发不同功能或修复不同 bug。
  3. 代码备份:通过 Git,开发者可以轻松地将代码推送到远程仓库,实现代码的备份和跨设备同步。
  4. 版本发布:Git 可以用于管理项目的发布版本,记录每个版本的变更内容,方便回滚和追溯发布历史。
  5. 持续集成/持续部署 (CI/CD):许多 CI/CD 工具(如 Jenkins、GitLab CI)都与 Git 集成,用于自动化构建、测试和部署流程。

Q:什么是 CI 和 CD?

CI(持续集成)和 CD(持续部署/交付)是软件开发中常用的两个术语。CI 是一种软件开发实践,旨在通过频繁地将代码变更集成到共享存储库中,并自动运行构建和测试流程,以尽早地发现和解决集成问题。

CD 是一种软件开发实践,通过自动化流程将代码从版本控制系统部署到生产环境中。持续部署指的是每次通过 CI 测试后,自动将代码部署到生产环境;而持续交付则是将代码部署到可被测试的环境,但需要人工触发将代码部署到生产环境。

CI 关注的是代码集成和自动化测试,以保证代码质量和稳定性。CD 则更进一步,关注的是代码的自动化部署和交付,以实现快速、可靠地将功能交付给用户。

安装 Git

在 Windows 上安装 Git

在 Windows 上安装 Git 非常简单,你可以按照以下步骤操作:

  1. 下载 Git 安装程序

  2. 运行安装程序

    • 打开下载的安装程序(通常是一个 .exe 文件)。
    • 根据安装向导的提示,选择安装语言、安装路径等选项。
  3. 选择安装选项

    • 在安装选项中,通常可以选择是否将 Git 添加到系统的 PATH 环境变量中。建议选择此选项,这样可以在命令行中直接使用 Git 命令。
  4. 完成安装

    • 等待安装程序完成安装过程,可能需要一些时间。
    • 安装完成后,可以在开始菜单中找到 Git Bash(一个基于 Bash 的命令行工具),也可以在 Windows 资源管理器中右键点击文件夹空白处,选择 "Git Bash Here" 以在当前文件夹中打开 Git Bash。
  5. 验证安装

    • 打开命令提示符或 Git Bash,运行以下命令验证 Git 是否成功安装:
      git --version
      
    • 如果安装成功,将显示安装的 Git 版本信息。

安装完成后,你就可以在 Windows 上使用 Git 了,可以通过命令行或者 Git 图形界面工具进行版本控制操作。

在 Linux 上安装 Git

在 Linux 上安装 Git 也非常简单,具体步骤如下:

  1. 使用包管理器安装

    • 大多数 Linux 发行版都包含 Git 在其默认软件仓库中,因此你可以使用你的包管理器来安装它。

    • 对于 Debian/Ubuntu 等基于 Debian 的系统,可以使用以下命令安装:

    sudo apt install git
    
    • 对于 Fedora 等基于 RPM 的系统,可以使用以下命令安装:
    sudo yum install git
    

    或者

    sudo dnf install git
    
  2. 从源代码编译安装(可选):

    • 如果你想要安装 Git 的最新版本或者你的发行版没有提供预编译的包,你也可以选择从源代码编译安装 Git。

    • 首先,你需要安装一些编译 Git 所需的依赖项。这些依赖项通常包括 gccmakelibssl-dev(或类似的包)等。

    • 然后,从 Git 的官方网站下载源代码包(https://git-scm.com/download/linux)。

    • 解压源代码包并进入解压后的目录,然后执行以下命令进行编译和安装:

    make prefix=/usr/local all
    sudo make prefix=/usr/local install
    
  3. 验证安装

    • 安装完成后,打开终端并运行以下命令验证 Git 是否成功安装:
    git --version
    
    • 如果安装成功,将显示安装的 Git 版本信息。

安装完成后,你就可以在 Linux 上使用 Git 了,可以通过终端进行版本控制操作。

在 Mac 上安装 Git

在 macOS 上安装 Git 也非常简单,你可以按照以下步骤操作:

  1. 使用 Homebrew 安装(推荐):

    • 如果你已经安装了 Homebrew,那么只需在终端中运行以下命令即可安装 Git:
      brew install git
      
  2. 从官方网站下载安装程序

    • 访问 Git 官方网站的下载页面:https://git-scm.com/download/mac
    • 点击下载链接,下载最新版本的 Git for Mac 安装程序。
    • 下载完成后,双击下载的 .dmg 文件并按照提示进行安装。
  3. 通过 Xcode Command Line Tools 安装

    • 如果你已经安装了 Xcode Command Line Tools,那么 Git 应该已经包含在其中了。你可以在终端中运行以下命令来检查是否已安装 Git:
      git --version
      
    • 如果没有安装,系统会提示你安装 Xcode Command Line Tools。
  4. 验证安装

    • 安装完成后,打开终端并运行以下命令验证 Git 是否成功安装:
      git --version
      
    • 如果安装成功,将显示安装的 Git 版本信息。

安装完成后,你就可以在 macOS 上使用 Git 了,可以通过终端进行版本控制操作。

Git 基础知识

Git 基本概念

  1. 版本控制系统(Version Control System,VCS):版本控制系统是一种记录文件内容变化的系统,它可以帮助团队协作开发,并追踪文件的修改历史。
  2. 仓库(Repository):Git 仓库是存储项目代码及其历史记录的地方。可以是本地仓库(在你的计算机上)或远程仓库(托管在互联网上的服务器上)。
  3. 提交(Commit):提交是对仓库中文件修改的保存操作。每次提交都会生成一个唯一的标识符,用于标识这次修改。
  4. 分支(Branch):分支是 Git 中用来开发新功能或修复 bug 的独立线路。它允许你在不影响主线(通常是 master 分支)的情况下进行修改和实验。
  5. 合并(Merge):合并是将一个分支的修改内容合并到另一个分支的操作。通常用于将一个开发中的特性分支合并到主分支上。
  6. 远程仓库(Remote Repository):远程仓库是托管在网络服务器上的 Git 仓库,它可以被多个开发者访问和修改。常见的远程仓库托管服务有 GitHub、GitLab 和 Bitbucket。
  7. 拉取(Pull):拉取是将远程仓库的更新同步到本地仓库的操作。通常包括获取远程仓库的最新修改并合并到本地分支上。
  8. 推送(Push):推送是将本地仓库的更新上传到远程仓库的操作。通常用于分享自己的修改和提交。
  9. 冲突(Conflict):冲突是指在合并分支或拉取更新时,Git 无法自动解决的修改冲突。需要开发者手动解决冲突后才能继续操作。
  10. 标签(Tag):标签是用于标记重要的提交或版本的快照,通常用于发布版本或里程碑。

工作区

Git 中的工作区、暂存区、仓库区(本地仓库)、远程仓库之间的关系可以描述为一个多层次的版本控制系统,涵盖了文件的编辑、暂存、提交、同步等操作。

  1. 工作区(Working Directory):

    • 工作区是您当前正在进行编辑和修改文件的目录,即项目的实际文件系统。
    • 您对工作区中的文件进行的修改只存在于工作区,还未被 Git 管理或跟踪。
  2. 暂存区(Staging/Index Area):

    • 暂存区是 Git 仓库内部的一个虚拟空间,用于临时存放即将提交到版本历史的修改。
    • 当您使用 git add 命令将工作区中的文件添加到暂存区时,Git 会将文件的当前状态快照保存到暂存区中。
  3. 仓库区(本地仓库,Repository):

    • 仓库区是 Git 仓库中存储项目文件和历史记录的地方,包含了项目的所有文件及其各个版本的快照。
    • 您通过 git commit 命令将暂存区中的修改提交到本地仓库中,形成一个新的版本。
  4. 远程仓库(Remote Repository):

    • 远程仓库是位于网络上的另一个 Git 仓库,用于多人协作开发、备份和同步项目。
    • 您可以将本地仓库的修改推送(git push)到远程仓库,也可以从远程仓库拉取(git pull)最新的修改到本地仓库中。

他们的关系概括:

  • 工作区:您实际操作和编辑的项目文件所在的目录。
  • 暂存区:存放即将提交的文件快照的虚拟空间。
  • 本地仓库:存储项目完整历史记录的地方,通过提交将修改保存到本地仓库。
  • 远程仓库:多人协作、备份和同步项目的网络上的 Git 仓库,与本地仓库通过推送和拉取进行交互。

这些区域之间的交互和管理,使得 Git 成为了一个强大的版本控制系统,支持团队协作和项目管理。

Git 工作区
Git 工作区

创建一个新的 Git 仓库

要创建一个新的 Git 仓库,你可以按照以下步骤进行操作:

  1. 在本地创建新目录

    • 打开终端,并使用 mkdir 命令创建一个新的目录,作为你项目的根目录。例如:
      mkdir my_project
      
  2. 进入新目录

    • 使用 cd 命令进入你刚创建的目录。例如:
      cd my_project
      
  3. 初始化 Git 仓库

    • 使用 git init 命令在当前目录下初始化一个新的 Git 仓库。这将在当前目录下创建一个 .git 文件夹,用于存储 Git 的版本控制信息。例如:
      git init
      

添加和提交文件

添加文件

  • 将你的项目文件复制或移动到新创建的目录中。

  • 使用 git add 命令将这些文件添加到 Git 的暂存区。例如:

git add .

这将添加当前目录下的所有文件。如果你只想添加特定文件,可以使用文件名代替 .

提交更改

  • 使用 git commit 命令提交添加到暂存区的文件。例如:
git commit -m "Initial commit"

这将创建一个新的提交,并添加一条提交信息,描述本次提交的内容。

查看项目状态

要查看项目的状态,即了解哪些文件已修改、已暂存和未跟踪,可以使用 git status 命令。在你的项目目录中运行以下命令:

git status

这将显示当前 Git 仓库的状态信息,包括:

  • 修改过的文件
  • 已暂存的文件
  • 未跟踪的文件
  • 当前所在的分支
  • 等待被提交的修改等信息

通过查看状态信息,你可以了解项目当前的状态,并决定下一步的操作。

查看提交历史

要查看提交历史,可以使用 git log 命令。在你的项目目录中运行以下命令:

git log

这将显示项目的提交历史,包括每个提交的详细信息,如提交者、提交日期、提交信息等。默认情况下,git log 会按时间顺序列出所有提交,最新的提交会显示在最上面。

如果你只想查看最近几次的提交,你可以使用 git log -n 命令,其中 -n 是你想要查看的提交数量。例如,要查看最近的五次提交,你可以运行:

git log -5

你也可以使用 git log --oneline 命令来只显示每个提交的简要信息,例如提交的哈希值和提交信息,更加紧凑。

添加忽略

要忽略特定文件或文件夹,可以使用 .gitignore 文件。这个文件告诉 Git 哪些文件或文件夹不应该被跟踪或提交到版本控制中。创建 .gitignore 文件并将要忽略的文件或文件夹名称添加到其中,每行一个。

例如,如果要忽略所有 .log 文件和 node_modules 文件夹,可以这样写 .gitignore 文件:

*.log
  node_modules/

然后将 .gitignore 文件添加到项目的根目录中,并提交到 Git 仓库中:

git add .gitignore
git commit -m "Add .gitignore file to ignore log files and node_modules folder"

现在 Git 将忽略 .log 文件和 node_modules 文件夹的变更。

忽略规则

.gitignore 文件中的忽略规则遵循一定的模式匹配规则,可以使用以下语法:

  1. 通配符:

    • *:匹配零个或多个字符。
    • ?:匹配任意一个字符。
    • []:匹配括号内的任何一个字符。例如,[abc] 匹配字符 a、b 或 c。
    • !:在模式前加上感叹号表示取反,即不匹配该模式。
  2. 斜杠:

    • 斜杠 / 用于指定匹配路径的位置。在开头表示仅匹配项目根目录下的文件或文件夹,而在结尾表示匹配文件夹。
  3. 注释:

    • 使用 # 开头的行表示注释,将被 Git 忽略。
  4. 行内的空白:

    • 行内的空白会被忽略。
  5. 行内的转义字符:

    • 如果需要匹配特殊字符本身,可以使用反斜杠 \ 进行转义。

示例:

  • *.log:忽略所有以 .log 结尾的文件。
  • /logs/:忽略根目录下的 logs 文件夹。
  • !important.log:不忽略 important.log 文件,即使其他 .log 文件被忽略。
  • *.txt:忽略所有以 .txt 结尾的文件。
  • debug/*.log:只忽略 debug 文件夹下的 .log 文件。
  • build/:忽略根目录下的 build 文件夹及其内容。
  • /*.txt:只忽略根目录下的 .txt 文件,而不包括子目录中的同名文件。

通过这些规则,可以灵活地配置 .gitignore 文件,以满足项目中的特定需求,并确保不会将不必要的文件提交到版本控制中。

重新生效

.gitignore 文件提交后,再次修改时,通过如下的方式使其生效:

git rm -r --cached .                       # 清除缓存 
git add .                                  # 追踪文件
git commit -m "更新.gitignore"              # 注释提交 
git push origin master                     # 推送远程

分支管理

什么是分支

分支(Branch)是 Git 中的一个重要概念,它是指在版本控制中用来开发新功能、修复 bug 或者进行实验性工作的独立工作线路。

每个 Git 仓库都有默认的主分支,通常被称为 master 分支(尽管现在更推荐使用 main 分支作为主分支的名称)。除了主分支外,你可以创建任意数量的分支来并行开发不同的功能或解决不同的问题。

创建分支后,你可以在分支上进行修改和提交,而不会影响到主分支或其他分支。这允许团队成员在不干扰彼此的情况下独立开展工作。一旦在分支上的工作完成,你可以将其合并回主分支,以整合新的更改。

分支在 Git 中具有轻量级和低成本的特点,因此创建、切换、合并和删除分支都是非常快速和简便的。这使得分支成为了管理复杂项目和团队协作开发的强大工具。

创建和切换分支

要创建和切换分支,你可以按照以下步骤进行操作:

  1. 创建分支

    • 使用 git branch 命令创建新的分支。例如,要创建一个名为 feature 的新分支,你可以运行:
      git branch feature
      
  2. 切换到新分支

    • 使用 git checkout 命令切换到新创建的分支。例如,要切换到 feature 分支,你可以运行:
      git checkout feature
      
      或者,你也可以使用 git switch 命令来完成相同的操作:
      git switch feature
      

或者,你也可以使用 git checkout -b 命令来一次性创建并切换到新分支。例如,要创建并切换到名为 feature 的新分支,你可以运行:

git checkout -b feature

这样就成功创建了一个名为 feature 的新分支,并切换到了该分支上,现在你可以在这个分支上进行修改和提交。

合并分支

要合并分支,你可以使用 git merge 命令。以下是合并分支的基本步骤:

  1. 切换到目标分支: 首先,确保你已经切换到你想要将其他分支合并到其中的目标分支。例如,如果你想要将 feature 分支合并到 main 分支,你需要先切换到 main 分支:

    git checkout main
    

  2. 合并分支: 使用 git merge 命令将其他分支合并到目标分支中。例如,要将 feature 分支合并到 main 分支,你可以运行:

    git merge feature
    
    这将把 feature 分支中的更改合并到 main 分支中。

  3. 解决冲突(如果有必要): 如果合并过程中发生了冲突,Git 将提示你解决冲突。你需要手动解决这些冲突,并提交解决方案。在解决冲突后,运行 git merge --continue 继续合并操作。

  4. 提交合并: 一旦合并完成,你需要提交合并结果。如果没有冲突,Git 将会自动创建一个合并提交。你可以运行 git log 来查看合并提交的历史记录。

通过这些步骤,你就可以成功合并分支到目标分支中了。记得在合并分支之前,先确保你的工作目录是干净的,没有未提交的修改。

解决冲突

在合并操作中,Git 会提示你发生了冲突,并告诉你哪些文件发生了冲突。你可以运行 git status 来查看有冲突的文件列表。

解决 Git 合并冲突通常需要以下步骤:

  1. 打开冲突文件: 使用文本编辑器打开包含冲突的文件。在文件中,你会看到类似以下内容的标记:

    <<<<<<< HEAD
    // 代码来自目标分支(通常是当前所在分支,例如 main 分支)
    =======
    // 代码来自要合并的分支(例如 feature 分支)
    >>>>>>> feature
    

  2. 解决冲突

    • 手动解决冲突:根据标记,手动编辑文件以保留你希望保留的更改,并删除你不需要的部分。确保删除 Git 自动生成的冲突标记。
    • 合并工具解决冲突:你也可以使用合并工具(如 Visual Studio Code、GitKraken 等)来帮助解决冲突。
  3. 标记为已解决: 一旦你解决了冲突,保存文件并将其标记为已解决。

  4. 添加已解决的文件: 运行 git add 命令将已解决的文件标记为已解决状态。例如:

    git add <冲突文件>
    

  5. 继续合并: 运行 git merge --continue 继续合并操作。

  6. 提交合并: 如果没有其他冲突,合并操作完成后,运行 git commit 提交合并结果。如果 Git 自动生成了合并提交信息,请确保审查并编辑提交信息以确保准确反映合并的内容。

通过这些步骤,你应该能够成功解决 Git 合并冲突。记得在解决冲突之后及时提交你的更改。

远程仓库

配置 Git 信息

如果第一次使用 Git 需要配置个人的信息:

# git config  user.name 你的目标用户名
# git config  user.email 你的目标邮箱名
# 这种配置方式只有在当前仓库生效
git config user.name shuaige
git config user.email 669104343@qq.com

# 可以使用--global参数,配置全局的用户名和邮箱,这样别的git仓库就不需要重新配置了。
# 如果同时配置了局部的和全局的,那么局部的用户名和邮箱将会生效。
git config  --global user.name shuaige
git config  --global user.email 669104343@qq.com

# 查看配置信息
git config --list

生成密钥对

Git 密钥对由公钥和私钥组成,用于在您的本地系统和远程 Git 服务器之间进行安全通信和身份验证。下面是创建和使用 Git 密钥对的一般步骤:

  1. 创建 SSH Key: 运行以下命令生成 SSH 密钥对:
ssh-keygen -t rsa
  1. 找到 SSH 密钥文件夹: 在 Windows 系统中,默认情况下,SSH 密钥存储在 C:\Users\YourUsername\.ssh 文件夹中。

  2. 确认密钥文件:.ssh 文件夹中,您会找到两个文件:

    • 私钥:id_rsa
    • 公钥:id_rsa.pub
  3. 添加公钥到 GitHub: 登录到 GitHub 并导航到 Settings -> SSH and GPG keys 页面,然后点击“New SSH key”按钮。 在弹出的窗口中,将您的公钥文件 id_rsa.pub 中的内容复制并粘贴到文本框中,并为此 SSH 密钥起一个易于识别的标题。

  4. 验证 SSH 连接: 您可以通过运行以下命令来验证 SSH 连接是否正常:

ssh -T git@github.com

如果一切设置正确,您将看到一条消息表明认证成功。

  1. 使用 SSH 进行 Git 操作: 从现在开始,您可以使用 SSH URL (git@github.com:username/repository.git) 来克隆、推送或拉取 GitHub 上的仓库,而无需每次输入用户名和密码进行身份验证。

通过这些步骤,您已经成功设置了 SSH 密钥对,并且可以安全地与 GitHub 进行通信,确保了代码传输的安全性和便捷性。

添加远程仓库

要将远程仓库添加到你的本地仓库中,你可以按照以下步骤操作:

  1. 获取远程仓库地址: 首先,你需要知道远程仓库的地址。通常,这是一个 URL,类似于 https://github.com/user/repo.git

  2. 添加远程仓库: 运行以下命令将远程仓库添加到你的本地仓库中:

    git remote add <remote_name> <remote_url>
    
    其中 <remote_name> 是你为远程仓库指定的名称,通常是 origin<remote_url> 是远程仓库的地址。例如:

git remote add origin https://github.com/user/repo.git
  1. 验证远程仓库: 运行以下命令验证远程仓库是否成功添加:
    git remote -v
    

这将列出所有已添加的远程仓库及其 URL。

一旦完成这些步骤,你的本地仓库就与远程仓库建立了连接。你可以使用 git pullgit push 等命令来与远程仓库进行交互。

从远程仓库拉取更新

要从远程仓库拉取更新,你可以使用 git pull 命令。以下是具体步骤:

  1. 确保当前分支:确保你在要更新的分支上。你可以使用 git branch 命令来查看当前所在的分支以及可用的分支列表。

  2. 拉取更新:运行以下命令来拉取远程仓库的更新:

    git pull origin <branch>
    
    其中 <branch> 是你要更新的远程分支的名称。如果你当前在本地的 main 分支,并且想要拉取远程仓库的 main 分支更新,可以运行以下命令:
    git pull origin main
    

  3. 解决冲突(如果有):如果拉取操作引发了冲突,你需要按照之前提到的步骤来解决冲突。

  4. 提交解决方案(如果有冲突):一旦解决了冲突,将更改提交到本地仓库。

  5. 推送更改(可选):如果你在解决冲突后做了更改,并且希望将这些更改推送到远程仓库,可以使用 git push 命令。

通过这些步骤,你可以从远程仓库拉取更新到你的本地仓库中。

推送到远程仓库

要将本地更改推送到远程仓库,你可以使用 git push 命令。以下是具体步骤:

  1. 确保当前分支:确保你在要推送更改的分支上。你可以使用 git branch 命令来查看当前所在的分支以及可用的分支列表。

  2. 提交本地更改:首先,确保你已经将本地的更改提交到本地仓库。你可以使用 git add 命令添加要提交的更改,然后使用 git commit 命令提交更改。

  3. 推送更改:运行以下命令将本地更改推送到远程仓库:

    git push origin <branch>
    
    其中 <branch> 是你要推送到远程仓库的分支名称。如果你想要将当前分支的更改推送到远程仓库,可以简单地运行:
    git push origin
    

  4. 验证推送:成功推送后,你可以在远程仓库中查看更新。

通过这些步骤,你可以将本地仓库的更改推送到远程仓库中。

解决推送冲突

当你推送更改到远程仓库时,如果其他人已经向远程仓库推送了与你的更改冲突的更改,就会发生推送冲突。要解决这种冲突,你可以按照以下步骤操作:

  1. 拉取远程更新:首先,拉取远程仓库的更新到你的本地仓库。这可以通过运行以下命令来完成:

    git pull origin <branch>
    
    其中 <branch> 是你当前所在的分支名称。

  2. 解决冲突:拉取操作可能会引发冲突,Git 会在文件中标记出冲突的部分。你需要手动编辑这些文件,解决冲突。一旦解决了所有冲突,你可以将文件保存,并继续下一步。

  3. 提交解决方案:一旦你解决了冲突,将更改提交到本地仓库。你可以使用 git addgit commit 命令提交解决冲突后的更改。

  4. 推送更改:现在,你可以再次尝试推送更改到远程仓库。运行以下命令:

    git push origin <branch>
    
    确保将 <branch> 替换为你当前所在的分支名称。

  5. 验证推送:成功推送后,你可以在远程仓库中查看更新。

通过这些步骤,你应该能够成功解决并推送推送冲突。

高级 Git

标签

为 Git 仓库添加标签(Tag)通常用于标识项目的重要版本、发布或里程碑。以下是在 Git 中管理标签的基本步骤:

创建标签

  1. 列出现有标签:首先,你可以使用以下命令列出当前已有的标签:
git tag
  1. 创建轻量标签:轻量标签只是指向特定提交的指针,不包含额外的信息。使用以下命令创建轻量标签:

    git tag <tag_name>
    
    其中 <tag_name> 是你给标签取的名称。

  2. 创建附注标签:附注标签可以包含更多信息,比如标签创建者、日期和注释。使用以下命令创建附注标签:

    git tag -a <tag_name> -m "Tag message"
    
    这会创建一个包含注释信息的标签。

查看标签信息

  • 要查看特定标签的详细信息,可以运行:
    git show <tag_name>
    

推送标签到远程仓库

  1. 推送单个标签:要将单个标签推送到远程仓库,可以使用以下命令:

    git push origin <tag_name>
    
    其中 <tag_name> 是要推送的标签名称。

  2. 推送所有标签:如果想要推送所有标签到远程仓库,可以运行:

    git push origin --tags
    

删除标签

  • 要删除本地标签,可以使用以下命令:
    git tag -d <tag_name>
    
  • 要删除远程仓库上的标签,可以运行:
    git push origin --delete <tag_name>
    

通过这些命令,你可以管理 Git 仓库中的标签。

子模块

Git 子模块(Submodule)允许你将一个 Git 仓库作为另一个 Git 仓库的子目录引入。这在管理项目依赖或者包含其他项目的特定版本时非常有用。以下是如何使用 Git 子模块的基本步骤:

添加子模块

  1. 初始化子模块:在父仓库中,使用以下命令初始化子模块:

    git submodule add <repository_url> <path>
    
    其中 <repository_url> 是子模块仓库的 URL,<path> 是子模块在父仓库中的路径。

  2. 提交更改:添加子模块后,需要将更改提交到父仓库:

    git add .
    git commit -m "Add submodule <name>"
    

更新子模块

  • 当子模块仓库有更新时,你可以在父仓库中更新子模块:
    git submodule update --remote
    

克隆包含子模块的仓库

  • 当你克隆一个包含子模块的仓库时,可以使用以下命令来同时初始化和更新子模块:
    git clone --recurse-submodules <repository_url>
    

移除子模块

  1. 删除子模块:在父仓库中删除子模块的引用:

    git submodule deinit -f -- <path>
    rm -rf .git/modules/<path>
    git rm -f <path>
    
    其中 <path> 是子模块在父仓库中的路径。

  2. 提交更改:完成删除操作后,提交更改到父仓库:

    git commit -m "Remove submodule <name>"
    

通过这些步骤,你可以有效地管理 Git 仓库中的子模块,包括添加、更新和移除子模块。

重写历史

重写 Git 历史是一种修改提交历史的方法,通常用于整理提交记录、修改提交信息或者合并提交。这可以通过以下几种方式实现:

修改最近一次提交

git commit --amend

这个命令允许你修改最近一次提交的提交信息或者添加缺失的文件。它会打开一个文本编辑器,让你修改提交信息。

交互式重写历史

git rebase -i <commit>

这个命令可以让你进入交互式的重新基于某一提交进行重写历史的模式。你可以合并、修改、删除提交记录,以及重新排列提交的顺序。

过滤提交

git filter-branch

这个命令允许你使用自定义脚本过滤提交历史。它可以帮助你删除特定文件、修改提交信息等。

使用 git reset

git reset --soft HEAD~<n>

这个命令可以将最近的 n 个提交回退到工作目录,并保留这些更改的暂存状态,允许你修改提交信息后重新提交。

使用 git cherry-pick

git cherry-pick <commit>

这个命令可以将指定提交应用到当前分支,相当于重新提交这个提交,但不会修改历史记录。

在执行任何重写历史的操作之前,请确保你理解这些命令的含义以及它们可能产生的影响。重写历史可能会改变提交的哈希值,因此在与他人协作时需要小心谨慎。

Hooks

Git hooks 是在特定事件发生时自动执行的脚本,它们允许你自定义 Git 的行为。这些事件可以是提交代码、推送代码、合并分支等等。Git 提供了一些预定义的钩子,它们存储在 .git/hooks/ 目录下,你可以在那里创建自定义的脚本文件来响应这些事件。

以下是一些常见的 Git 钩子:

  1. pre-commit:在执行提交前运行,可以用于检查即将提交的更改,例如运行代码风格检查、单元测试等。

  2. prepare-commit-msg:在提交信息被编辑器编辑之前运行,可以用于修改提交信息的模板或添加自定义信息。

  3. post-commit:在提交成功后运行,可以用于通知团队成员或者执行其他后续操作。

  4. pre-push:在推送到远程仓库之前运行,可以用于运行额外的检查或测试。

  5. post-receive:在远程仓库接收到推送后运行,可以用于触发自动部署或其他服务器端操作。

  6. pre-rebase:在执行变基操作前运行,可以用于执行变基前的检查或准备工作。

  7. post-merge:在执行合并操作后运行,可以用于触发自动构建或其他后续操作。

要创建一个钩子,只需在 .git/hooks/ 目录下创建一个同名的可执行文件,并编写相应的脚本代码。例如,要创建一个 pre-commit 钩子,你可以执行以下步骤:

  1. 进入你的 Git 仓库目录。
  2. 进入 .git/hooks/ 目录。
  3. 创建一个名为 pre-commit 的可执行文件,例如:
    touch pre-commit
    
  4. 编辑 pre-commit 文件,添加你想要执行的操作,例如运行代码风格检查工具或者运行测试。
  5. 保存文件并确保它具有执行权限,例如:
    chmod +x pre-commit
    

现在,每次执行提交操作时,Git 都会自动运行 pre-commit 钩子中的脚本。

GIt 协作

开发工作流程

在 Git 中进行协作开发通常涉及多个开发者在同一个项目上共同工作。以下是一个常见的 Git 协作开发工作流程:

  1. 创建仓库

    • 项目的创建者在版本控制平台(如GitHub、GitLab、Bitbucket等)上创建一个新的仓库。
  2. 克隆仓库

    • 每位参与者将仓库克隆到本地计算机:
      git clone <仓库地址>
      
  3. 创建分支

    • 每位开发者在本地创建一个新的分支,用于开发特定的功能或修复问题:
      git checkout -b feature-branch
      
  4. 开发

    • 开发者在其分支上进行工作,修改文件,添加新功能或者修复 bug。
  5. 提交更改

    • 开发者将他们的更改提交到本地仓库:
      git add .
      git commit -m "描述提交的更改"
      
  6. 推送分支

    • 开发者将他们的分支推送到远程仓库:
      git push origin feature-branch
      
  7. 发起 Pull Request

    • 开发者在版本控制平台上发起一个 Pull Request,请求将他们的分支合并到主分支(通常是 mainmaster)。
  8. 审查代码

    • 其他团队成员(通常是项目的维护者或者其他开发者)审查 Pull Request,并提供反馈或建议。
  9. 解决反馈

    • 开发者根据审查反馈进行修改,并更新他们的分支。
  10. 合并分支

    • 维护者将通过审查的 Pull Request 合并到主分支中。
  11. 更新本地仓库

    • 所有参与者拉取最新的更改到本地仓库:
      git checkout main
      git pull origin main
      
  12. 删除分支(可选):

    • 完成工作后,开发者可以删除已合并的分支:
      git branch -d feature-branch
      

这是一个简单的协作开发工作流程示例,实际上可能因项目的复杂性或团队的特定需求而有所不同。

How does git work?
How does git work?

Pull Request 和 Code Review

Pull Request(PR)和 Code Review 是协作开发中非常重要的步骤,特别是在团队中共同开发代码时。简要解释一下它们的作用和流程:

Pull Request(PR)

  • Pull Request 是开发者在完成一个功能或修复一个 bug 后,向代码库的维护者请求将他们的更改合并到主分支的过程。
  • 开发者通过提交 Pull Request 来告知其他团队成员他们的更改,以便进行审查、讨论和合并。
  • PR 提供了一个讨论和反馈的平台,开发者和团队成员可以在其中进行讨论、提出问题、建议修改等。
  • PR 通常包含有关所做更改的描述、相关的 issue 编号、更改的范围等信息,以便其他人能够理解和审查。
  • 维护者或其他团队成员审查 PR,并提供反馈或批准合并。审查过程可能涉及代码质量、功能实现、性能影响、文档更新等方面的讨论。

Code Review

  • Code Review 是指开发者对另一位开发者提交的代码进行审查和评估的过程。
  • 通过 Code Review,团队成员可以确保代码质量、一致性和可维护性,并发现潜在的问题和错误。
  • Code Review 的目标是提高代码的质量、学习和分享最佳实践、确保团队成员之间的沟通和协作。

在一个典型的工作流程中,开发者完成工作后会提交一个 Pull Request,然后其他团队成员会对其进行 Code Review。开发者根据审查反馈进行修改,直到 PR 被批准并合并到主分支中为止。这种流程有助于确保代码质量、团队协作和项目的健康发展。

协作冲突解决

在协作开发过程中,冲突是不可避免的,特别是当多个开发者同时修改同一文件或同一行代码时。解决冲突的过程需要一定的沟通和合作。以下是解决协作冲突的一般步骤:

  1. 意识到冲突

    • 当尝试合并分支或拉取最新更改时,Git 会提示存在冲突。
  2. 了解冲突

    • 开发者需要仔细查看冲突的文件,了解冲突发生的原因和不同版本之间的差异。
  3. 解决冲突

    • 开发者在本地编辑冲突文件,手动解决冲突。通常,冲突部分会被标记,开发者需要决定保留哪些更改、丢弃哪些更改或者进行修改以整合两个版本的内容。
    • 解决冲突后,开发者需要将文件标记为已解决冲突:
      git add <冲突文件>
      
  4. 提交解决方案

    • 提交解决冲突后的文件:
      git commit -m "解决冲突:描述解决方案"
      
  5. 继续合并或拉取

    • 完成冲突解决后,开发者可以继续合并分支或拉取最新更改。
  6. 通知团队

    • 如果在合作开发中解决了冲突,开发者应该及时通知团队,以确保所有人都在同一页面上。

解决冲突的过程可能需要一些时间和技巧,尤其是在涉及复杂的代码更改时。在解决冲突时,保持沟通、耐心和合作是非常重要的。