分類: Git
212012-12
筆記《版本控制之道--使用Git》
我認為每個學過Git的人都應該做過類似這種筆記,因為Git命令太多看著看著就把前邊看過的忘了,之前我也看過Git,但是一直沒用,現在一看幾乎沒有印象了,所以這次我要把我看到的命令記下來給我自己備忘。
Git已經是最流行的版本控制系統了,網上相關的免費學習資源很多,我見過的中文書籍就有: Git Community Book 中文版 Pro Git 中文版 Git Magic 中文版
但我是買的一本紙質書叫做《版本控制之道—使用Git》,下邊是我記錄的幾乎是整本書講過的所有命令: 設定
git config —global user.name “Nshen” //必須
git config —global user.email “nshen121@gmail.com” //必須
git config —global color.ui “always” //或者"auto", always不僅Base環境是彩色,Dos裡也是彩色的。
git config —global core.editor notepad.exe //設為windows記事本
git config —global alias.ci “commit” //別名縮寫
git config —global merge.tool //可以設定合并工具
git config —global —list //查看設定
其實最後這些設定都儲存在C:\Documents and Settings\使用者名稱\.gitconfig 檔案下(windows)
查看協助: git help command 初始化 :
git init 納入版本控制:
git add *.txt //添加所有txt檔案
git add README //添加單個檔案
git add . //添加所有檔案包括子目錄,但不包括空目錄
add命令是個多功能命令,根據目標檔案的狀態不同,此命令的效果也不同:可以用它開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用於合并時把有衝突的檔案標記為已解決狀態等)注意每次修改後都要重新add,不然就會提交之前add時的版本。
git add -i //進入互動式add
git add -p //直接進入補丁模式,可以暫存修改的一部分。 提交:
git commit -m “initial project version”
git commit -m “something” someFile //提交指定檔案
git commit -C HEAD -a —amend //複用HEAD留言,增補提交(修改小錯誤,而不增加提交記錄,掩蓋自己的小馬虎) 參數:
-m “提交的說明”
-a 動把所有已經跟蹤過的檔案暫存,並提交.(工作目錄中修改過的檔案都提交到版本庫,不需一個一個手動add了)
—amend 增補提交
-C 複用指定提交的提交留言
-c 開啟編輯器在已有的提交基礎上編輯修改
e.g 修改最後一次提交:
git commit -m 'initial commit' git add forgotten_file git commit --amend
如果沒有修改就相當於更改提交說明,上邊3個命令得到一個提交. 忽略提交的檔案:
所有人都需要忽略的檔案要寫在.gitignore檔案裡,而只有自己的個人偏好需要忽略的檔案要寫在.git/info/exclude檔案中
文法:
# 此為注釋 – 將被 Git 忽略 *.a # 忽略所有 .a 結尾的檔案 !lib.a # 但 lib.a 除外 *.[oa] #忽略以.o或.a結尾的檔案 *~ #忽略以~結尾的檔案 /TODO # 僅僅忽略項目根目錄下的 TODO 檔案,不包括 subdir/TODO build/ # 忽略 build/ 目錄下的所有檔案 doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
查看檔案改動:
git diff // 比較工作目錄與緩衝區的區別
git diff —cached 或者 git diff —staged //緩衝區與版本庫裡的區別
git diff HEAD //三者的區別
請注意,單單 git diff 不過是顯示還沒有暫存起來的改動,而不是這次工作和上次提交之間的差異。所以有時候你一下子暫存了所有更新過的檔案後,運行 git diff 後卻什麼也沒有,就是這個原因。
git diff 18f822e //18f822e這個版本與目前的目錄的區別
git diff aaaaa..bbbbb //比較aaaaa與bbbbb之間差別
git diff —stat可以統計資料,比較特別的命令 重新命名,移動,刪除檔案:
git mv file_from file_to //改名或移動
$ git mv README.txt README $ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: README.txt -> README
其實,運行 git mv 就相當於運行了下面三條命令:
$ mv README.txt README
$ git rm README.txt
$ git add README
必須調用 git rm 檔案名稱 //從暫存區移除,並且檔案也被刪除
如果只是手工刪除了檔案,運行git status時會出現
# Changed but not updated: # (use "git add/rm <file>..." to update what will be committed) # # deleted: grit.gemspec
此時必須再運行 git rm 檔案名稱,才會在提交時候不再納入版本管理.
如果刪除之前修改過並且已經add到緩衝區了的話,則必須強制移除 -f
另外一種情況是,我們想把檔案從Git倉庫中刪除(亦即從暫存地區移除),但仍然希望保留在當前工作目錄中。換句話說,僅是從跟蹤清單中刪除。比如一些大型記錄檔或者一堆.a編譯檔案,不小心納入倉庫後,要移除跟蹤但不刪除檔案,以便稍後在 .gitignore 檔案中補上,用 —cached 選項即可: 查看狀態: 查看目前狀態:
git status
$ git status # On branch master # Changes to be committed: //只要在這行後邊的,說明放入暫存區了 # (use "git reset HEAD <file>..." to unstage) //想取消放入緩衝 git reset HEAD README # # new file: README # Changed but not updated: //追蹤檔案內容改變,但還沒有放到暫存區,需要git add 命令才會放到暫存區 # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) //刪除修改,恢複到之前版本,有危險 (如果想保留並且回退版本用stashing 和分支來處理) # modified: benchmarks.rb
查看提交曆史:
git log
這時“j”向下瀏覽,“k”向上瀏覽,“q”退出
git log —pretty=oneline //一行顯示
—pretty=“%h %s” //以各種格式輸出
git log –p -2 //-p顯示每次提交的內容差異 -2表示最近2次更改
git log —since “5 hours”
—since “3 hours”
—since “1 minute”
—before =“2008-10.01”
git log 27j34j3j..03u43u23 //最老版本..最新版本(不包括起點只包括終點)
git log 34j4j4..HEAD
git log fhfs8fh.. //省略HEAD
git log “HEAD^^”..“HEAD^” //windows必須加引號表示回溯上一個提交
git log -1 HEAD~1 //相當於git log -1 HEAD^
git log —graph //圖形化顯示分支
git log —graph —pretty=oneline //一行圖形化顯示分支 問責:查明誰修改了代碼
git blame hello.html //你也可以用"-L"參數在命令(blame)中指定開始和結束行:
git blame -L 12,+10 hello.html //12到22行
blame還可以跟蹤內容複寫,檔案複製,略,見版本控制之道 79頁 撤銷: 撤銷緩衝區的修改(沒有commit的)
git checkout head 檔案名稱 //撤銷暫存區的修改
git checkout head readme.txt todo.txt
git checkout head *.txt
git checkout head . //撤銷所有 反轉提交:
git revert HEAD //建立一個反向的新提交抵消原來的提交改動
如果需要反轉多個,必須從最後的開始反轉, 加 -n可以不馬上提交,之後一起提交。
git revert -n HEAD
git revert -n 54efhds
git commit -m “revert head and 54efhds” 複位:還沒有commit,讓工作目錄回到上次提交時的狀態
git reset —hard HEAD //所有未提交的內容清空,這會讓"git diff" 和"git diff —cached"命令的顯示法都變為空白
git reset —soft HEAD //複位版本庫,暫存差異,便於提交中發現錯誤需要更改時有用(例如私人密碼放到裡邊了) 分支: 在當前分支末梢建立分支:
git branch RB_1.0(建立分支不會自動切換過去) 切換分支:
git checkout RB_1.0(切換到RB_1.0分支) 建立並切換分支:
git checkout -b RB_1.0(簡化上邊2步操作) 刪除分支:
git branch -d RB_1.0 基於某次提交、分支或標籤建立新分支:
git branch RB_1.0 master
git branch RB_1.0 6fe57de0
git branch Rb_1.01 1.0 查看分支:
git branch //列出本地分支 iss53 * master //*號表示當前所在分支 testing
git branch -r //顯示遠程分支
git branch -a //列出所有分支 分支重新命名:
git branch -m master mymaster
-M 大寫M會覆蓋同名的分支 合并分支:
直接合并:
git merge 想合并到當前分支的源分支名
git merge —no-commit 分支 //合并但不提交
壓合合并:將分支壓合成一條commit記錄,併合並過來
git merge —squash 某bug分支
git commit -m “修複某bug”
揀選合并:只合并一個提交
git cherry-pick 321d76f
如果需要連續揀選,就需要加 -n參數
然後再git commit ,但不要加-m參數,編輯器就會使用剛揀選的提交留言作為現在的留言。 標籤Tag: 查看標籤:
git tag 建立標籤:
git tag 1.0 //在當前分支最後一次提交建立標籤
git tag 1.0 RB_1.0 //基於RB_1.0分支的最新踢腳建立標籤
git tag 1.0 ae468d8kt //為某次提交建立標籤 檢出標籤:
git checkout 1.0 //檢出標籤與檢出分支一樣操作,但檢出標籤後用git branch查看本地分支會發現你現在不再任何分支上
這時你不應該修改,而應該立即基於此標籤建立一個分支
git checkout -b from-1.0 變基:
1)git rebase RB_1.01 //也許修改過一個bug,希望新版本變基到RB_1.01分支上
2)手動解決衝突 //如果解決不了直接git rebase -skip或-abort來跳過特定提交或完全放棄變基
3)git add xxx.html //衝突解決
4)git rebase —continue
git rebase --onto HEAD^^ HEAD^ HEAD
//—onto參數可以改寫曆史抹掉中間的參數,將倒數第一個參數變基到倒數第3個參數,為防止出錯建議在實驗性分支上先實驗。
rebase -i 可以排序記錄,多個提交合并為1個,一個提交分解成多個提交 ,
詳見版本控制之道p86 ,需要編輯器支援,windows記事本不行 遠程相關:
git clone git://github.com/schacon/grit.git //從現有倉庫複製
git clone git://github.com/schacon/grit.git mygrit //換名,唯一區別就是建立的目錄成了mygrit,其他都一樣 添加遠程倉庫:
git remote add pb git://github.com/paulboone/ticgit.git
clone會預設添加origin倉庫,如果原本用git init建立的版本庫,後來又想提交到遠程版本庫,就可以用下邊的辦法
git remote add origin git@example.com:/xxxxxx 查看遠程分支:
git remote -v //查看遠程倉庫,預設clone後,應該有一個origin倉庫,-v顯示對應的clone地址
git remote show origin //查看遠程倉庫資訊 遠程倉庫重新命名和刪除:
git remote rename pb paul
git remote rm paul 擷取資料:
git fetch [remote-name] 拉取遠程倉庫到本地遠程倉庫,不自動合并 //$ git fetch origin $ git fetch pb remote: Counting objects: 58, done. remote: Compressing objects: 100% (41/41), done. remote: Total 44 (delta 24), reused 1 (delta 0) Unpacking objects: 100% (44/44), done. From git://github.com/paulboone/ticgit * [new branch] master -> pb/master * [new branch] ticgit -> pb/ticgit
現在pb/master可以在本地訪問了,你可以合并到自己的某個分支,或者切換到這個分支看看有什麼有趣的更新
git pull 抓取資料合併到工作目錄中當前分支 推送資料:
git push [remote-name] [branch-name] //預設為 git push origin master
git push origin serverfix //推送分支,其實是下邊一句的簡化,提取我的 serverfix 並更新到遠程倉庫的 serverfix
git push origin serverfix:serferfix
git push origin :serverfix //這個文法用於刪除,只要把分號前留空 其他:
git gc //記憶體回收,每隔一段時間例如一個月運行一次可以減少磁碟佔用空間。
git reflog //最後的保障,列出誤刪的東東
git bisect //二分尋找,版本控制之道p124頁,略 歸檔版本庫,匯出壓縮包:
git archive —format=格式 —prefix=目錄/ 版本>壓縮包.zip
git archive —format=zip head>