Featured image of post Git 教程:从基础知识到高级工作流程Featured image of post Git 教程:从基础知识到高级工作流程

Git 教程:从基础知识到高级工作流程

全面的 Git 指南,涵盖安装、存储库管理、分支策略、拉取请求、合并冲突、变基和协作工作流程。

Git 教程:项目管理和版本控制基础知识

Git 是现代软件开发中版本控制的事实上的标准。它跟踪代码库的每次更改,实现无缝团队协作,并为实验提供安全网。无论您是维护个人项目的独立开发人员还是大型工程团队的一员,掌握 Git 都是必不可少的。本指南涵盖了 Git 从基本原理到高级工作流程,以及实用命令和真实场景。

简介:关键概念

在深入研究命令之前,了解 Git 的思维模型会有所帮助。与集中式版本控制系统不同,Git 是分布式的——每个开发人员都拥有存储库历史记录的完整副本。

  • 存储库:所有文件及其修订历史记录的数据库。每个 Git 项目都位于存储库中。
  • 提交:项目在特定时间点的快照。每个提交都有一个唯一的哈希值、作者、时间戳和描述更改的消息。
  • 分支:指向特定提交的可移动指针。分支让您可以独立开发功能。
  • 暂存区域(索引):您在提交之前准备更改的中间区域。这使您可以对每次提交的内容进行细粒度的控制。
  • 远程:托管在另一台计算机上的存储库的副本(例如 GitHub、GitLab、Bitbucket)。

安装Git

视窗

git-scm.com 下载安装程序并运行它。默认选项适合大多数用户。安装后,打开 Git Bash 或 PowerShell 并验证安装:

git --version

macOS

Git 可能已经安装。检查 git --version。如果缺少,请通过 Homebrew 安装:

brew install git

Linux

大多数发行版都包含 Git。使用包管理器安装它:

# Debian/Ubuntu
sudo apt install git

# Fedora/RHEL
sudo dnf install git

存储库设置和首次提交

创建存储库是任何 Git 工作流程的第一步。

# Initialize a new repository
mkdir my-project
cd my-project
git init

# Add files to the staging area
echo "# My Project" > README.md
git add README.md

# Commit the staged files
git commit -m "Initial commit"

git init 命令创建一个隐藏的 .git 目录,用于存储所有版本控制元数据。 git add 命令暂存特定文件,git commit 创建永久快照。将暂存视为准备区域 - 您可以增量暂存文件并在准备好时提交。

连接到远程存储库

本地存储库很有用,但当您通过远程协作时,Git 的真正威力才会显现出来。在 GitHub 或 GitLab 上创建存储库后,将其链接到您的本地项目:

git remote add origin https://github.com/yourusername/my-project.git
git push -u origin main

-u 标志设置上游跟踪引用,因此将来的推送可以使用不带参数的 git push 。使用以下命令验证您的远程配置:

git remote -v

分支:独立开发

分支是 Git 的并行开发机制。您创建一个分支,进行更改,并在准备好后将它们合并回来 - 所有这些都不会干扰主代码库。

# Create and switch to a new branch
git branch feature/user-auth
git checkout feature/user-auth

# Or do both in one command
git checkout -b feature/user-auth

常见的分支策略是 Git Flow,它使用 main 来生产就绪代码,使用 develop 进行集成,并使用功能分支来进行单独的工作。一个更简单的替代方案是基于主干的开发,开发人员在短期功能分支上工作并经常合并到 main 中。

战略分支机构合并频率最适合
Git 流程主要、开发、功能、发布、修补程序降低复杂的发布
GitHub 流程主要, 特点持续部署
基于主干仅主要(短功能分支)非常高CI/CD 团队

拉取请求和代码审查

拉取请求 (PR) 是一种将一个分支的更改合并到另一个分支的正式提案。 PR 是协作代码审查的基石。

  1. 将您的功能分支推送到远程:git push origin feature/user-auth
  2. 在 GitHub/GitLab 上,针对 main 打开新的拉取请求
  3. 写下清晰的标题和描述来解释更改
git push origin feature/user-auth
# Then open the PR via the remote platform's UI

审阅者留下评论、请求更改或批准。一旦获得批准,通过平台 UI 合并 PR — 这通常会创建合并提交或执行快进合并。

同步:拉取、获取和合并

保持本地存储库处于最新状态至关重要,尤其是在团队中工作时。

# Fetch changes without merging
git fetch origin

# Fetch and merge in one step
git pull origin main

# The above is equivalent to:
git fetch origin main
git merge origin/main

当两个人修改文件的相同行时,就会出现冲突。 Git 标记文件中的冲突区域:

<<<<<<< HEAD
console.log("version A");
=======
console.log("version B");
>>>>>>> feature/branch

编辑文件以解决冲突,暂存它,然后提交:

git add conflicted-file.js
git commit -m "Resolve merge conflict in conflicted-file.js"

变基:更清晰的历史

虽然合并保留了提交的确切时间顺序,但变基重写了历史记录以创建线性序列。这会产生更干净的日志,但应谨慎使用 - 切勿对已推送到共享分支的提交进行变基。

# Rebase current branch onto main
git checkout feature/my-feature
git rebase main

# Interactive rebase to squash, reword, or reorder commits
git rebase -i HEAD~5

交互式变基会打开一个编辑器,您可以在其中:

  • pick:保持提交不变
  • squash:将提交与前一个提交合并
  • reword:更改提交消息
  • drop:删除提交

查看历史记录

Git 的历史检查工具对于了解项目的演变非常宝贵。

# Full commit log
git log

# Condensed one-line log with graph
git log --oneline --graph --all

# Show changes in a specific commit
git show abc123

# Diff between working directory and last commit
git diff

# Diff between two branches
git diff main..feature/user-auth

# Search commits by message
git log --grep="fix"

Git 配置和内务管理

设置您的身份 - 每次提交都使用此信息:

git config --global user.name "Your Name"
git config --global user.email "[email protected]"

.gitignore 文件

并非每个文件都属于版本控制。 .gitignore 文件告诉 Git 忽略哪些文件——依赖目录、构建输出、环境文件和操作系统工件。

# Dependencies
node_modules/
vendor/

# Build output
dist/
build/
.out/

# Environment files
.env
.env.local

# OS files
.DS_Store
Thumbs.db

高级:远程分支机构管理

随着时间的推移,远程存储库会积累陈旧的分支。定期清理它们:

# Delete a remote branch
git push origin --delete feature/old-branch

# Prune local tracking of deleted remote branches
git fetch --prune

结论

Git 是一个深入的工具——本指南涵盖了您每天将使用的命令和工作流程,但总有更多东西需要学习。专注于掌握基础知识:深思熟虑地做出承诺,有意地进行分支,并经常同步。一旦这些习惯得到巩固,就可以探索高级主题,例如用于二进制搜索错误的 bisect、用于暂时搁置工作的 stash 以及用于恢复丢失的提交的 reflog。版本控制不仅仅是为了保存代码,而是为了构建可靠的历史记录,使您和您的团队能够快速行动而不破坏事物。