WIP=work in progress 使用說明原文
文件狀態: untracked, unmodified(git commited), modified, staged/cached(git added)
HEAD: the head of the current branch. Last commit snapshot, next parent。“提交~”表示其父提交,後面可再加數字表示其前幾提交;類似的,^表示其原始提交。
Index: Proposed next commit snapshot ↑commit ↓reset --soft HEAD~
working tree: Sandbox ↑stage ↓(from Index) reset ↓(from HEAD) reset HEAD~
clean working tree: ↑modify ↓(from HEAD) reset --hard HEAD~
^{reference}或--not {reference}表示非該引用
{reference}^{number} 表示指定引用後指定數目的提交,默認爲1. “引用”如HEAD或分支名。^能連續多次,連續兩次與~作用相同,^與~也能混合使用。
{reference}..{reference}表示兩個引用之間的所有提交,引用默認爲HEAD。
{reference}...{reference}表示兩個引用之一且非兩個同時的所有提交
簡要顯示狀態:git status -s
不統計不在庫中的文件,以加速狀態顯示:git status -uno
.gitignore:星號開始的行被忽略;目錄名以斜線結束;以歎號開始的行不被git忽略。
將staged與上次的提交比較:git diff --staged
與已經staged狀態比較:git diff --cached
git difftool 顯示圖形界面的git diff
# to use vim for diff
git config diff.tool vimdiff
# to edit all files in a row
git config --global difftool.prompt false
# git d to invoke git difftool
git config --global alias.d difftool
建立初始庫:git init
取庫:git clone 用戶名@地址[:端口]/路徑 [--mirror/reference=目錄]
mirror參數表示成爲遠端的鏡像,下次取時用reference指明之前的目錄,與遠端相同的代碼就會從本地取。
git add -i 顯示代碼狀態,並可選擇更新、添加、比較、回退、做補丁。回答序號時如果需要多選 ,則用逗號分隔,直接回車後才確認:如選擇更新,然後寫要更新的文件序號(多個可用逗號分隔)回車,然後可再繼續寫,最後直接回車,才確認操作。選擇差別後,先選擇文件,才顯示其差別。
add和reset 命令支持--patch參數,可選擇操作的具體內容。
git commit -m "標題"
git commit -a=git add; git commit,但是不增加新文件
git commit --amend
git rm,如果不想實際刪除本地的文件,則加--cached參數;可用通配符。
git mv
批量修改提交記錄
保存
保存當前狀態以便切換分支:git stash [save],如果也需要保存不在庫(index)中的(untracked)文件,加-u參數。加--patch參數則會逐個文件詢問是否保存。
顯示保存的狀態:git stash list
取回(重現)保存的狀態:git stash apply 名字形如stash@{0},默認爲最近的一個保存。然後,git stash --index,可繼續將之前已經stage的文件(git added)恢復狀態。
刪除保存的狀態:git stash drop
git stash pop=git stash apply; git stash drop
恢復
回退提交:git reset,後面寫提交(回退到該提交),可加文件名,默認爲HEAD,則與add相反,unstaging,修改Index;可加參數--soft或--hard,見本文開始處描述。
git revert,與commit相反,後面加提交號:是回退該提交,而非回退到該提交!失敗後,加參數:--continue繼續;--abort取消;--quit中止。
清空本地修改:git clean,參數-i表示需要提問確認
刪除不在庫中的文件:git clean -f -d,如果也要刪除在.gitignore中的文件,再加-x參數。
git checkout 如果寫提交號,而不寫文件名,則會移動當前HEAD,並處於分離分支狀態,可繼續以“git checkout -b 分支名”建立分支。
日誌
git log -數字 指定顯示修改的數目
git log -p 顯示所有修改詳情
git log --name-only 顯示修改的文件名,如果還要顯示各文件修改的行數,則改用--stat參數
限制顯示的提交的時間:git log --since=時間,since可換爲until或before或after。
git log --author,author亦可換爲commiter。
git log --grep 搜索提交的標題。如果同時使用grep與author,則還需要--all-match參數,否則爲滿足兩者條件的任一條件,而非其交集。
git log -S搜索提交的內容
git log --graph 顯示關係樹
git format-patch 根據提交生成補丁文件,其控制生成對象範圍的參數與log命令的類似。生成出的文件用git apply {文件名}使用
分支與遠端
- 新建本地分支:git checkout -b 分支名 = git branch 分支名; git checkout 分支名
新建對應指定遠端分支的本地分支:git checkout -b 本地分支名 遠端名/遠端分支名 - 在本地分支間切換:git checkout 分支名
當該分支名在遠端也存在時,則本地分支會對應該遠端分支 - 切換本地分支對應的遠端分支:git branch -u 遠端名/遠端分支名
- 合入所有修改:在需要合入的目標分支上,git merge 需要合入的源分支名
或,在臨時分支上,git rebase 最終分支名,之後,最終分支上fast forward就能得到臨時分支上的修改 - 刪除本地分支:git branch -d 分支名
- 合入修改有衝突時:用git mergetool修改後commit
- 列本地分支:git branch,第一列爲星號的是當前分支(HEAD),其它爲空格
git branch -v還會顯示各分支最後一個提交的標題
git branch -vv還會再顯示各對應的遠端分支名
參數--merged和--no-merged控制只顯示已經(包括當前分支)或尚未(這些分支不允許直接用-d參數刪除,需要用-D)合併到當前分支的分支 - origin是默認的遠端(服務器)的名字
master是默認的分支名。所以本地分支默認是master,遠端是origin/master - 添加遠端名字:git remote add 名字 地址
- 顯示遠端名:git remote,加參數-v可顯示地址;加參數show顯示詳情,後面可再加遠端名,默認是origin;加三個參數rename、原名、新名,可更改遠端名;加兩個參數rm、名,可刪除到遠端的關聯。
- 獲取遠端修改(不合入):git fetch,後面可加遠端名(當非origin時)
--all參數可將獲取所有遠端的修改 - 合入遠端修改:git pull=git fetch;git merge或rebase
- 提交到遠端:git push 遠端名 本地分支[:遠端分支],如果兩個名相同,則不用寫可選部分
- 刪除遠端分支:git push 遠端名 --delete 分支名
標籤tag
輕量級lightweight標籤指向指定提交:添加標籤用git tag 標籤名。
註釋型annotated標籤包含打標籤人的信息等:添加標籤用git tag -a 標籤名,後面加加參數-m和標題字符串。
打標籤時可加提交號作爲參數對該提交打標籤。
顯示所有標籤: git tag, 結果按字母排序。加參數-l後加字符串可對結果進行過濾。
git show 後面可加標籤名
提交到遠端:git push 遠端名 標籤名或--tags表示所有標籤
獲取內容:如git checkout -b 分支名 標籤名
命令簡化
git config --global alias.簡化名 命令字符串