一文总结 Git 的常用命令

1. Git 简介

1.1 分布式版本控制系统

Git是一个高效的分布式版本控制系统,由Linus Torvalds在2005年创建,目的是为Linux内核开发提供一种快速、有效和可靠的代码管理方式。与集中式版本控制系统不同,Git给予每个开发者一份完整的代码库副本,即仓库(repository),其中包含了所有文件的所有历史版本。

分布式架构使得Git在处理速度、安全性和稳定性方面有着显著的优势。即使在无网络连接的情况下,开发者也能够进行代码提交、查看历史等操作,因为所有的数据都本地存储。此外,Git支持成千上万个并行工作的分支,为多人协作提供了便利。

Git的核心特性包括:

  • 速度:Git在合并(merge)、分支(branch)和标签(tag)等操作上表现出色,提供了极快的执行速度。
  • 数据完整性:Git通过SHA-1哈希算法对代码库的每一个快照进行加密,确保代码的完整性和安全性。
  • 支持分布式开发:每个开发者可以独立地进行工作,同时在需要时合并他人的工作,极大地提高了团队的协作效率。
  • 易于备份:由于Git是分布式的,每个开发者的本地仓库都可以作为代码备份,这提高了数据的安全性。
  • 分支和合并:Git的分支操作非常快速且简单,支持多种合并策略,使得代码合并变得容易和可靠。
  • 多平台支持:Git可以在Linux、Unix、Mac和Windows等操作系统上运行,具有很好的跨平台性。
  • 子模块:Git支持将一个Git仓库作为另一个Git仓库的子目录,这为复杂的项目管理提供了便利。

Git的广泛应用使其成为现代软件开发中不可或缺的工具之一,无论是开源项目还是商业软件,Git都是版本控制的首选。随着社区的不断发展,Git仍在不断进化,以满足开发者日益增长的需求。

2. Git 常用命令

2.1 基础命令

Git 的基础命令是进行版本控制时最常使用的一组命令,它们涵盖了从初始化仓库到提交更改的整个流程。

  • git init: 初始化一个新的Git仓库,为项目打上Git的标记,使其成为一个Git可以跟踪的仓库。
  • git add: 将更改(修改过的文件)添加到暂存区,准备提交。使用git add .可以暂存当前目录下的所有更改。
  • git commit: 提交暂存区的更改,创建一个新的提交对象,并且每个提交都会有一个唯一的哈希值作为标识。
  • git status: 查看当前工作目录和暂存区的状态,显示哪些文件被修改、已暂存或未跟踪。
  • git diff: 展示工作目录中当前更改与上次提交之间的差异,或者展示暂存区与工作目录的差异。
  • git log: 显示提交历史记录,可以通过不同的参数来格式化输出,例如--oneline以单行显示提交信息。

2.2 分支管理命令

分支是Git中一个强大的功能,它允许开发者在不同的开发线上工作而不会相互干扰。

  • git branch: 列出所有本地分支,当前分支前会有一个星号(*)标记。
  • git checkout: 切换到指定的分支或文件。
  • git branch : 创建一个新的分支,并切换到该分支。
  • git merge : 将指定分支的更改合并到当前分支。
  • git branch -d : 删除一个已经合并到主分支的分支。
  • git stash: 暂存当前工作目录的更改,让工作目录干净,方便切换分支。

2.3 远程仓库命令

远程仓库命令用于管理与远程服务器上的Git仓库的交互。

  • git remote add: 添加一个新的远程仓库地址。
  • git remote -v: 显示远程仓库的详细信息,包括仓库的别名和URL。
  • git fetch: 从远程仓库获取所有分支的更新,但不会自动合并到当前分支。
  • git pull: 从远程仓库拉取代码并尝试合并到当前分支,相当于git fetch后跟git merge
  • git push: 将本地分支的更改推送到远程仓库,如果远程分支不存在,会创建远程分支。
  • git clone: 克隆远程仓库到本地,创建一个新的目录,并初始化为Git仓库。
  • git push -u origin master: 第一次推送master分支到远程仓库,并设置上游分支,之后可以使用git push直接推送。

3. Git 工作流程

3.1 工作区、暂存区与仓库区

在Git的版本控制系统中,一个项目被分为三个主要的区域:工作区(Working Directory)、暂存区(Staging Area,也称为索引区Index)、以及仓库区(Repository或Git Directory)。理解这些区域的功能和它们之间的交互是掌握Git命令的基础。

  • 工作区:这是开发者日常进行文件编辑和查看的地方。当开发者对项目做出更改时,这些更改最初仅在工作区体现,尚未准备提交到版本历史中。

  • 暂存区:当开发者使用git add命令时,更改的文件会被移动到暂存区。这个区域充当了一个准备提交的缓冲区,让开发者可以组织他们想要一次性提交的改动。

  • 仓库区:最后,使用git commit命令会将暂存区的文件提交到仓库区。仓库区是Git用来保存项目历史的地方,每次提交都会在这里创建一个新的快照。

3.1.1 工作区的文件状态

在工作区中,文件可能处于以下几种状态之一:

  • 已跟踪:文件已经被Git认识,并且已经被记录在Git的数据库中。
  • 未跟踪:文件是新添加的,还没有被Git跟踪。
  • 已修改:已跟踪的文件自上次提交以来已经被更改,但这些更改还没有被添加到暂存区。
  • 已暂存:对已跟踪文件的更改已经被添加到暂存区,准备在下次提交时被保存到仓库区。

3.1.2 暂存区的作用

暂存区的主要作用是提供一个临时的存储区域,让开发者可以决定哪些更改将被包括在下一次提交中。通过git add命令,开发者可以将更改的文件或特定更改(如特定文件的一部分更改)添加到暂存区。使用git resetgit restore命令可以从暂存区撤销更改,使其回到工作区。

3.1.3 仓库区的提交历史

仓库区保存了项目的完整提交历史。每次调用git commit命令时,Git会创建一个新的提交对象,这个对象包含了暂存区的快照、提交信息、作者信息以及与上一个提交的链接。通过git log命令可以查看项目的提交历史。

3.1.4 工作流程的示例

  1. 在工作区修改或添加文件。
  2. 使用git add将更改的文件添加到暂存区。
  3. 使用git commit将暂存区的更改提交到仓库区,形成新的提交。
  4. 重复步骤1到3,以继续开发和记录项目的历史。

通过遵循这个工作流程,开发者可以有效地管理他们的代码更改,并维护一个清晰、有序的项目历史记录。

4. Git 分支策略

4.1 主分支与功能分支

在Git中,分支策略是版本控制的关键组成部分,它能够帮助开发者以一种有组织的方式管理代码的演进。主分支通常代表生产就绪的代码,而功能分支则用于开发新的功能或修复bug。

主分支(Master Branch)

主分支是项目的中心,它应该始终反映一个稳定和可部署的状态。在许多项目中,主分支也被称作mainproduction

  • 角色与目的:主分支的目的是作为所有开发工作的基线和最终合并点。它保证了代码的稳定性和可靠性。
  • 保护措施:为了防止意外提交破坏生产环境,主分支通常会设置保护规则,例如要求所有合并请求(Pull Request)必须通过自动化测试。
  • 更新频率:虽然主分支是稳定的,但它会频繁地通过合并来自功能分支的代码而更新,以集成新功能和修复。

功能分支(Feature Branches)

功能分支用于开发新功能或修复特定的问题。它们从主分支分出,并在完成后合并回主分支。

  • 创建与命名:功能分支通常从主分支创建,并以清晰的命名方式标识其目的,如feature/login-pagefix/issue-123
  • 独立开发:开发者可以在功能分支上自由地进行提交,不会影响主分支的稳定性。这为实验性或迭代开发提供了空间。
  • 代码审查:在功能分支完成开发后,通常需要通过代码审查来确保代码质量和项目标准。这可以通过Pull Request来实现。
  • 合并策略:功能分支的合并可以采用不同的策略,如快进合并(Fast-forward merge)或创建合并提交(Merge commit)。有时,为了避免不必要的合并提交,可以使用变基(Rebase)来整理提交历史。

使用主分支和功能分支的策略,团队可以有效地并行工作,同时保持代码库的稳定性和可维护性。这种策略也支持了持续集成(CI)和持续部署(CD)的实践,使得软件交付更加高效和可靠。

5. Git 标签管理

标签管理是Git中一个重要的功能,它允许用户给历史中的某个特定点打上标签,通常用于标记发布版本。以下是对Git标签管理的总结:

5.1 创建标签

创建标签可以通过git tag命令实现,它有几种不同的使用方式:

  • 创建轻量级标签:git tag ,它不会存储额外信息。
  • 创建含附注的标签:git tag -a ,这将打开一个文本编辑器,让你添加标签信息。

5.2 列出标签

使用git tag命令可以列出仓库中所有的标签。

5.3 检出标签

检出标签意味着切换到标签所对应的特定提交,使用命令git checkout

5.4 删除标签

删除本地标签可以使用git tag -d 命令。如果需要删除远程仓库中的标签,可以使用git push :refs/tags/

5.5 推送标签

推送本地标签到远程仓库,可以使用git push 。如果想一次性推送所有标签,可以使用git push --tags

5.6 检视标签信息

使用git show 可以查看标签的详细信息,包括标签的附注和对应的提交信息。

通过这些命令,用户可以有效地管理Git仓库中的标签,确保项目的版本控制清晰有序。

6. Git 撤销操作

撤销操作是Git中非常重要的一部分,它们允许开发者在代码提交过程中回退到之前的状态,或者取消已经进行的操作。以下是一些常用的Git撤销命令及其使用场景:

6.1 撤销暂存区的更改

在提交更改之前,如果需要撤销对暂存区的更改,可以使用以下命令:

  • git reset HEAD :撤销对指定文件的暂存,但不删除工作目录中的更改。
  • git reset --hard HEAD :撤销对指定文件的暂存,并删除工作目录中的更改。

6.2 撤销工作目录中的更改

如果需要撤销工作目录中的更改,但这些更改尚未暂存,可以使用:

  • git checkout -- :撤销对指定文件的更改,但不会影响暂存区。

6.3 撤销提交

如果需要撤销已经完成的提交,可以使用以下命令:

  • git revert :创建一个新的提交,撤销指定提交所做的所有更改。
  • git reset --soft :撤销从指定提交之后的所有更改,但不删除任何提交记录,这些更改可以重新提交。

6.4 完全重置仓库

在某些情况下,可能需要将整个仓库重置到一个干净的状态,可以使用:

  • git reset --hard :将HEAD、暂存区和工作目录都重置到指定的提交状态。
  • git clean -fd:删除工作目录中的所有未跟踪文件和目录。

6.5 撤销远程仓库的更改

如果需要撤销远程仓库中的更改,可以结合使用git push命令:

  • git push --delete :删除远程仓库中的指定分支。
  • git push ::将本地分支的更改推送到远程分支,覆盖远程分支的更改。

使用这些撤销命令时,需要谨慎操作,因为某些命令可能会永久删除更改,无法恢复。在执行撤销操作之前,最好备份当前的工作目录或提交记录,以防万一。

7. Git 合并与冲突解决

7.1 合并操作基础

Git 合并操作是将两个或多个开发历史合并在一起的过程。通常发生在分支开发完成后,需要将一个分支上的更改合并到另一个分支上。

  • 基本合并:使用 git merge 命令将指定分支的更改合并到当前分支。例如,若要将名为 feature 的分支合并到 master 分支,可使用命令 git merge feature

7.2 处理合并冲突

当合并时两个分支在相同的文件上有不同的更改,Git 无法自动解决这些更改,就会发生冲突。

  • 冲突识别:Git 会在合并时提示哪些文件发生了冲突,通常在文件中以 <<<<<<<=======>>>>>>> 标记出不同分支的更改。
  • 解决冲突:用户需要手动编辑冲突文件,选择保留、修改或删除冲突的部分。编辑完成后,使用 git add 将解决后的文件暂存,然后 git commit 提交合并。

7.3 高级合并策略

除了基本的合并,Git 还提供了多种策略来处理不同情况的合并。

  • 快进合并:当分支没有分叉,即一条分支是另一条分支的直接祖先时,Git 可以执行快进合并,无需创建新的合并提交。
  • 三方合并:当涉及多个分支的合并时,Git 会使用三方合并策略,创建一个新的合并提交来整合更改。

7.4 使用 git rebase 进行变基

变基是另一种整合分支的方法,它将一系列提交从一个分支上摘下来,然后再应用到另一分支上。

  • 基本变基:使用 git rebase 命令将当前分支上的提交重新应用到另一分支上。例如,git rebase master 将当前分支的更改应用到 master 分支的最新状态上。
  • 变基与合并:变基可以创建更干净、线性的提交历史,但不适合已经推送到公共分支的提交。

7.5 冲突解决工具

Git 提供了多种工具来辅助解决合并冲突。

  • 图形化工具:如 git mergetool,可以启动图形界面帮助用户解决冲突。
  • 命令行工具:使用 git diff 查看差异,git checkout --ours/--theirs 选择使用哪一方的更改。

7.6 合并后的清理

合并完成后,有时需要清理不再需要的分支。

  • 删除分支:使用 git branch -d 删除已经合并到其他分支的本地分支。
  • 远程分支清理:如果远程分支不再需要,可以使用 git push --delete 删除远程分支。

你可能感兴趣的:(科技博文,git)