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 中會非常方便。(zsh, bash)。Oh My Zsh這樣的框架中一般以及集成了這一功能
- 編輯器集成: 和上面一條類似,將 Git 集成到編輯器中好處多多。fugitive.vim 是 Vim 中集成 GIt 的常用插件
- 工作流: 我們已經講解了數據模型與一些基礎命令,但還沒討論到進行大型項目時的一些慣例 ( 有很多 不同的 處理方法)
- GitHub: Git 並不等同於 GitHub。 在 GitHub 中您需要使用一個被稱作拉取請求(pull request)的方法來向其他項目貢獻代碼
- 其他 Git 提供商: GitHub 並不是唯一的。還有像 GitLab 和 BitBucket 這樣的平台。
資源#
- Pro Git ,強烈推薦!學習前五章的內容可以教會您流暢使用 Git 的絕大多數技巧,因為您已經理解了 Git 的數據模型。後面的章節提供了很多有趣的高級主題。(Pro Git 中文版);
- Oh Shit, Git!?! ,簡短的介紹了如何從 Git 錯誤中恢復;
- Git for Computer Scientists ,簡短的介紹了 Git 的數據模型,與本文相比包含較少量的伪代码以及大量的精美圖片;
- Git from the Bottom Up詳細的介紹了 Git 的實現細節,而不僅僅局限於數據模型。好奇的同學可以看看;
- How to explain git in simple words;
- Learn Git Branching 通過基於瀏覽器的遊戲來學習 Git ;
課後練習#
- 如果您之前從來沒有用過 Git,推薦您閱讀 Pro Git 的前幾章,或者完成像 Learn Git Branching 這樣的教程。重點關注 Git 命令和數據模型相關內容;
- Fork 本課程網站的倉庫
- 將版本歷史可視化並進行探索
Git log --all --graph --decorate
- 是誰最後修改了
README.md
文件?(提示:使用git log
命令並添加合適的參數)git log -1 README.md
- -x 選項:查看最新的 x 次提交或特定文件的版本信息
- 最後一次修改
_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
- 將版本歷史可視化並進行探索
- 使用 Git 時的一個常見錯誤是提交本不應該由 Git 管理的大文件,或是將含有敏感信息的文件提交給 Git 。嘗試向倉庫中添加一個文件並添加提交信息,然後將其從歷史中刪除 ( 這篇文章也許會有幫助);
- 首先提交一些敏感信息
echo "password123">my_password git add . git commit -m "add password123 to file" git log HEAD
- 使用
git filter-branch
清除提交記錄git filter-branch --force --index-filter\ 'git rm --cached --ignore-unmatch ./my_password' \ --prune-empty --tag-name-filter cat -- --all
- 首先提交一些敏感信息
- 從 GitHub 上克隆某個倉庫,修改一些文件。當您使用
git stash
會發生什麼?當您執行git log --all --oneline
時會顯示什麼?通過git stash pop
命令來撤銷git stash
操作,什麼時候會用到這一技巧? - 與其他的命令行工具一樣,Git 也提供了一個名為
~/.gitconfig
配置文件 (或 dotfile)。請在~/.gitconfig
中創建一個別名,使您在運行git graph
時,您可以得到git log --all --graph --decorate --oneline
的輸出結果; - 您可以通過執行
git config --global core.excludesfile ~/.gitignore_global
在~/.gitignore_global
中創建全局忽略規則。配置您的全局 gitignore 文件來自動忽略系統或編輯器的臨時文件,例如.DS_Store
; - 克隆 本課程網站的倉庫,找找有沒有錯別字或其他可以改進的地方,在 GitHub 上發起拉取請求(Pull Request);