前言

目前在公司干了三年多了,一直以来我都是使用的SVN,但是我发现用Git的还是比用SVN的要多,所以抽空学习了一下Git的使用方式,先看看两者的区别。

以下是SVN和Git之间的一些主要区别:

  1. 架构差异

    • SVN:是一个集中式版本控制系统。这意味着有一个中央服务器,所有开发者的工作副本都直接与这个中央仓库交互。

    • Git:是一个分布式版本控制系统。每个开发者的工作副本都是一个完整的代码库,包含完整的历史记录,这意味着开发者可以在离线状态下进行大部分操作,并在需要时与其他仓库同步。

  2. 分支和合并

    • SVN:在SVN中,分支操作相对昂贵,因为它们通常涉及到复制整个代码库的一部分。

    • Git:Git的分支非常轻量级,创建和切换分支几乎瞬间完成。Git鼓励使用分支进行开发,这使得实验和特性开发更加方便。

  3. 性能

    • SVN:由于它的集中式架构,SVN的操作通常需要与中央服务器进行交互,这可能在网络延迟较大的情况下影响性能。

    • Git:Git的大多数操作都是在本地执行,这意味着它们非常快速。只有在与其他仓库同步时才需要与远程服务器交互。

  4. 历史记录

    • SVN:SVN的历史记录是线性的,每次提交都会添加到中央仓库的历史中。

    • Git:Git的历史记录是全局的,不仅仅包括自己的提交,还包括其他开发者的提交。Git的提交历史是一个复杂的图结构,可以处理多线历史和合并。

  5. 安全性

    • SVN:SVN的权限控制通常在服务器端进行,可以细粒度地控制用户对特定目录的访问。

    • Git:Git的权限控制通常是在服务器端使用钩子脚本(hooks)来实现的,虽然它本身不提供内置的细粒度权限控制,但可以通过第三方服务如GitLab或GitHub来实现。

  6. 网络依赖性

    • SVN:由于是集中式的,许多操作需要网络连接到中央服务器。

    • Git:Git可以在完全离线的情况下进行大部分操作,只有在推送到远程仓库或从远程仓库拉取更新时才需要网络连接。

  7. 数据完整性

    • SVN:SVN依赖于文件系统的时间戳和大小来检测文件的改变,这可能导致某些情况下数据的不一致。

    • Git:Git使用SHA1哈希来确保数据的完整性。每个文件和提交都会生成一个唯一的哈希值,Git使用这些哈希值来跟踪和验证数据。

总的来说,Git的分布式特性和对分支和合并的优化使其在灵活性和性能方面优于SVN,特别是在大型项目和分布式团队协作的场景中。然而,SVN的集中式模型在某些情况下可能更简单,尤其是在小型团队或对权限控制有特定需求的环境中。随着Git的流行,许多原本使用SVN的项目和团队都已经迁移到了Git。

简介

Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。Git易于学习,占地面积小,具有闪电般的快速性能。它超越了Subversion、CVS、Perforce和ClearCase等传统的SCM工具,具有廉价的本地分支、方便的暂存区域和多个工作流等功能。
Git最初由Linus Torvalds设计,用于更好地管理Linux内核开发过程。自2005年发布以来,Git迅速成为全球最流行的版本控制系统,被广泛用于各种项目,包括开源和私有项目。
Git的主要特点包括:

  1. 分布式:Git是一个分布式版本控制系统,这意味着每个开发人员都有一个完整的代码库,包括历史记录。这允许在没有网络连接的情况下进行工作,同时还可以轻松地与其他开发人员的代码库进行同步和协作。

  2. 性能:Git在处理大型项目时速度非常快,这是因为它是为性能而设计的。Git使用哈希值来标识对象,这允许它在几秒钟内比较和分析大量数据。

  3. 安全性:Git使用SHA1哈希算法来确保代码的完整性和一致性。这意味着在Git中几乎不可能发生数据损坏或丢失。

  4. 灵活性和可扩展性:Git支持多种不同的工作流和扩展,可以满足不同团队和项目的需求。开发人员可以根据自己的需求自定义和扩展Git。

  5. 分支:Git的分支模型是其最强大的功能之一。Git允许轻松地创建、合并和删除分支,这使得开发人员可以安全地尝试新功能或修复错误,而不会影响主代码库。

  6. 社区和支持:Git拥有一个庞大的社区,提供大量文档、教程和工具,以帮助开发人员更好地使用和理解Git。

总之,Git是一个功能强大、灵活且易于使用的版本控制系统,适用于各种规模的项目。它已经成为全球范围内开发人员协作和代码管理的首选工具。

常用命令

初始化配置

  • git config --global user.name "Your Name"​:设置你的用户名称。

  • git config --global user.email "your_email@example.com"​:设置你的电子邮件地址。

  • git config --global credential store​:存储配置。

  • 省略(local):本地配置,只对本地仓库生效

  • --global:全局配置,所有仓库生效

  • --system:系统配置,对所有用户生效

创建仓库

  • git init <project-name>​:初始化一个新的Git仓库。

    • 省略project-name则表示在当前目录下创建

    • ​git init -b <branch>​:初始化仓库并创建分支。

  • git clone <url>​:从远程仓库克隆。​​

添加和提交

  • git add <file>​:将文件添加到暂存区。

    git add .​表示添加所有文件到暂存区

  • git commit -m "Commit message"​:将暂存区的更改提交到仓库。

    只有添加到暂存区的文件才会被条件到仓库,工作区的文件是不会被提交到仓库的。

  • git commit --amend​:修改最后一次提交。

查看状态

  • git status​:显示当前仓库的状态。

  • ​git diff​:显示暂存区和工作目录之间的差异。

  • ​git diff --cached​:显示暂存区和上一个提交之间的差异。

  • git diff <commit> <commit>​:比较两个提交之间的差异。

分支管理

  • ​git branch​:列出所有分支。

  • ​git branch <new-branch>​:创建一个新的分支。

  • git checkout <branch>​:切换到指定的分支。

    git switch <branch>​:Git v2.23版本提供该命令切换到指定分支。

  • ​git checkout -b <branch>​:创建并切换到新的分支。

  • git branch -d <branch>​:删除一个已经合并的分支。

    ​git branch -D <branch>​:强制删除一个分支

  • ​git branch -m <old-branch> <new-branch>​:分支重名命。

  • git merge <branch>​:将一个分支合并到当前分支。

  • git pull​:从远程仓库获取并合并指定分支。

远程操作

  • git remote -v​:列出所有远程仓库。

  • ​git remote add <name> <url>​:添加一个新的远程仓库。

  • ​git fetch <remote>​:从远程仓库获取数据。

  • ​git pull <remote> <branch>​:从远程仓库获取并合并指定分支。

  • ​git push <remote> <branch>​:将本地分支推送到远程仓库。

撤销更改

  • ​git revert <commit>​:创建一个新的提交,这个提交会撤销指定提交的更改。

  • git reset --hard <commit>​:将当前分支重置到指定提交。

删除文件

  • ​git rm <file>​:从工作目录中删除文件并添加到暂存区。

  • git rm --cached <file>​:把文件从暂存区删除,但保留在当前工作区中。

查看历史

  • git log​:显示提交日志。

  • ​git log --oneline​:简洁显示提交日志。

  • git show <commit>​:显示指定提交的完整差异。

  • ​git log --oneline --graph --decorate --all​:查看图形化的提交日志。

    ​alias graph="git log --oneline --graph --decorate --all"​:由于这个命令太长,我们通过这个设置,就能直接使用graph​就能查看图形化的提交日志啦。

标签管理

  • git tag <tag>​:创建一个新标签。

  • git tag -d <tag>​:删除一个标签。

  • git push <remote> --tags​:推送所有本地标签到远程仓库。

其他

  • git stash​:将当前工作进度保存到堆栈。

  • ​git stash pop​:从堆栈中恢复工作进度。

  • ​git submodule <command>​:管理子模块。

这些命令是Git日常使用的基础,但Git的功能远不止这些。为了更好地掌握Git,建议阅读官方文档,并实际操作以加深理解。

细节展示

git中的特殊文件

  • .git:Git仓库的元数据和对象数据库

  • .gitignore:忽略文件,不需要提交到仓库的文件

  • .gitattributes:指向当前分⽀的指针

  • .gitkeep:使空⽬录被提交到仓库

  • .gitmodules:记录⼦模块的信息

  • .gitconfig:记录仓库的配置信息

工作区域

文件状态

Git Reset的三种模式

同步仓库

Merge

  • 优点:不会破坏原分支的提交历史,方便回溯和查看。

  • 缺点:会产生额外的提交节点,分支图比较复杂。

Rebase

  • 优点:不会新增额外的提交记录,形成线性历史,比较直观和干净。

  • 缺点:会改变提交历史,改变了当前分支branch out的节点。

避免在共享分支使用

参考