Kerry 的筆記本
  • Table of contents
  • Kerry的Mac裝機必要
  • ASP.NET Core 教育訓練文件
    • .NET 9 OpenAPI 介紹與教學
    • 目錄
    • ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal
    • ASP.NET Core Authentication系列(三)Cookie選項
    • ASP.NET Core Authentication系列(二)實現認證、登錄和註銷
    • ASP.NET Core Authentication系列(四)基於Cookie實現多應用間單點登錄(SSO)
    • ASP.NET Core Consul 教學
    • ASP.NET Core Hangfire 排程管理
    • ASP.NET Core KeyCloak 實作
    • ASP.NET Core NLog-依照Environment使用Nlog.Config檔案
    • ASP.NET Core NLog-如何使用 NLog 將 log 寫到檔案
    • ASP.NET Core Nlog-發送訊息到ElasticSearch
    • 目錄
    • ASP.NET Core Quartz.NET 管理介面
    • ASP.NET Core RDLC 報表設計
    • ASP.NET Core SFTP (使用第三方套建 SSH.Net) - 類別庫為案例
    • ASP.NET Core 中使用 HttpReports 進行接口統計,分析, 可視化, 監控,追踪等
    • ASP.NET 使用 MassTransit 與 RabbitMQ,實現事件發佈、訂閱
    • Asp.Net Core 分散式Session – 使用 Redis
    • ASP.NET Core 前台會員修改個人資料
    • ASP.NET Core 前台會員忘記密碼與重設密碼
    • ASP.NET Core 前台會員登入
    • ASP.NET Core 前台會員註冊
    • ASP.NET Core 呼叫 API 發生 CORS 錯誤
    • ASP.NET Core 如何套網頁設計樣版
    • ASP.NET Core 客製化Model Validation 預設錯誤訊息
    • ASP.NET Core 後台查詢頁面教學
    • ASP.NET Core 網站生命週期
    • ASP.NET Feature Management 使用說明與教學
    • ASP.NET RulesEngine 介紹
    • ASP.NET WinForms APP 程式安裝檔
    • LinePay 支付完成後返回 LINE 應用而不跳出外部瀏覽器
    • EntityFramework
      • EF Core Migrations 完整教學手冊
      • EntityFramework Core DB Migrations
      • 使用 Entity Framework Core (EF Core) 的 Migrations 功能進行版本控制
    • NET 6
      • .NET 6 Autofac範例
      • .NET 6 Automapper範例
      • .NET 6 BenchmarkDotNet範例
      • .NET 6 Bogus範例
      • .NET 6 Dapper範例
      • .NET 6 Dapper語法說明
      • .NET 6 EFCore範例
      • .NET 6 EFCore語法說明
      • .NET 6 EPPlus圖表範例
      • .NET 6 EPPlus範例
      • .NET 6 Hangfire範例
      • .NET 6 HttpClient單元測試範例
      • .NET 6 MailKit前置作業
      • .NET 6 MailKit範例
      • .NET 6 Moq範例
      • .NET 6 NLog範例
      • .NET 6 NLog進階範例
      • .NET 6 Serilog範例
      • .NET 6 Serilog進階範例
      • .NET 6 Telegram.Bot前置作業
      • .NET 6 Telegram.Bot範例
      • .NET 6 Text.Json範例
      • .NET 6 swagger授權
      • .NET 6 swagger範例
      • .NET 6 xUnit範例
      • .NET 6 取得appsettings檔案內容
      • .NET 6 更改回傳Json時為大駝峰命名
      • .NET 6 解決System.Text.Json序列化後會將所有非ASCII轉為Unicode
    • WDMIS
      • CORS
      • FeatureManagement
      • Serilog
      • Spectre.Console
      • 資料模型實戰:從 MSSQL 設計到 .NET 8 WebAPI 實作(以刀具管理為例)
  • Azure
    • 如何在 ASP.NET CORE 5.0 WEB 應用程序中實現 AZURE AD 身份驗證
    • Azure App Configuration 使用教學
    • Azure Blob Storage
    • Azure DevOps 持續整合(CI) + Artifacts
  • CSharp
    • ASP.NET await 與 wait 的差異
    • AutoMapper —— 類別轉換超省力
    • C# 中的 HTTPClient — 入門指南
    • C# 正則表達式:從零到英雄指南
    • C# 集合, List<> 取交集、差集、聯集的方法
    • C#單元測試教學
    • CORS 介紹與設定方式
    • CSharp Coding Conventions
    • Using jQuery Unobtrusive AJAX in ASP.NET Core Razor Pages
    • 深入Dapper.NET源碼
    • 菜雞與物件導向
      • 菜雞與物件導向 (0): 前言
      • 菜雞與物件導向 (1): 類別、物件
      • 菜雞與物件導向 (10): 單一職責原則
      • 菜雞與物件導向 (11): 開放封閉原則
      • 菜雞與物件導向 (12): 里氏替換原則
      • 菜雞與物件導向 (13): 介面隔離原則
      • 菜雞與物件導向 (14): 依賴反轉原則
      • 菜雞與物件導向 (15): 最少知識原則
      • 菜雞與物件導向 (2): 建構式、多載
      • 菜雞與物件導向 (3): 封裝
      • 菜雞與物件導向 (4): 繼承
      • 菜雞與物件導向 (5): 多型
      • 菜雞與物件導向 (6): 抽象、覆寫
      • 菜雞與物件導向 (7): 介面
      • 菜雞與物件導向 (8): 內聚、耦合
      • 菜雞與物件導向 (9): SOLID
      • 菜雞與物件導向 (Ex1): 小結
  • DBeaver
    • 如何強制讓 DBeaver 在 Mac 上使用英文介面
  • DesignPattern
    • OAuth
    • Repository 模式 (Repository Pattern)
    • Single Sign On 實作方式介紹 (CAS)
    • 【SOP製作教學】新手適用,SOP範例、流程圖、製作流程全公開!
    • 【SOP製作教學】流程圖教學、重點範例、BPMN符號介紹!
    • 【SOP製作教學】流程圖符號整理、BPMN2.0進階符號教學!
    • 多奇數位 C# 程式碼撰寫規範 (C# Coding Guideline)
    • 軟體分層設計模式 (Software Layered Architecture Pattern)
    • 開源程式碼檢測平台 SonarQube
    • 菜雞新訓記
      • 菜雞新訓記 (0): 前言
      • 菜雞新訓記 (1): 使用 Git 來進行版本控制吧
      • 菜雞新訓記 (2): 認識 Api & 使用 .net Core 來建立簡單的 Web Api 服務吧
      • 菜雞新訓記 (3): 使用 Dapper 來連線到資料庫 CRUD 吧
      • 菜雞新訓記 (4): 使用 Swagger 來自動產生可互動的 API 文件吧
      • 菜雞新訓記 (5): 使用 三層式架構 來切分服務的關注點和職責吧
      • 菜雞新訓記 (6): 使用 依賴注入 (Dependency Injection) 來解除強耦合吧
      • 菜雞新訓記 (7): 使用 Fluent Validation 來驗證參數吧
  • DevOps
    • Repository 模式 (Repository Pattern)
    • pipeline工具研究
    • 單例模式 (Singleton Pattern)
    • 單元測試
    • 軟體分層設計模式 (Software Layered Architecture Pattern)
    • 雙重檢查鎖定模式 (Double-Checked Locking Pattern)
  • Docker
    • Docker 中部署 .NET 8 Web App 並支援 HTTPS
    • Docker指令大全
    • 第七章 安裝Nomad
    • Docker - 第三章 | 安裝 MSSQL
    • Docker - 第九章 | 安裝 datalust seq
    • 第二章 docker-compose 教學
    • Docker - 第五章 | 安裝 Redis
    • 第八章 安裝SonarQube
    • Docker - 第六章 | 安裝RabbitMQ
    • 第十一章 安裝 VtigerCRM
    • 第十二章 安裝KeyCloak
    • Docker - 第十章 | 安裝 Redmine
    • 第四章 安裝MySQL
    • Docker Desktop (含更改 Docker Image 路徑)
  • Git
    • Git Flow 指令大全(完整指令整理) 🚀
    • Git 安裝及配置SSH Key
    • Git 建立到上傳
    • 將現有專案的遠端儲存庫直接更改為新的儲存庫
    • Git 流程規劃
    • Git 語法大全
    • 30 天精通 Git 版本控管
      • 30 天精通 Git 版本控制
        • 第 01 天:认识 Git 版本控制
        • 第 02 天:在 Windows 平台必装的三套 Git 工具
        • 第 03 天:建立仓库
        • 第 04 天:常用的 Git 版本控制指令
        • 第 05 天:了解仓库、工作目录、物件与索引之间的关系
        • 第 06 天:解析 Git 资料结构 - 物件结构
        • 第 07 天:解析 Git 资料结构 - 索引结构
        • 第 08 天:关于分支的基本观念与使用方式
        • 第 09 天:比对文件与版本差异
        • 第 10 天:认识 Git 物件的绝对名称
        • 第 11 天:认识 Git 物件的一般参照与符号参照
        • 第 12 天:认识 Git 物件的相对名称
        • 第 13 天:暂存工作目录与索引的变更状态
        • 第 14 天: Git for Windows 选项设定
        • 第 15 天:标签 - 标记版本控制过程中的重要事件
        • 第 16 天:善用版本日志 git reflog 追踪变更轨迹
        • 第 17 天:关于合并的基本观念与使用方式
        • 第 18 天:修正 commit 过的版本历史记录 Part 1
        • 第 19 天:设定 .gitignore 忽略清单
        • 第 20 天:修正 commit 过的版本历史记录 Part 2
        • 第 21 天:修正 commit 过的版本历史记录 Part 3
        • 第 22 天:修正 commit 过的版本历史记录 Part 4 (Rebase)
        • 第 23 天:修正 commit 过的版本历史记录 Part 5
        • 第 24 天:使用 GitHub 远端仓库 - 入门篇
        • 第 25 天:使用 GitHub 远端仓库 - 观念篇
        • 第 26 天:多人在同一个远端仓库中进行版控
        • 第 27 天:通过分支在同一个远端仓库中进行版控
        • 第 28 天:了解 GitHub 的 fork 与 pull request 版控流程
        • 第 29 天:如何将 Subversion 项目汇入到 Git 仓库
        • 第 30 天:分享工作中几个好用的 Git 操作技巧
      • zh-tw
        • 第 01 天:認識 Git 版本控管
        • 第 02 天:在 Windows 平台必裝的三套 Git 工具
        • 第 03 天:建立儲存庫
        • 第 04 天:常用的 Git 版本控管指令
        • 第 05 天:了解儲存庫、工作目錄、物件與索引之間的關係
        • 第 06 天:解析 Git 資料結構 - 物件結構
        • 第 07 天:解析 Git 資料結構 - 索引結構
        • 第 08 天:關於分支的基本觀念與使用方式
        • 第 09 天:比對檔案與版本差異
        • 第 10 天:認識 Git 物件的絕對名稱
        • 第 11 天:認識 Git 物件的一般參照與符號參照
        • 第 12 天:認識 Git 物件的相對名稱
        • 第 13 天:暫存工作目錄與索引的變更狀態
        • 第 14 天: Git for Windows 選項設定
        • 第 15 天:標籤 - 標記版本控制過程中的重要事件
        • 第 16 天:善用版本日誌 git reflog 追蹤變更軌跡
        • 第 17 天:關於合併的基本觀念與使用方式
        • 第 18 天:修正 commit 過的版本歷史紀錄 Part 1
        • 第 19 天:設定 .gitignore 忽略清單
        • 第 20 天:修正 commit 過的版本歷史紀錄 Part 2
        • 第 21 天:修正 commit 過的版本歷史紀錄 Part 3
        • 第 22 天:修正 commit 過的版本歷史紀錄 Part 4 (Rebase)
        • 第 23 天:修正 commit 過的版本歷史紀錄 Part 5
        • 第 24 天:使用 GitHub 遠端儲存庫 - 入門篇
        • 第 25 天:使用 GitHub 遠端儲存庫 - 觀念篇
        • 第 26 天:多人在同一個遠端儲存庫中進行版控
        • 第 27 天:透過分支在同一個遠端儲存庫中進行版控
        • 第 28 天:了解 GitHub 的 fork 與 pull request 版控流程
        • 第 29 天:如何將 Subversion 專案匯入到 Git 儲存庫
        • 第 30 天:分享工作中幾個好用的 Git 操作技巧
  • Hands-On Labs - LineBotSDK 實作手札 (C#, .net core)
    • 00. 如何申請LINE Bot
    • CLI
      • 使用CLI來發送新的Channel Access Token(LINE Bot)
      • 使用CLI免費發送LINE Notify通知
    • basic
      • 如何發送LINE訊息(Push Message)
      • 如何發送LINE Template Messages
      • 如何發送ImageMap訊息
      • 如何發送Flex Message
      • 如何在訊息後面加上QuickReply快捷選項
    • liff
      • Lab 21: 建立第一個LIFF應用
    • webhook
      • 如何建立可Echo的基本LINE Bot
      • 如何在WebHook中取得用戶個人資訊(名稱、頭像、狀態)
      • 如何在WebHook中取得用戶上傳的圖片(Bytes)
  • Markdown
    • Markdown Cheatsheet 中文版
    • Markdown語法大全
    • 使用HackMD建立書本目錄
    • 使用HackMD建立簡報
  • SAP ABAP
    • ABAP開發環境和總體介紹
    • SAP MM模塊常用表總結
    • SAP QM數據庫表清單
    • SAP欄位與表的對應關係
  • SQL Server
    • [SQL SERVER] Like in
    • SQL Server 中,移除資料庫中所有的關聯限制
    • SQL Server 刪除資料庫中所有資料表
    • SQL Server View、Function 及 Stored Procedure 定義之快速備份
    • SSMS v18 清除登入畫面中,下拉選單歷史紀錄
    • [MS SQL]如何透過Database Mail進行郵件發送
    • [SQL SERVER]撰寫Stored Procedure小細節
    • 使用 Data Migration Assistant 移轉 SQL Server 資料庫與帳戶
    • 使用SSIS創建同步資料庫數據任務
  • Tools
    • 免費 FTP 伺服器 FileZilla Server 安裝教學 (新版設定)
  • VisualStudio
    • .NET CLI 指令碼介紹
    • Visual Studio 使用 Git 版本控制
    • 使用 Visual Studio 2022 可透過 .editorconfig 鎖定文字檔案的儲存編碼格式分享
  • Web API
    • ASP.NET Core 6 Web API 進行 JWT 令牌身份驗證
    • [ASP.NET Core]如何使用SwaggerAPI說明文件
    • ASP.NET Core Web Api實作JWT驗證筆記
    • ECFIT API 範例
    • JWT Token Authentication And Authorizations In .Net Core 6.0 Web API
    • 微服務架構 - 從狀態圖來驅動 API 的設計
  • Windows
    • [C#] 伺服器監控常用語法 (事件檢視器、CPU 硬碟使用率、程式執行狀況)
    • Configure IIS Web Server on Windows Server 2019
    • Log Paser Studio 分析 IIS W3C Log
    • Windows Server 2019 如何安裝 IIS 運行 ASP.NET 專案
    • 如何檢查安裝在 IIS 上的 .NET Core Hosting Bundle 版本
    • [IIS] 如何解決網站第一個請求 Request 特別慢 ?
    • IIS 不停機更版設置
    • SQL Server 2019 Standard 繁體中文標準版安裝
    • WINDOWS共用資料夾的網路認證密碼放在哪?如何清除?
    • 如何設定 ASP.NET CORE 網站應用程式持續執行在 IIS 上
  • 專案管理
    • SSDLC (Secure Software Development Life Cycle)
    • 系統開發原則
    • MIS及專案管理-使用Redmine
      • 第10章 - [日常管理]MIS部門週會工作進度追蹤
      • 第11章 - [日常管理]MIS部門主管月會報告管理
      • 第12章 - [日常管理]機房工作日誌
      • 第13章 - [日常管理]MIS部門耗用工時及工作進度檢討
      • 第14章 - [日常管理]MIS文件知識庫
      • 第15章 - [日常管理]整理及管理分享
      • 第16章 - [異常管理]使用者問題回報系統
      • 第17章 - [異常管理]資安事件及異常紀錄
      • 第18章 - [異常管理]整理及管理分享
      • 第19章 - [變革管理]MIS的專案及專案管理五大階段
      • 第1章 - [MIS及專案管理]中小企業MIS的鳥事
      • 第20章 - [變革管理]MIS的新專案管理:起始階段
      • 第21章 - [變革管理]MIS的新專案管理:規劃階段
      • 第22章 - [變革管理]MIS的新專案管理:執行階段
      • 第23章 - [變革管理]MIS的新專案管理:監控階段
      • 第24章 - [變革管理]MIS的新專案管理:結束階段
      • 第25章 - [變革管理]整理及管理分享
      • 第26章 - [ISMS管理]ISMS平台整體規劃
      • 第27章 - [ISMS管理]ISMS文管中心
      • 第28章 - [ISMS管理]ISMS表單紀錄的管理
      • 第29章 - [ISMS管理]整理及管理分享
      • 第2章 - [MIS及專案管理]專案管理的概念及MIS應用
      • 第30章 - 初心、來時路及感謝:系列文章總結回顧
      • 第3章 - [MIS及專案管理]管理工具的選擇
      • 第4章 - [Redmine]Redmine的安裝及設定
      • 第5章 - [Redmine]Redime系統邏輯說明
      • 第6章 - [Redmine]自行建立及維護表單
      • 第7章 - [Redmine]專案版面的規劃
      • 第8章 - [日常管理]AR管理
      • 第9章 - [日常管理]資訊服務申請
  • 微服務架構
    • DDD + CQRS + MediatR 專案架構
    • 微服務架構 #2, 按照架構,重構系統
    • 淺談微服務與網站架構的發展史
    • API First Workshop 設計概念與實做案例
      • API First #1 架構師觀點 - API First 的開發策略 - 觀念篇
      • API First #2 架構師觀點 - API First 的開發策略 - 設計實做篇
    • 基礎建設 - 建立微服務的執行環境
      • Part #1 微服務基礎建設 - Service Discovery
      • Part #2 微服務基礎建設 - 服務負載的控制
      • Part #3 微服務基礎建設 - 排隊機制設計
      • Part #4 可靠的微服務通訊 - Message Queue Based RPC
      • Part #5 非同步任務的處理機制 - Process Pool
    • 實做基礎技術 API & SDK Design
      • API & SDK Design #1, 資料分頁的處理方式
      • API & SDK Design #2, 設計專屬的 SDK
      • API & SDK Design #3, API 的向前相容機制
      • API & SDK Design #4, API 上線前的準備 - Swagger + Azure API Apps
      • API & SDK Design #5 如何強化微服務的安全性 API Token JWT 的應用
    • 建構微服務開發團隊
      • 架構面試題 #1, 線上交易的正確性
      • 架構面試題 #2, 連續資料的統計方式
      • 架構面試題 #3, RDBMS 處理樹狀結構的技巧
      • 架構面試題 #4 - 抽象化設計;折扣規則的設計機制
    • 架構師觀點 - 轉移到微服務架構的經驗分享
      • Part #1 改變架構的動機
      • Part #2 實際改變的架構案例
    • 案例實作 - IP 查詢服務的開發與設計
      • 容器化的微服務開發 #1 架構與開發範例
      • 容器化的微服務開發 #2 IIS or Self Host
  • 系統評估
    • RPA 與 WebAPI 評估
    • 數位轉型:從現有系統到數位化的未來
    • 數位轉型:從現有系統到數位化的未來
  • 面試
    • CV_黃子豪_2024
    • HR 問題集
    • .NET 工程師 面試問題集
    • 資深工程師 問題集
    • 資深開發人員 / 技術主管
    • 題目
Powered by GitBook
On this page
  • 文章目的
  • 转换的契机
  • 学习的方法
  • 认识 Git 版本控制
  • 今日小结
  • 参考连结
  1. Git
  2. 30 天精通 Git 版本控管
  3. 30 天精通 Git 版本控制

第 01 天:认识 Git 版本控制

笔者使用 Subversion (SVN) 已经将近 10 年,从来都不觉得有任何必要换成其他版本控制平台,直到前几年因为云端化的改变,慢慢转成 TFS 版本控制 (TFS Service),转变的过程还算顺利,只因为 SVN 与 TFS 的版本控制概念相近,都属于集中式版本控制系统。这类集中式版本控制系统,使用上简单、直观且容易进行权限控制,说真的,在大部分的开发情境下,Subversion 或 TFS 足够使用,那又是什么原因或是需求,迫使我们一定要转到 Git 版本控制呢?我相信,不同人采用 Git 一定有他的理由,有些人觉得好玩、有些人觉得新鲜、有些人觉得功能强大,无论如何,只要这个理由能够支持你去主动学习一个陌生技术,都是好的,本篇文章除了带大家认识 Git 版本控制机制外,也会说说我想转换到 Git 的理由。

文章目的

在软件开发领域,对源代码进行版本控制是非常重要的一件事,不同于 Subversion 或 TFVC (Team Foundation Version Control) 这类集中式版本控制系统,Git 是一套分布式版本控制系统(DVCS; Distributed Version Control System),并带来许多版本控制上的各种优势与解决传统集中式版本控制的缺失,例如支持本地操作、备份容易、功能强大且弹性的分支与合并等等。不过,由于 Git 版本控制无论在版控概念与工具使用上,都与传统集中式版控工具差异什大,因此造成了不小的学习门槛。

虽然说本次文章的主题是「30 天精通 Git 版本控制」,不过,说实在的,还真有点言过其实了,因为 Git 博大精深,有非常多细节可以探究,如果真的要应用在工作上,学几天可以真正上手呢?每天学一点,连续学习 30 天,似乎是个合理的数字 (或太多?),如果有一个工具大家都要用,而且要立刻上手的工具,如果学 30 天都还不知道怎么活用,那这学习门槛也太高了些。因此我想,这个系列的文章,主要还是专注于「如何在 30 天内学会 Git 版本控制,而且必须要能熟练的应用在实际开发工作上」,这才是本系列的真正目的,那些繁琐的细节,我不会特别强调,但总是有些重要的概念与细节还是不能错过,我会尝试在每一个主题中提到一部份,一有机会就会深入探讨,希望大家可以通过做中学,深刻体会 Git 版本控制的强大魅力。

转换的契机

这几个月,公司因为有个大型项目,参与开发人数超过 12 人,最后大家决定采用 Git 作为本次项目的版本控制机制,与其说我们采用了 Git 版本控制,其实真正采用的原因是「我们选择使用 GitHub 作为我们的版控平台」,原因就是 GitHub 平台实在整合得太好,完整的 Git 版控支持、问题追踪与管理、线上 Wiki 文件管理、友善的源代码审核(Code Review)介面。这些特性,都能有效协助我们在多人协同开发的过程中,減少团队沟通的问题。

刚开始接触 Git 说实在挺辛苦的,因为 Git 版本控制的观念,实在与 Subversion 差太多,没有办法很直观的去体会其差异,就算给了你 GUI 图形化工具介面,你也不见得就会使用。你知道的,一个强大又好用的工具在你手上,「错误的使用方式」比「不会用」还可怕!说穿了,就是你必须先建立一套思维模式(Mindset),了解 Git 的运行原理,然后再上手使用 Git 相关工具 (无论是指令列工具或图形化介面工具),才是正途!

学习的方法

我在刚学习 Git 的时候,看了好几本书 (其实是挑重点看),也看了许多线上的文章与简报,什至还看了好几部教学影片,看着看着,确实可以学会如何使用 Git 工具,我觉得并不会太过艰辛。不过,Git 的指令与参数非常多,完全超出大脑能记忆的范围,除非每天使用,否则哪有可能一天到晚打指令进行版控,如果每次要使用 Git 指令都要查书的话,那这也太没效率了点,当下的我就直觉地认为,学习 Git 最终还是要回归到好用的 GUI 工具,否则这东西在团队中可能不容易推广。

再者,因为 Git 是属于「分布式版本控制」机制,当开发人数开始变多,版本库又开始变成一人一份时,在第一次进行多人分支与合并的过程时,大家都饱受煎熬,而且持续一段不短的时间。虽然公司内部有先进行技术分享,不过由于大家都是第一次学,那些 Git 的抽象概念,还没办法深入人心,只能基于 Git 的使用方法进行分享,例如工具怎么用、有哪些常用的指令、什么特殊的情況下应该使用什么指令,诸如此类的。过程中就算说出复杂的原理,由于大家对于 Git 的认知还很模糊,不同人对 Git 版控方式的理解也不尽相同,所吸收到的知识与概念,也不一定一致。所以,虽然上完课了,大家还是需要好几天的时间不断磨合,相互讨论,互相解决问题,如果你只有一人使用 Git 的话,确实不容易感受 Git 带来的好处,也恐怕不容易坚持下去。

所以,我认为,要学好 Git 版本控制,若先知道以下几点,也许比较容易学会:

  • 先拥有 Git 基础该念,通过指令的方式学习是最快的方式,不要跳过这一段

  • 找多一点人跟你一起学 Git 版本控制,最好能直接用在实际的开发工作上

  • 团队中最好要有几个先遣部队,可以多学一点 Git 观念,好分享给其他人,或有人有问题时,能随时提供协助

  • 了解 Git 属于「分布式版本控制」,每个人都有一份完整的仓库(Repository),所以必须经常合并文件

  • 使用 Git 的时候,分支与合并是常态,但只要有合并,就会有冲突,要学会如何解决冲突

认识 Git 版本控制

Git 的出现,来自于 Linux 之父 "Linus Torvalds" 开发 Linux kernel 的时候,因为早期的版本控制方法非常没有效率,属集中式控制,当 Linux kernel 这类复杂又庞大的项目在进行版本控制时,出现了许多问题。最早期 Linux kernel 采用 BitKeeper 进行版本控制,但后来 Linus Torvalds 基于 BitKeeper 与 Monotone 的使用经验,设计出更棒的 Git 版控系统。原先 Git 只被设计成一个低阶的版控工具,用来当做其他版控系统(SCM)的操作工具,后来才渐渐演变成一套完整的版本控制系统。

有趣的是,Linus Torvalds 改采 Git 进行版本控制初期,由于 Git 太过复杂,许多版控观念跟以往差异太大,也受到世界各地开放源代码社群的反对,但经过几年的努力与发展,操作 Git 的相关工具也越来越成熟,才渐渐平抚反对的压力,从 2013 年的市场调查看来,全世界已有 30% 的开放源代码项目改采 Git 进行版本控制,这是个非常惊人的市占率,意味着 Git 绝对有其惊艳之处,不好好研究一番还不行呢!

讲到 Git 的架构,完全是基于 Linus Torvalds 在维护 Linux kernel 这个大型项目时得到的经验,以及他本身在文件系统优化方面的丰富经验进行设计,也因为这样,Git 包含了以下几个重要的设计:

  • 强力支持非线性开发模式 (分散式开发模式)

    • Git 拥有快速的分支与合并机制,还包括图形化的工具显示版本变更的历史路径。

    • Git 非常强调分支与合并,所以版本控制的过程中,你会不断的在执行分支与合并动作。

    • Git 的分支机制非常轻量,没有负担,每一次的分支只是某个 commit 的参考指标而已。

  • 分散式开发模型

    • 参与 Git 开发的每个人,都将拥有完整的开发历史记录。

    • 当开发人员第一次将 Git 版本库复制(clone)下来后,完全等同于这份 Git 版本库的「完整备份」。

    • 整个版本库中所有变更过的文件与历史记录,通通都会储存在本机仓库(local repository)。

  • 相容于现有操作系统

    • Git 版本库其实就只是一个资料夹而已,资料夹中有许多相关的设定档与各种 blob 物件文件而已。

    • Git 版本库可以用任何方式发布,所以你用 HTTP, FTP, rsync, SSH 甚至于用 Git protocol 都可以当成存取 Git 版本库的媒介,相容性极高。

  • 有效率的处理大型项目

    • 由于完整的版本库会复制(clone)一份在本机,该版本库包含完整的文件与版本变更记录,所以针对版本控制中的各种文件操作速度,将会比直接从远端存取来的快上百倍之多。

    • 这也代表着,Git 版本控制不会因为项目越来越大、文件越来越多,而导致速度变慢。

  • 历史记录保护

    • Git 版控的过程,每次 commit 都会产生一组 hash id 编号,而且每个版本在变化的过程都会参考到这个 hash id,只要 hash id 无法比对的上,Git 就会无法运作,所以当项目越来越大,版本库复制(clone)的越来越多份,你几乎无法窜改文件的内容或版本记录。

    • 请记得: 每个人都有一份完整的版本库,你改了原始的那份,所有人的版本库就无法再合并回原本的版本库了,所以你几乎不可能任意窜改版本记录。

  • 以工具集为主的设计 (Toolkit-based design)

    • Git 被设计成一个一个的工具软件(指令列工具),你可以很轻易的组合不同工具的使用,使用上非常弹性。

  • 弹性的合并策略 (Pluggable merge strategies)

    • Git 有一个拥有良好设计的「不完整合并(incomplete merge)」 机制,以及多种可以完成合并的演算法,并在最后告知使用者为何无法自动完成合并,或通知你需要手动进行合并动作。

  • 被动的垃圾回收机制

    • 在使用 Git 的时候,若想要中断目前的操作或回复上一个操作,都是可以的,你完全可以不必担心可能有其中一个指令下错,或指令执行到一半当机等问题。

    • Git 的垃圾回收机制,其实就是那些残留在文件系统中的无用文件,这个垃圾回收机制只会在这些无用的物件累积一段时间后自动执行,或你也可以自行下达指令清空它。例如: git gc --prune

  • 定期的封装物件

    • 我们在 Git 中提到的 "物件" 其实就是代表版本库中的一个文件。而在版本变动的过程中,项目中的代码或其他文件会被更新,每次更新时,只要文件内容不一样,就会建立一个新的 "物件",这些不同内容的文件全部都会保留下来。

    • 你应该可以想像,当一个项目越来越大、版本越来越多时,这个物件会越来越多,虽然每个文件都可以各自压缩让文件变小,不过过多的文件还是会文件存取变得越来越没效率。因此 Git 的设计有个机制可以将一群老旧的 "物件" 自动封装进一个封装档(packfile)中,以改善文件存取效率。

    • 那些新增的文件还是会以单一文件的方式存在着,也代表一个 Git 版本库中的 "文件" 就是一个 Git "物件",但每隔一段时间就会需要重新封装(repacking)。

    • 照理说 Git 会自动执行重新封装等动作,但你依然可以自行下达指令执行。例如: git gc

    • 如果你要检查 Git 维护的文件系统是否完整,可以执行以下指令: git fsck

关于 Git 的分散式版控系统,我再重申几件事:

  • Git 完全不需要服务器端的支持就可以运作版本控制,因为每个人都有一份完整的仓库副本。

  • 因为每个人都有一份完整的仓库副本,所以每次提交版本变更时,都仅提交到本地的仓库而已,因此提交速度非常快,也不用网络连线,可大幅节省开发时间。

  • 由于每个人都有一份完整的仓库副本,代表着在使用 Git 版本控制时,没有所谓的「权限控制」这件事,每个成员都能把仓库复制(clone)回来,也都可以在本地提交变更,没有任何权限可以限制。使用 Git 时,唯一能设定的权限是,你有没有权利存取上层仓库(upstream repository)或远端仓库(remote repository)的权限。

  • 如果需要跟別人交换变更后的版本,随时可以通过「合并」的方式进行,Git 拥有非常强悍的合并追踪(merge tracing)能力。

  • 要合并多人的版本,你只要有存取共用仓库(shared repository)的权限或管道即可。 例如:在同一台服务器上可以通过资料夹权限进行共用,或通过 SSH 远端存取另一台服务器的 Git 仓库,也可以通过 Web 服务器等方式来共用 Git 仓库。

今日小结

今天这篇只是个大致介绍,若看不太懂 Git 的设计理念没关系,你可以用一段时间之后再回来看这篇文章,或许会有更深一层的体会。

我觉得要写「认识 Git 版本控制」比教大家怎么用还难许多,以下我在列出一些 Git 相关连结,供大家进一步学习。

参考连结



Previous30 天精通 Git 版本控制Next第 02 天:在 Windows 平台必装的三套 Git 工具

Last updated 1 year ago

Git (software) - Wikipedia, the free encyclopedia
Pro Git Book
Git Magic - 繁体中文版
简介 Git 及使用
版本控制 - 维基百科,自由的百科全书
HOME
回目录
下一天:在 Windows 平台必装的三套 Git 工具