Git 從入門到精通

Git 從入門到精通

涵蓋了核心概念、常用命令、協作流程和高級技巧:

核心理念:

  • 版本控制: 記錄文件變化歷史,可回溯到任意版本。
  • 分布式: 每個開發者擁有完整的倉庫副本(包括完整歷史),可離線工作。
  • 快照(Snapshot): Git 記錄的是文件系統的快照,而非差異(雖然內部優化存儲)。
  • 三個區域:
    • 工作目錄 (Working Directory): 你實際看到和修改文件的地方。
    • 暫存區 (Staging Area / Index): 一個準備區,標記了哪些修改將要被提交。
    • 本地倉庫 (Local Repository): .git 目錄,存儲項目的完整歷史、元數據(如分支、標簽)。
  • 三種狀態:
    • 已修改 (Modified): 文件在工作目錄中被修改,但尚未放入暫存區。
    • 已暫存 (Staged): 修改的文件已放入暫存區,等待提交。
    • 已提交 (Committed): 數據已安全地保存在本地倉庫中。

第一部分:入門基礎 (Getting Started)

  1. 安裝:
    • 官網 (https://git-scm.com/) 下載對應操作系統的安裝包。
    • 安裝時注意選擇適合你環境的配置(如默認編輯器、PATH 環境變量)。
  2. 初始配置 (首次使用必做):
    • git config --global user.name "Your Name" (設置用戶名)
    • git config --global user.email "your.email@example.com" (設置郵箱)
    • git config --global core.editor "vim" (可選,設置默認文本編輯器,如 vscode, nano, vim)
    • git config --list (查看當前配置)
  3. 創建倉庫:
    • 初始化新倉庫: git init (在當前目錄創建新的空 Git 倉庫)
    • 克隆現有倉庫: git clone <repository_url> (將遠程倉庫完整復制到本地)
  4. 基本工作流 (單兵作戰):
    • 修改文件: 在工作目錄編輯文件 -> 狀態變為 Modified
    • 添加文件到暫存區: git add <file_name>git add . (添加所有修改/新文件) -> 狀態變為 Staged
    • 提交更改: git commit -m "Descriptive commit message" -> 狀態變為 Committed,快照存入本地倉庫。
    • 查看狀態: git status (查看工作目錄、暫存區狀態)
    • 查看歷史: git log (查看提交歷史) git log --oneline (簡潔歷史) git log -p (帶詳細差異)
  5. 忽略文件 (.gitignore):
    • 創建 .gitignore 文件,列出不想被 Git 跟蹤的文件/目錄模式(如編譯產物、日志、臨時文件、敏感信息)。
    • 規則支持通配符 (*, ?), 目錄 (/), 取反 (!)。

第二部分:分支與協作 (Branching & Collaboration)

  1. 分支 (Branch):
    • 概念: 輕量級的可移動指針,指向某個提交。用于隔離開發(新功能、修復 Bug)、實驗。
    • 創建分支: git branch <branch_name> (基于當前提交創建新分支)
    • 切換分支: git checkout <branch_name>git switch <branch_name> (更新工作目錄到該分支最新狀態)
    • 創建并切換: git checkout -b <new_branch>git switch -c <new_branch>
    • 查看分支: git branch (列出本地分支,* 表示當前分支) git branch -a (列出所有分支,包括遠程)
    • 刪除分支: git branch -d <branch_name> (安全刪除,需合并過) git branch -D <branch_name> (強制刪除未合并分支)
  2. 遠程倉庫 (Remote):
    • 概念: 托管在網絡上的倉庫(如 GitHub, GitLab, Bitbucket),用于團隊協作和備份。
    • 查看遠程: git remote -v
    • 添加遠程: git remote add <remote_name> <repository_url> (通常遠程默認名為 origin)
    • 拉取更新: git fetch <remote_name> (從遠程下載最新數據到本地倉庫的 remote/<remote_name>/<branch>不自動合并)
    • 拉取并合并: git pull <remote_name> <remote_branch> (相當于 git fetch + git merge origin/<remote_branch>)
    • 推送更新: git push <remote_name> <local_branch>:<remote_branch> (將本地分支推送到遠程分支,常用 git push origin main)
    • 跟蹤分支: git push -u origin <local_branch> (首次推送時設置上游跟蹤,后續可直接 git push)
  3. 合并 (Merge):
    • 概念: 將一個分支的更改集成到另一個分支。
    • 操作: 切換到目標分支 (如 main),執行 git merge <source_branch>
    • 結果: 創建一個新的“合并提交”(Merge Commit),該提交有兩個父提交。
    • 沖突解決: 當同一文件的同一區域在不同分支有不同修改時發生。需手動編輯文件(Git 會標記沖突內容),git add 解決后的文件,然后 git commit 完成合并。
  4. 變基 (Rebase):
    • 概念: 將當前分支的提交“重放”在目標分支(通常是更上游的分支,如 main)的最新提交之上。
    • 操作: 切換到要變基的分支 (如 feature),執行 git rebase <target_branch> (如 main)。
    • 結果: 歷史線變得線性、整潔,避免了不必要的合并提交。本質是重寫歷史!
    • 適用場景: 整理本地分支歷史、保持特性分支更新。
    • 黃金法則: 永遠不要變基已經推送到遠程倉庫且與他人共享的分支! (會導致協作混亂)
    • 交互式變基: git rebase -i <commit> (如 HEAD~3),可編輯、壓縮(squash)、刪除、重排提交。強大但需謹慎。
  5. 協作工作流:
    • 集中式工作流 (Centralized): 類似 SVN,所有人向一個 main 分支提交。簡單但易沖突。
    • 功能分支工作流 (Feature Branch): 每個新功能/修復在獨立分支開發,完成后通過 Pull Request (PR) / Merge Request (MR) 請求合并到 main。主流協作方式。
    • Gitflow: 更復雜的分支模型(main, develop, feature, release, hotfix 分支),適合有嚴格發布流程的項目。學習成本稍高。
    • Forking Workflow: 常用于開源項目。貢獻者 Fork 主倉庫到自己的賬號下,在 Fork 出的倉庫開發,然后向主倉庫發起 PR。

第三部分:進階技巧 (Advanced Techniques)

  1. 撤銷更改:
    • 丟棄工作目錄修改: git restore <file> (Git 2.23+) 或 git checkout -- <file>
    • 取消暫存: git restore --staged <file> (Git 2.23+) 或 git reset HEAD <file>
    • 撤銷最近提交:
      • 創建新提交撤銷: git revert <commit> (安全,推薦用于已推送的提交)
      • 移除提交 (重寫歷史): git reset [--soft|--mixed|--hard] <commit> (危險! 慎用于已推送提交)
        • --soft:移動 HEAD 和分支指針,保留修改在暫存區。
        • --mixed (默認):移動指針,保留修改在工作目錄(未暫存)。
        • --hard:移動指針,丟棄工作目錄和暫存區所有修改。
  2. 儲藏更改 (Stash):
    • 概念: 臨時保存工作目錄和暫存區的修改,以便切換分支處理其他事情。
    • 儲藏: git stashgit stash push -m "message"
    • 查看儲藏列表: git stash list
    • 應用儲藏: git stash apply [stash@{n}] (不刪除儲藏項) git stash pop [stash@{n}] (應用并刪除)
    • 刪除儲藏: git stash drop [stash@{n}]
  3. 標簽 (Tag):
    • 概念: 給某個重要的提交(如發布版本)打上永久標記。
    • 創建輕量標簽: git tag <tagname> (指向特定提交)
    • 創建附注標簽: git tag -a <tagname> -m "message" (包含打標者、日期、信息,是完整的 Git 對象)
    • 查看標簽: git tag git show <tagname>
    • 推送標簽: git push origin <tagname>git push origin --tags (推送所有標簽)
  4. 子模塊 (Submodule):
    • 概念: 將一個 Git 倉庫作為另一個倉庫的子目錄嵌套使用。
    • 添加子模塊: git submodule add <repository_url> <path>
    • 克隆包含子模塊的倉庫: git clone --recurse-submodules <repository_url>git clonegit submodule update --init --recursive
    • 更新子模塊: 進入子模塊目錄手動 git pullgit submodule update --remote
    • 注意: 管理較復雜,需謹慎使用。
  5. 二分查找 (Bisect):
    • 概念: 自動化地使用二分搜索定位引入 Bug 的提交。
    • 開始: git bisect start
    • 標記壞提交: git bisect bad [commit] (通常當前 HEAD 是壞的)
    • 標記好提交: git bisect good <commit> (已知沒有 Bug 的提交)
    • 測試與標記: Git 會自動檢出中間提交,你測試并標記 git bisect goodgit bisect bad,重復直到找到第一個壞提交。
    • 結束: git bisect reset
  6. 鉤子 (Hooks):
    • 概念: 在特定 Git 操作(如 commit, push, pre-receive)前后自動觸發的自定義腳本(位于 .git/hooks/)。
    • 常見用途: 代碼風格檢查、測試運行、提交信息格式校驗、部署觸發。
    • 注意: 鉤子腳本不隨倉庫分發.git/hooks/ 不被跟蹤),需其他機制共享(如模板)。
  7. Reflog:
    • 概念: 記錄本地倉庫中 HEAD 和分支指針移動的歷史日志,是后悔藥
    • 查看: git refloggit reflog show <branch>
    • 用途: 恢復誤刪的分支、找回丟失的提交(即使 reset --hard 過)、理解操作歷史。

第四部分:精通與最佳實踐 (Mastery & Best Practices)

  1. 理解 Git 內部原理 (提升故障診斷能力):
    • 對象: Blob (文件內容), Tree (目錄結構), Commit (提交信息、父提交指針、Tree), Tag (標簽)。
    • 引用 (Refs): 分支 (refs/heads/), 標簽 (refs/tags/), 遠程跟蹤分支 (refs/remotes/), HEAD (指向當前檢出的提交或分支)。
    • 存儲: 對象存儲在 .git/objects/ 中,通過 SHA-1 哈希值尋址。
    • 打包: Git 自動打包松散對象以節省空間 (git gc)。
  2. 編寫優秀的提交信息 (Commit Message):
    • 格式:
      • 第一行:簡短摘要 (<50字符),動詞開頭,說明做了什么。
      • 空一行。
      • 詳細描述:解釋為什么做這些改動,解決了什么問題,可能的影響。使用現在時態。
    • 參考規范: Conventional Commits。
  3. 高效工作流:
    • 頻繁提交: 小步快跑,每個提交聚焦一個邏輯更改。
    • 善用分支: 隔離開發,避免在主分支直接修改。
    • 保持主分支穩定: main/master 分支應總是可部署狀態。
    • Code Review: 使用 PR/MR 進行代碼審查是提高質量的關鍵。
    • 定期拉取更新: 減少合并沖突。
    • 清理分支: 合并/廢棄后及時刪除本地和遠程分支。
  4. 處理大型倉庫/文件:
    • Git LFS (Large File Storage): 將大文件(二進制、媒體)存儲在外部服務器,倉庫中只存指針。
    • 淺克隆: git clone --depth=1 (只克隆最近一次提交,節省空間和時間)。
    • 稀疏檢出: git sparse-checkout (只檢出倉庫的指定子目錄)。
  5. 選擇 GUI 工具 (輔助理解):
    • 官方: git gui (提交工具), gitk (歷史查看器)。
    • 第三方: Sourcetree, Fork, GitKraken, VS Code GitLens, GitHub Desktop, Tower 等。可視化操作有助于理解分支關系、提交歷史。
  6. 持續學習:
    • 官方文檔: git help <command> 或 https://git-scm.com/doc 是最權威的參考。
    • Pro Git 書籍: https://git-scm.com/book/en/v2 (免費在線,非常全面)。
    • 社區: Stack Overflow, Git 官方郵件列表/論壇。

關鍵警告:

  • 謹慎使用 git reset --hardgit push --force (或 git push --force-with-lease): 它們會重寫歷史。如果歷史已被推送到共享遠程倉庫,強制推送會破壞其他協作者的工作。僅在絕對必要且了解后果時使用(如在個人分支上整理未推送的本地提交)。
  • 理解 rebase vs merge 選擇哪種取決于團隊約定和對歷史整潔度的要求。變基提供更干凈的歷史,但操作不當風險更高(尤其是在共享分支上)。

總結:

從入門到精通 Git 是一個循序漸進的過程:

  1. 掌握基礎: init, clone, add, commit, status, log, .gitignore
  2. 理解分支與協作: branch, checkout/switch, fetch, pull, push, merge, 沖突解決。
  3. 提升效率: rebase, stash, tag, revert, 撤銷操作。
  4. 深入原理與高級: 理解對象模型、Reflog、鉤子、二分查找、子模塊、內部命令。
  5. 實踐最佳實踐: 優秀提交信息、高效工作流、善用工具、安全操作。

實踐是最好的老師! 多動手操作,遇到問題善用 git help 和搜索。理解 Git 的思維方式(快照、分支指針)比死記命令更重要。祝你 Git 之旅順利!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90990.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UE5多人MOBA+GAS 30、技能升級機制

文章目錄前言技能的升級修改一下按鍵的輸入判斷是否滿級在ASC中升級技能由角色的輸入調用ASC的升級功能技能圖標的優化技能升級材質&#xff0c;可升級技能圖標的閃爍刷新技能升級后的藍耗和CD&#xff0c;以及藍不夠時技能進入灰色狀態修復傷害數字特效只顯示3位數的問題前言 …

筆試——Day22

文章目錄第一題題目思路代碼第二題題目&#xff1a;思路代碼第三題題目&#xff1a;思路代碼第一題 題目 添加字符 思路 枚舉所有字符串a與字符串b相對應的位置 代碼 第二題 題目&#xff1a; 數組變換 思路 貪心 以最大值為基準元素&#xff0c;判斷其他元素能否變為最…

__getattr__和 __getattribute__ 的用法

1、__getattr__ 的用法當實例對象訪問一個不存在的屬性時&#xff0c;會執行 __getattr__ 方法&#xff0c;如果屬性存在的話&#xff0c;就不會執行案例 class Person:def __init__(self, name, age):self.name nameself.age agedef get_info(self):return f"name: {se…

信息化項目驗收測試實戰指南

在當今數字化轉型的大背景下&#xff0c;信息化項目驗收建設已成為企業提升運營效率、優化管理流程的重要手段。然而&#xff0c;很多企業在投入大量資金建設信息系統后&#xff0c;卻常常面臨系統上線后無法滿足實際業務需求的困境。究其原因&#xff0c;往往是由于忽視了信息…

牛頓拉夫遜法PQ分解法計算潮流MATLAB程序計算模型。

牛頓拉夫遜法&PQ分解法計算潮流MATLAB程序計算模型。本程序模型基于MATLAB進行潮流計算&#xff0c;建議先安裝matpower插件&#xff08;MATLAB中非常重要的潮流計算的插件&#xff09;。本程序可進行牛拉法和PQ分解法潮流計算的切換&#xff0c;對比潮流計算的結果。很適合…

Go語言實戰案例-計算字符串編輯距離

在自然語言處理、拼寫糾錯、模糊搜索等場景中,我們經常需要衡量兩個字符串之間的相似度。編輯距離(Edit Distance) 就是一個經典的衡量方式,它描述了將一個字符串轉換為另一個字符串所需的最少操作次數。 一、問題定義:什么是編輯距離? 編輯距離,也稱為 Levenshtein Di…

Java時間與日期常用方法

DateDate date new Date(); //獲取當前時間 System.out.println(date.getYear() 1900); // 必須加上1900 System.out.println(date.getMonth() 1); // 0~11&#xff0c;必須加上1 System.out.println(date.getDate()); // 1~31&#xff0c;不能加1Ca…

【MySQL】從連接數據庫開始:JDBC 編程入門指南

個人主頁&#xff1a;?喜歡做夢 歡迎 &#x1f44d;點贊 ?關注 ??收藏 &#x1f4ac;評論 目錄 &#x1f31f;一、什么是JDBC&#xff1f; &#x1f31f;二、JDBC編程的步驟 ?使用步驟 ?DriverManger &#x1f4ab;定義 &#x1f4ab;DriverManger的主要功能 …

重生之我在暑假學習微服務第一天《MybatisPlus-上篇》

本系列參考黑馬程序員微服務課程&#xff0c;有興趣的可以去查看相關視頻&#xff0c;本系列內容采用漸進式方式講解微服務核心概念與實踐方法&#xff0c;每日更新確保知識點的連貫性。通過系統化學習路徑幫助開發者掌握分布式系統構建的關鍵技術。讀者可通過平臺訂閱功能獲取…

odoo-060 git版本:發布/生產版本落后開發版本部署

文章目錄問題起源目前解決問題起源 周五提交了一個版本&#xff0c;本來打算使用這個版本的&#xff0c;周末更新。 下一個功能比較復雜&#xff0c;周一提交&#xff0c;結果周末沒有更新&#xff0c;導致現在還有沒測試過的不能發布的。 說明&#xff1a; 原來只有一個mast…

YotoR模型:Transformer與YOLO新結合,打造“又快又準”的目標檢測模型

【導讀】在目標檢測領域&#xff0c;YOLO系列以其高效的推理速度廣受歡迎&#xff0c;而Transformer結構則在精度上展現出強大潛力。如何兼顧二者優勢&#xff0c;打造一個“又快又準”的模型&#xff0c;是近年來研究熱點之一。本文介紹的一項新研究——YotoR&#xff08;You …

白楊SEO:流量的本質是打開率?搞用戶搜索流量的玩法怎么做?

大家好&#xff0c;我是白楊SEO&#xff0c;專注研究SEO十年以上&#xff0c;全網SEO流量實戰派&#xff0c;AI搜索優化研究者。上周六參加了生財航海家在杭州舉行的私域運營大會&#xff0c;主題是圍繞私域獲客&#xff0c;私域IP&#xff0c;AI私域&#xff0c;精細化管理。白…

Java優雅使用Spring Boot+MQTT推送與訂閱

在物聯網&#xff08;IoT&#xff09;和智能設備橫行的今天&#xff0c;你有沒有遇到這樣的問題&#xff1a;服務端需要實時把報警、狀態更新、控制指令推送給客戶端&#xff1b;安卓 App、嵌入式設備、網頁等終端&#xff0c;需要輕量且穩定的連接方式&#xff1b;HTTP 太“重…

多目標粒子群優化(MOPSO)解決ZDT1問題

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

Coze Studio概覽(三)--智能體管理

本文簡要分析了Coze Studio中智能體管理功能&#xff0c;包括功能、架構以及核心流程。Coze Studio 智能體管理功能分析 1. 智能體管理架構概覽 Coze Studio的智能體管理系統基于DDD架構&#xff0c;主要包含以下核心模塊&#xff1a; 后端架構層次&#xff1a; API層 (coze): …

idea運行tomcat日志亂碼問題

原因在于idea和tomcat文件編碼格式不一樣。可以把idea編碼改成UTF-8 File | Settings | Editor | File Encodings 里面把GBK都改成UTF-8help里面 Edit Custom VM Options 添加一行-Dfile.encodingUTF-8重啟idea

Javaweb - 13 - AJAX

發送請求的幾種方式1. 瀏覽器的地址框中輸入地址&#xff0c;回車2. html --> head --> scrip / linkimg 自動發送請求&#xff0c;無需手動觸發3. a 標簽&#xff0c;form 表單標簽需要手動控制提交產生&#xff0c;且往往需要在新的頁面上獲得響應信息4. 運行 JS 代碼…

qt常用控件-06

文章目錄qt常用控件-06spinBox/doubleSpinBoxdateTimeEditdialSliderlistWIdgettableWidgettreeWidget結語很高興和大家見面&#xff0c;給生活加點impetus&#xff01;&#xff01;開啟今天的編程之路&#xff01;&#xff01; 今天我們進一步c11中常見的新增表達 作者&#…

小智源碼分析——音頻部分(二)

一、利用創建好的對象來調用音頻服務 上周從上圖的getaudiocode()方法進去感受了一下底層小智的構造如何實現。所以用一個codec來接收我們所構造的音頻對象。下來是用構造好的音頻對象來調用音頻初始化服務Initialize&#xff0c;因為啟動函數Application函數的類中有audio_ser…

菜鳥的C#學習(四)

文章目錄一、格式說明符1.1、數字格式說明符&#xff08;適用于數值類型&#xff1a;int, double, decimal 等&#xff09;1. 標準數字格式2. 自定義數字格式1.2、日期時間格式說明符&#xff08;適用于 DateTime, DateTimeOffset&#xff09;1. 標準日期時間格式2. 自定義日期…