Git使用笔记

287 阅读9分钟

一、Git 概述

1.1 版本控制系统的演进与意义

版本控制系统(Version Control System,简称 VCS)是软件开发领域的重要工具,它通过记录文件内容变化,实现对代码或文档历史版本的管理。早期的本地版本控制系统如 RCS,仅能在本地记录文件变更,无法满足多人协作需求。随后出现的集中式版本控制系统(如 CVS、Subversion),依赖中央服务器存储版本库,团队成员需通过网络与服务器交互,虽然实现了协作,但存在单点故障、网络依赖等问题。

分布式版本控制系统(如 Git、Mercurial)的出现,彻底改变了版本控制的模式。在分布式架构下,每个开发者的本地计算机都保存着完整的版本库,包含所有提交历史和分支信息,这不仅提高了开发的自主性,还增强了系统的容错性和性能。

1.2 Git 的诞生背景与发展历程

2005 年,为了更高效地管理 Linux 内核开发,Linus Torvalds 着手开发 Git。当时 Linux 内核的开发规模庞大,原有的版本控制系统在性能、分布式协作和数据完整性方面无法满足需求。Git 凭借其卓越的性能和灵活的分布式架构,迅速在开源社区和商业领域获得广泛应用。经过多年发展,Git 已成为全球最流行的版本控制系统,支撑着无数开源项目和商业软件的开发。

1.3 Git 的基本工作流程

Git 的工作流程围绕工作区、暂存区和本地仓库三个核心区域展开,同时涉及远程仓库进行团队协作:

  1. 工作区:开发者在本地计算机上实际编辑文件的目录,所有文件修改操作都在此进行。
  1. 暂存区:也称为索引(Index),是文件从工作区到本地仓库的中间过渡区域,用于暂存准备提交的文件修改。
  1. 本地仓库:存储在本地计算机上的完整版本库,包含所有提交历史、分支信息和数据对象。
  1. 远程仓库:通常部署在服务器上,用于团队成员间共享代码,常见的远程仓库服务有 GitHub、GitLab、Gitee 等。

image.png

常规工作流程为:在工作区修改文件后,使用git add将文件添加到暂存区,接着通过git commit将暂存区内容提交到本地仓库,最后使用git push将本地仓库的提交推送到远程仓库,实现与团队成员的代码共享。

二、Git 基本命令及其原理

2.1 git add

2.1.1 命令用法与示例

git add命令用于将工作区的文件变化添加到暂存区,是提交修改前的关键步骤。它有多种使用方式:

  • 添加单个文件:将指定文件添加到暂存区,例如将file.txt添加到暂存区,使用命令git add file.txt。
  • 添加目录:递归地将目录下的所有文件添加到暂存区,如git add dir/会添加dir目录及其子目录下的所有文件。
  • 添加所有变化:使用git add.命令可将工作区所有新增、修改的文件添加到暂存区;git add -u则只会将已跟踪文件的修改添加到暂存区,不会添加新文件。

2.2 git commit

2.2.1 命令用法与示例

git commit命令用于将暂存区的内容提交到本地仓库,形成一个新的提交记录。基本语法为:

git commit -m "提交信息"

如果提交后发现提交信息有误,可使用git commit --amend命令修改最近一次提交的信息,该命令会覆盖上一次提交的内容和信息,在未推送提交到远程仓库时使用较为方便。

2.3 git push

2.3.1 命令用法与示例

git push命令用于将本地仓库的提交推送到远程仓库,实现代码共享。基本语法为:

git push <远程仓库别名> <本地分支名>:<远程分支名>

常见的远程仓库别名是origin,如果本地分支名和远程分支名相同,可简化命令,例如将本地master分支推送到远程仓库的master分支,使用git push origin master。

若远程仓库不存在对应的分支,可使用git push --set-upstream origin <本地分支名>,该命令会在推送分支的同时,设置本地分支与远程分支的跟踪关系,方便后续直接使用git push。

2.4 git fetch

2.4.1 命令用法与示例

git fetch命令用于从远程仓库获取最新的提交和分支信息,但不会自动合并到本地分支。基本语法为:

git fetch <远程仓库别名>

例如,从名为origin的远程仓库获取信息,使用git fetch origin。执行后,Git 会将远程仓库的更新下载到本地的远程跟踪分支(如origin/master),但不会影响本地工作分支的状态。

2.5 git pull

2.5.1 命令用法与示例

git pull命令用于从远程仓库获取最新的提交并自动合并到当前本地分支,是git fetch和git merge的组合操作。基本语法为:

git pull <远程仓库别名> <远程分支名>

例如,从origin远程仓库的master分支拉取更新并合并到本地master分支,使用git pull origin master。

2.5.2 原理剖析

git pull首先执行git fetch操作,从远程仓库获取最新的提交对象和分支信息,更新本地的远程跟踪分支。然后,它会自动执行git merge或git rebase操作(取决于配置,默认是git merge),将远程跟踪分支的更新合并到当前本地分支。如果在合并过程中出现冲突,处理方式与普通的git merge冲突处理相同,需要手动解决冲突后再完成合并。

2.6 git merge

2.6.1 命令用法与示例

git merge命令用于将一个或多个分支的修改合并到当前分支,是团队协作中整合代码的关键操作。其基本语法为:

git merge <source-branch>

例如,将feature分支的修改合并到master分支,操作步骤如下:

git checkout master
git merge feature

上述命令先切换到master分支,再执行合并操作,将feature分支的改动整合到master分支。

2.6.2 冲突处理机制

当两个分支对同一文件的相同部分进行不同修改时,会产生合并冲突。Git 会在冲突文件中标记冲突区域,例如:

<<<<<<< HEAD
// 当前分支的修改内容
=======
// 目标分支的修改内容
>>>>>>> feature

需要手动编辑文件,解决冲突部分,然后使用git add将解决冲突后的文件添加到暂存区,最后通过git commit完成合并提交。

2.7 git rebase

2.7.1 命令用法与示例

git rebase命令用于将当前分支的一系列提交移动或合并到另一个基准提交上,可使提交历史呈现线性结构。基本语法为:

git rebase <base>

例如,将feature分支的提交应用到master分支上:

git checkout feature
git rebase master

执行后,feature分支的所有提交会被复制到master分支的最新提交之后,仿佛feature分支直接从master分支派生而来。

2.7.3 与 merge 的对比及适用场景

git rebase和git merge都能实现分支合并,但适用场景不同:

  • git merge:保留完整分支历史,适合需要清晰展示分支演变过程的项目,如开源项目的主分支合并;但可能导致提交历史变得复杂。
  • git rebase:创建线性提交历史,便于查看和管理,适合个人开发或团队内部短期分支的整合;不过会改变提交的哈希值,不适合已公开推送的提交。

image.png

2.8 git cherry-pick

2.8.1 命令用法与示例

git cherry-pick用于从一个分支中选取一个或多个提交,并应用到当前分支,适用于将特定提交(如 bug 修复)移植到其他分支的场景。基本语法为:

git cherry-pick <commit-hash>

例如,将feature分支上的某个提交应用到master分支:

git checkout master
git cherry-pick <commit-hash>

也可同时选取多个提交:

git cherry-pick <commit-hash1> <commit-hash2> <commit-hash3>

2.8.2 冲突处理与应用范围

git cherry-pick操作过程中也可能出现冲突,当应用的提交与当前分支内容冲突时,Git 会暂停操作并标记冲突文件。开发者解决冲突后,使用git cherry-pick --continue继续操作,或使用git cherry-pick --abort取消操作。该命令通常用于精准移植特定提交,而非合并整个分支的所有改动。

2.8.3 与其他命令的关系

git cherry-pick、git rebase和git merge都是代码整合工具,但各有侧重:

  • git merge:合并整个分支的所有修改。
  • git rebase:按顺序应用一个分支的所有修改到另一个分支。
  • git cherry-pick:选择性应用一个或多个特定提交,更灵活精准。

2.9 git stash

2.9.1 命令用法与示例

git stash用于临时保存工作目录和暂存区的修改,方便在不提交的情况下切换分支或执行其他任务。基本语法为:

git stash save [message]

[message]为可选描述信息,用于标识 stash。例如:

git stash save "Work in progress on feature X"

保存后,工作目录恢复到上次提交状态,可使用git stash list查看所有 stash 记录。

2.9.2 恢复与删除操作

恢复最近保存的 stash:

git stash apply

恢复指定 stash:

git stash apply stash@{n}

stash@{n}为 stash 标识符,可从git stash list输出中查看。若要在恢复时删除 stash,使用git stash pop。删除特定 stash:

git stash drop stash@{n}

删除所有 stash:

git stash clear

2.9.3 高级应用场景

  • 部分 stash:使用git stash --patch可交互式选择要保存的文件修改。
  • 基于 stash 创建分支:git stash branch 可创建新分支并在该分支上恢复指定 stash。
  • 查看 stash 差异:git stash show用于查看 stash 与当前 HEAD 之间的差异 。