跳至主要内容

关于 Git

了解版本控制系统 Git 及其与 GitHub 的协作方式。

关于版本控制和 Git

版本控制系统 (VCS) 会跟踪更改的历史记录,以便个人和团队在项目上协作。当开发人员对项目进行更改时,可以随时恢复项目的任何早期版本。

开发人员可以查看项目历史记录以了解

  • 进行了哪些更改?
  • 谁进行了更改?
  • 更改是在何时进行的?
  • 为什么需要更改?

VCS 为每个贡献者提供项目的统一且一致的视图,并显示正在进行的工作。查看更改的透明历史记录、谁进行了更改以及它们如何为项目开发做出贡献,有助于团队成员在独立工作时保持一致。

在分布式版本控制系统中,每个开发人员都拥有项目的完整副本和项目历史记录。与曾经流行的集中式版本控制系统不同,DVCS 不需要与中央仓库保持持续连接。Git 是最流行的分布式版本控制系统。Git 通常用于开源和商业软件开发,对个人、团队和企业都有显著的益处。

  • Git 使开发人员能够在一个地方查看其更改、决策和任何项目的进展的整个时间线。从访问项目历史记录的那一刻起,开发人员就拥有理解项目并开始贡献所需的所有上下文。

  • 开发人员在每个时区工作。使用像 Git 这样的 DVCS,协作可以在任何时间进行,同时保持源代码完整性。使用分支,开发人员可以安全地向生产代码提出更改建议。

  • 使用 Git 的企业可以打破团队之间的沟通障碍,并让他们专注于做好自己的工作。此外,Git 使企业能够将专家整合在一起,共同协作完成重大项目。

关于仓库

一个仓库,或 Git 项目,包含与项目相关的所有文件和文件夹的集合,以及每个文件的修订历史。文件历史以称为提交的时间快照形式出现。提交可以组织成称为分支的多个开发线。由于 Git 是一个 DVCS,仓库是自包含的单元,任何拥有仓库副本的人都可以访问整个代码库及其历史。使用命令行或其他易用性界面,Git 仓库还允许:与历史交互、克隆仓库、创建分支、提交、合并、比较代码不同版本之间的更改等等。

通过 GitHub 等平台,Git 还为项目透明度和协作提供了更多机会。公共仓库帮助团队协同工作,以构建最佳的最终产品。

GitHub 的工作原理

GitHub 托管 Git 仓库,并为开发人员提供工具,通过命令行功能、问题(线程讨论)、拉取请求、代码审查或使用 GitHub Marketplace 中的一系列免费和付费应用程序来交付更好的代码。凭借 GitHub 流程等协作层、1 亿开发人员的社区以及拥有数百个集成的生态系统,GitHub 改变了软件的构建方式。

GitHub 将协作直接构建到开发流程中。工作被组织成仓库,开发人员可以在其中概述需求或方向,并为团队成员设定期望。然后,使用 GitHub 流程,开发人员只需创建一个分支来处理更新,提交更改以保存它们,打开一个拉取请求来提出和讨论更改,并在每个人都达成一致后合并拉取请求。有关更多信息,请参阅 "GitHub 流程."

有关 GitHub 计划和费用的信息,请参阅 GitHub 定价。有关 GitHub Enterprise 与其他选项的比较信息,请参阅 将 GitHub 与其他 DevOps 解决方案进行比较

GitHub 和命令行

基本 Git 命令

为了使用 Git,开发者需要使用特定的命令来复制、创建、更改和合并代码。这些命令可以直接在命令行中执行,也可以通过使用 GitHub Desktop 等应用程序执行。以下是一些常用的 Git 命令。

  • git init 初始化一个全新的 Git 仓库,并开始跟踪现有目录。它会在现有目录中添加一个隐藏的子文件夹,用于存放版本控制所需的内部数据结构。

  • git clone 创建一个已存在于远程的项目的本地副本。克隆包含项目的所有文件、历史记录和分支。

  • git add 暂存更改。Git 会跟踪开发者代码库的更改,但需要暂存并对更改进行快照才能将它们包含在项目的历史记录中。此命令执行暂存,这是该两步过程的第一部分。任何被暂存的更改都将成为下一个快照的一部分,并成为项目历史记录的一部分。单独暂存和提交使开发者能够完全控制项目的历史记录,而不会改变他们的编码和工作方式。

  • git commit 将快照保存到项目历史记录中,并完成更改跟踪过程。简而言之,提交就像拍照一样。任何使用 git add 暂存的内容都将使用 git commit 成为快照的一部分。

  • git status 显示更改的状态,包括未跟踪、已修改或已暂存。

  • git branch 显示本地正在处理的分支。

  • git merge 将开发线合并在一起。此命令通常用于合并两个不同分支上的更改。例如,当开发者想要将功能分支上的更改合并到主分支以进行部署时,他们会使用合并。

  • git pull 使用远程对应项的更新来更新本地的开发线。如果团队成员对远程分支进行了提交,而开发者希望在本地环境中反映这些更改,则可以使用此命令。

  • git push 使用本地对分支进行的任何提交来更新远程仓库。

有关更多信息,请参阅 Git 命令的完整参考指南

示例:为现有仓库贡献代码

# download a repository on GitHub to our machine
# Replace `owner/repo` with the owner and name of the repository to clone
git clone https://github.com/owner/repo.git

# change into the `repo` directory
cd repo

# create a new branch to store any new changes
git branch my-branch

# switch to that branch (line of development)
git checkout my-branch

# make changes, for example, edit `file1.md` and `file2.md` using the text editor

# stage the changed files
git add file1.md file2.md

# take a snapshot of the staging area (anything that's been added)
git commit -m "my snapshot"

# push changes to github
git push --set-upstream origin my-branch

示例:启动一个新的仓库并将其发布到 GitHub

首先,您需要在 GitHub 上创建一个新的仓库。有关更多信息,请参阅“Hello World”。不要使用 README、.gitignore 或 License 文件初始化仓库。这个空仓库将等待您的代码。

# create a new directory, and initialize it with git-specific functions
git init my-repo

# change into the `my-repo` directory
cd my-repo

# create the first file in the project
touch README.md

# git isn't aware of the file, stage it
git add README.md

# take a snapshot of the staging area
git commit -m "add README to initial commit"

# provide the path for the repository you created on github
git remote add origin https://github.com/YOUR-USERNAME/YOUR-REPOSITORY-NAME.git

# push changes to github
git push --set-upstream origin main

示例:为 GitHub 上的现有分支贡献代码

此示例假设您已经在机器上有一个名为 repo 的项目,并且自上次本地更改以来,已将一个新分支推送到 GitHub。

# change into the `repo` directory
cd repo

# update all remote tracking branches, and the currently checked out branch
git pull

# change into the existing branch called `feature-a`
git checkout feature-a

# make changes, for example, edit `file1.md` using the text editor

# stage the changed file
git add file1.md

# take a snapshot of the staging area
git commit -m "edit file1"

# push changes to github
git push

协作开发模型

人们在 GitHub 上进行协作的主要方式有两种。

  1. 共享仓库
  2. Fork 和 Pull

在共享存储库中,个人和团队被明确指定为具有读、写或管理员访问权限的贡献者。这种简单的权限结构,加上受保护分支等功能,帮助团队在采用 GitHub 时快速取得进展。

对于开源项目,或任何人都可以贡献的项目,管理个人权限可能很困难,但 fork 和 pull 模型允许任何可以查看项目的人贡献。Fork 是一个项目在开发者个人帐户下的副本。每个开发者对其 fork 拥有完全控制权,可以自由地实现修复或新功能。在 fork 中完成的工作要么保持独立,要么通过 pull request 反馈到原始项目。在那里,维护者可以在合并更改之前审查建议的更改。有关更多信息,请参阅 "为项目做出贡献."