Git Cheat Sheet

Git-Cheat-Sheet

Pro Git

此為精進 Git 技巧的書籍,有善心人士幫忙翻譯成中文電子版,幾乎所有的用法和技巧裡面都有交代到。

Pro Git in Chinese

gitignore 大全

.gitignore for VisualStudio

Github - A collection of useful .gitignore templates:各項專案可參考使用的 .gitignore

基本指令

建立 Repository

$ git init
$ git add README
$ git status
$ git commit -m "First Commit"

進階指令

檔名大小寫的重新命名

git 對於檔名的處理是大小寫不分的(case-insensitive) 如果只是把 program.cs 改為 Program.cs,用 git status 會看不到任何改變,請使用下列命令列處理

$ git mv -f program.cs Program.cs

修改版控資料夾名稱

使用 renamemove 做資料夾更名

git mv <old name> <new name>

拋棄所有尚未commit的資料

$ git reset --hard    #to discard changes made to versioned files
$ git clean -xdf      #to erase new (untracked) files, including ignored ones (the x option). d is to also remove untracked directories and f to force.

刪除遠端和本地端的分支

http://stackoverflow.com/questions/2003505/delete-a-git-branch-both-locally-and-remotely As of Git v1.7.0, you can delete a remote branch using

$ git push origin --delete <branchName>

透過 https 下載套件,取代 git protocol

現在前端套件幾乎都會透過 Bower 來下載,而 Bower 預設使用 git protocol 來下載原始檔案,如果遇到 timeout 逾時,也就是無法透過 git:// 方式,就必須要切換成 https:// 下載,切換方式很容易,請在 Console 鍵入底下指令:

$ git config --global url."https://".insteadOf git://

移除 Git 歷史紀錄

參考本站文章

移除前次 commit

git reset 可以砍掉 commit 重來,但修改的程式依然存在:

git reset HEAD^

執行上列指令就會回到前一版本,其中 ^ 表示是前一版,可以使用多個 ^ 來回到多前 n 版。

此指令常用於發現前一次 commit 有問題時,可以回到前一次 commit,並於修改後再重新 commit。

將檔案加入上一個 commit

REF: How to add a file to the last commit in git?

如果已經 commit 了,但想將再加入檔案時,可以下列指令

git add THE_FILE_YOU_WANT_TO_ADD
git commit --amend --no-edit

--no-edit 參數允許你修改上一個 commit 的內容,而不修改其 commit 訊息

設定 Git 自訂指令

可以使用 git config alias.CUSTOME CUSTOM_COMMAND 來設定自訂指令,之後執行 git CUSTOME 就可以了

推薦執行下列指令,建立 git ll 顯示簡易的命令列線圖

git config --global alias.ll "log --pretty=format:'%h %ad | %s%d [%Cgreen%an%Creset]' --graph --date=short"

git ll

Git 內部細節

.git 資料夾

  • .git 資料夾包含整個版控的設定及歷史紀錄
    • 這也是完整的儲存庫備份

資料結構

整個 Git 的資料結構主要由四種物件組成

  • 物件(Object)
    • 執行 git add, git tag 指令就會產生物件
    • 查看物件的指令 git cat-file -t [SHA-1]
      • SHA-1 是使用檔案內容做 HASH 所產生的
      • -t 顯示該物件的類別
      • -s 內容大小
      • -p 顯示內容
    • blob
      • 紀錄資料快照,不存檔名
    • tree
      • 這裡面會有檔名和 Object 的對照
    • commit
      • 裡面的 author 和 committer 可能是不同的
      • 當使用 rebase 的時候,會重新 commit 原作者的內容,這時候 cimmitter 就會是新的人
      • 在 GUI 工具中看到的線圖,就是 commit 物件的資訊
    • tag
      • 指向某一個 commit
      • tag 有兩種樣態,一個是這裡的 Object,另一個是參考的指標,存放在 refs/tags
  • 索引(Index)
    • 索引檔內會有所有版控中的檔案,保存要進儲存庫之前的所有檔案狀態
    • 當資料要寫入 git 的時候,會需要索引檔
    • 空的資料夾是無法加入版控的,如果硬要加入版控了話,至少要有一個檔案,建議用 .gitkeep
  • 分支(Branch)
    • 記錄在 .git\refs\heads 資料夾下,例如 master
    • 內容是一個 SHA-1 的指標,指向一個 commit

Git Client Tools

指令視作強大的,但畢竟人是視覺動物,有時候看到畫面(線圖)會感覺比較親切。


參考資料:


Poy Chang

Trial and Error