Wilhel

Wilhel

版本控制(Git)

Git 的命令行接口#

Pro Git 中文版: https://git-scm.com/book/zh/v2

基礎#

  • git help <command>: 獲取 git 命令的幫助信息
  • git init: 創建一個新的 git 倉庫,其數據會存放在一個名為 .git 的目錄下
  • git status: 顯示當前的倉庫狀態
  • git add <filename>: 添加文件到暫存區
  • git commit: 創建一個新的提交
  • git log: 顯示歷史日誌
  • git log --all --graph --decorate: 可視化歷史記錄(有向無環圖)
  • git diff <filename>: 顯示與暫存區文件的差異
  • git diff <revision> <filename>: 顯示某個文件兩個版本之間的差異
  • git checkout <revision>: 更新 HEAD 和目前的分支

分支和合併#

  • git branch: 顯示分支
  • git branch <name>: 創建分支
  • git checkout -b <name>: 創建分支並切換到該分支
    • 相當於 git branch <name>; git checkout <name>
  • git merge <revision>: 合併到當前分支
  • git mergetool: 使用工具來處理合併衝突
  • git rebase: 將一系列補丁變基(rebase)為新的基線

遠端操作#

  • git remote: 列出遠端
  • git remote add <name> <url>: 添加一個遠端
  • git push <remote> <local branch>:<remote branch>: 將對象傳送至遠端並更新遠端引用
  • git branch --set-upstream-to=<remote>/<remote branch>: 創建本地和遠端分支的關聯關係
  • git fetch: 從遠端獲取對象 / 索引
  • git pull: 相當於 git fetch; git merge
  • git clone: 從遠端下載倉庫

撤銷#

  • git commit --amend: 編輯提交的內容或信息
  • git reset HEAD <file>: 恢復暫存的文件
  • git checkout -- <file>: 丟棄修改
  • git restore: git2.32 版本後取代 git reset 進行許多撤銷操作

Git 高級操作#

  • git config: Git 是一個 高度可定制的 工具
  • git clone --depth=1: 淺克隆(shallow clone),不包括完整的版本歷史信息
  • git add -p: 交互式暫存
  • git rebase -i: 交互式變基
  • git blame: 查看最後修改某行的人
  • git stash: 暫時移除工作目錄下的修改內容
  • git bisect: 通過二分查找搜索歷史記錄
  • .gitignore指定 故意不追蹤的文件

雜項#

  • 圖形用戶界面: Git 的 圖形用戶界面客戶端 有很多,但是我們自己並不使用這些圖形用戶界面的客戶端,我們選擇使用命令行接口
  • Shell 集成: 將 Git 狀態集成到您的 shell 中會非常方便。(zshbash)。Oh My Zsh這樣的框架中一般以及集成了這一功能
  • 編輯器集成: 和上面一條類似,將 Git 集成到編輯器中好處多多。fugitive.vim 是 Vim 中集成 GIt 的常用插件
  • 工作流: 我們已經講解了數據模型與一些基礎命令,但還沒討論到進行大型項目時的一些慣例 ( 有很多 不同的 處理方法)
  • GitHub: Git 並不等同於 GitHub。 在 GitHub 中您需要使用一個被稱作拉取請求(pull request)的方法來向其他項目貢獻代碼
  • 其他 Git 提供商: GitHub 並不是唯一的。還有像 GitLab 和 BitBucket 這樣的平台。

資源#

課後練習#

  1. 如果您之前從來沒有用過 Git,推薦您閱讀 Pro Git 的前幾章,或者完成像 Learn Git Branching 這樣的教程。重點關注 Git 命令和數據模型相關內容;
  2. Fork 本課程網站的倉庫
    1. 將版本歷史可視化並進行探索
      Git log --all --graph --decorate
      
    2. 是誰最後修改了 README.md 文件?(提示:使用 git log 命令並添加合適的參數)
      git log -1 README.md
      
      • -x 選項:查看最新的 x 次提交或特定文件的版本信息
    3. 最後一次修改 _config.yml 文件中 collections: 行時的提交信息是什麼?(提示:使用 git blame 和 git show
      git blame _config.yml | grep collections
      git show --pretty=format:"%s" a88b4eac | head -1
      git log --pretty=format:"%s" a88b4eac -1
      
  3. 使用 Git 時的一個常見錯誤是提交本不應該由 Git 管理的大文件,或是將含有敏感信息的文件提交給 Git 。嘗試向倉庫中添加一個文件並添加提交信息,然後將其從歷史中刪除 ( 這篇文章也許會有幫助);
    1. 首先提交一些敏感信息
      echo "password123">my_password
      git add .
      git commit -m "add password123 to file"
      git log HEAD
      
    2. 使用 git filter-branch 清除提交記錄
        git filter-branch --force --index-filter\
        'git rm --cached --ignore-unmatch ./my_password' \
        --prune-empty --tag-name-filter cat -- --all
      
  4. 從 GitHub 上克隆某個倉庫,修改一些文件。當您使用 git stash 會發生什麼?當您執行 git log --all --oneline 時會顯示什麼?通過 git stash pop 命令來撤銷 git stash 操作,什麼時候會用到這一技巧?
  5. 與其他的命令行工具一樣,Git 也提供了一個名為 ~/.gitconfig 配置文件 (或 dotfile)。請在 ~/.gitconfig 中創建一個別名,使您在運行 git graph 時,您可以得到 git log --all --graph --decorate --oneline 的輸出結果;
  6. 您可以通過執行 git config --global core.excludesfile ~/.gitignore_global 在 ~/.gitignore_global 中創建全局忽略規則。配置您的全局 gitignore 文件來自動忽略系統或編輯器的臨時文件,例如 .DS_Store
  7. 克隆 本課程網站的倉庫,找找有沒有錯別字或其他可以改進的地方,在 GitHub 上發起拉取請求(Pull Request);
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。