| Refer to How to version projects with Git1.建立目錄 $ git config –global user.name “Your Name Comes Here” $ git config –global user.email you@yourdomain.example.com $ git config –list 查看相關資訊 $ git init 如果作為 Server 存在,那麼可以忽略工作目錄,以純程式碼倉庫形式存在。 $ git –bare init 可以在~/.gitconfig設定別名 [alias] st = status ci = commit -a co = checkout 2.檔案操作$ git add . $ git add file1 file2 file3 $ git add -u $ git add -p // 為你做的每次修改,Git將為你展示變動的代碼,並詢問該變動是否應是下一次提交的一部分。回答“y”或者“n”。也有其他選項,比如延遲決定:鍵入“?”來學習更多。 $ git rm file1 file2 file3 $ git mv file1 file2 3.提交更改$ git commit -a -m ‘ ‘ $ git commit –amend -a -m ‘ ‘ // 修改上一次的資訊,不作為新的提交 $ git stash // 儲存當前草稿,便於切換分支 $ git stash pop $ git stash apply $ git stash list $ git stash apply stash@{1} $ git stash clear 4.撤銷更改$ git reset HEAD file1 // 取消暫存區的檔案快照(即恢複成最後一個提交版本),這不會影響工作目錄的檔案修改。 $ git reset –hard HEAD^ // 將整個項目回溯到以前的某個版本,可以使用 “git reset”。可以選擇的參數包括預設的 “–mixed” 和 “–hard”,前者不會取消工作目錄的修改,而後者則放棄全部的修改。該操作會丟失其後的日誌 $ git checkout — file1 // 使用暫存區快照恢複工作目錄檔案,工作目錄的檔案修改被拋棄。 $ git checkout HEAD^ file1 // 直接 “簽出” 代碼倉庫中的某個檔案版本到工作目錄,該操作同時會取消暫存區快照。 $ git checkout “@{10 minutes ago}” // 直接 “簽出” 10分鐘之前代碼倉庫中的某個檔案版本到工作目錄,該操作同時會取消暫存區快照。 $ git checkout “@{5}” // 直接 “簽出” 倒數第五次儲存的某個檔案版本到工作目錄,該操作同時會取消暫存區快照。 $ git revert SHA1_HASH // 還原特定雜湊值對應的提交。該還原記錄作為一個新的提交。 5.查看曆史紀錄或者目前狀態$ git log $ git log -p $ git log –stat –summary $ git log V3..V7 //顯示V3之後直至V7的所有記錄 $ git log V3.. //顯示所有V3之後的記錄。注意<since>..<until>中任何一個被省略都將被預設設定為HEAD。所以如果使用..<until>的話,git log在大部分情況下會輸出空的。 $ git log –since=”2 weeks ago” //顯示2周前到現在的所有記錄。具體文法可查詢git-ref-parse命令的協助檔案。 $ git log stable..experimental //將顯示在experimental分支但不在stable分支的記錄 $ git log experimental..stable //將顯示在stable分支但不在experimental分支的記錄 $ git log -S’你要找的內容’,就可以從全部的曆史紀錄,瞬間找到你要找的東西 $ git blame FILE // 標註出一個指定的檔案裡每一行內容的最後修改者,和最後修改時間。 $ git diff // 這個命令只在git add之前使用有效。如果已經add了,那麼此命令輸出為空白 $ git diff –cached // 這個命令在git add之後在git commit之前有效。 $ git diff “@{yesterday}” // 比較當前和昨天的內容 $ git status // 這個命令在git commit之前有效,表示都有哪些檔案發生了改動 $ git show 5b888 // 使用git show再加上述的commit名稱來顯式更詳細的commit資訊$ git show master // 顯示分支資訊$ git show HEAD // 使用HEAD欄位可以代表當前分支的頭(也就是最近一次commit)$ git show HEAD^ //查看HEAD的父母的資訊, 可以使用^表示parent$ git show HEAD^^ //查看HEAD的父母的父母的資訊$ git show HEAD~4 //查看HEAD上溯4代的資訊$ git tag V3 5b888 //以後可以用V3來代替複雜的名稱(5b888…)$ git show V3$ git branch stable V3 //建立一個基於V3的分支 $ git grep “print” V3 //在V3中搜尋所有的包含print的行 $ git grep “print” //在所有的記錄中搜尋包含print的行 6.協作操作$ git clone git://server/path/to/files // Git deamon $ git clone your.computer:/path/to/script or git clone ssh://car.colorado.edu/home/xxx ./xxxxx // SSH // SSH$ git pull$ git push // 在將代碼提交(push)到伺服器之前,首先要確認相關更新已經合并(merge)到主分支(master)。還應該先從伺服器重新整理(pull)最新代碼,以確保自己的提交不會和別人最新提交的代碼衝突。如果想在merge前先查看更改:$ git fetch /home/bob/myrepo master:bobworks //此命令意思是提取出bob修改的代碼內容,然後放到我(rocrocket)工作目錄下的bobworks分支中。之所以要放到分支中,而不是master中,就是要我先仔仔細細看看bob的開發成果,如果我覺得滿意,我再merge到master中,如果不滿意,我完全可以直接git branch -D掉。$ git whatchanged -p master..bobworks //用來查看bob都做了什麼$ git checkout master //切換到master分區$ git pull . bobworks //如果我檢查了bob的工作後很滿意,就可以用pull來將bobworks分支合并到我的項目中了 7.分支管理$ git branch: 查看當前分支 $ git checkout -b/branch experimental: 建立新分支 $ git checkout experimental: 切換到另一分支 $ git merge experimental:合并分支 $ git branch -d experimental:刪除分支, 使用的是小寫-d,表示“在分支已經合并到主幹後刪除分支”。 $ git branch -D experimental:刪除分支, 表示“不論如何都刪除分支”,-D使用在“分支被證明失敗” 8.補丁工作git format-patch:當你想給一個開源項目(例如Rails)提交一段代碼的時候,或者你想給小組成員展示一段你並不想提交的代碼,那麼你還是需要 patch的,Git的’format-patch’命令良好的支援了這個功能。 第一,利用branch命令 建立一個分支; 第二,修改你的代碼; 第三,在該分支上提交你的修改; 第四,使用’git format-patch’命令來產生一個patch檔案,例如:’git format-patch master –stdout > ~/Desktop/tmp.patch’就是將工作分支與master主乾的不同,存放在’~/Desktop’檔案夾下,產生一個叫做 tmp.patch的檔案(另一種簡單的版本是利用diff命令,例如’git diff ..master > ~/Desktop/tmp.patch’),這樣就產生了patch檔案。那麼別人就可以使用’git apply’命令來應用patch,例如’git apply ~/Desktop/tmp.patch’就是將patch打在當前的工作分支上 9.倉庫維護$ git fsck: 不加–full參數的情況下,這個命令一般會以非常低廉的代價確保倉庫在一個不錯的健康狀態之中。 $ git count-objects: 統計有多少鬆散的對象,沒有 repack 的對象消耗了多少硬碟空間。 $ git gc: 在本地倉庫進行 repack,並進行其他日常維護工作。 $ git filter-branch –tree-filter `rm top/secret/file` HEAD //在所有記錄中永久刪除某個檔案 $ git rebase -i HEAD~10 // 後10個提交會出現在你喜愛的$EDITOR。通過刪除行來移去提交。通過為行重新排序來為提交重新排序。用“edit”來替換“pick”來標誌一個提交可修改。用“squash”來替換“pick”來將一個提交和前一個合并。 10.錯誤查詢剛剛發現程式裡有一個功能出錯了,即使你過去經常提交變更,Git還是可以精確的找出問題所在: $ git bisect start $ git bisect bad SHA1_OF_BAD_VERSION $ git bisect good SHA1_OF_GOOD_VERSION Git從記錄中檢出一個中間的狀態,在這個狀態上測試功能,如果還是錯誤的: $ git bisect bad 如果可以工作了,則把”bad”替換成”good”。 Git會再次幫你找到一個以確定的好版本和壞版本之間的狀態,經過一系列的迭代,這種二進位查詢會幫你找到導致這個錯誤的那次提交。一旦完成了問題定位的調查,你可以返回到原始狀態,鍵入: $ git bisect reset 不需要手工測試每一次改動,執行如下命令可以自動的完成上面的搜尋:$ git bisect run COMMANDGit使用指定命令(通常是一個一次性的指令碼)的傳回值來決定一次改動是否是正確的:命令退出時的代碼0代表改動是正確的,125代表要跳過對這次改動的檢查,1到127之間的其他數值代表改動是錯誤的。返回負數將會中斷整個bisect的檢查。 ———————————————————————————————————–將 Current working directory 記為 工作目錄(1)將 Index file 記為 暫存區(2)將 Git repository 記為 代碼倉庫(3)他們之間的提交層次關係是 (1) -> (2) -> (3)git add完成的是(1) -> (2)git commit完成的是(2) -> (3)git commit -a兩者的直接結合從時間上看,可以認為(1)是最新的代碼,(2)比較舊,(3)更舊 按時間排序就是 (1) <- (2) <- (3) git diff得到的是從(2)到(1)的變化 git diff –cached得到的是從(3)到(2)的變化 git diff HEAD得到的是從(3)到(1)的變化 |