筆記《版本控制之道--使用Git》

筆記《版本控制之道--使用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 addREADME//添加單個文件git add . //添加所有文件包括子目錄,但不包括空目錄

    add命令是個多功能命令,根據目標文件的狀態不同,此命令的效果也不同:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區,還能用於合併時把有衝突的文件標記為已解決狀態等)注意每次修改後都要重新add,不然就會提交之前add時的版本。

    git add -i //進入互動式addgit add -p //直接進入補丁模式,可以暫存修改的一部分。

    提交:

    git commit -m 「initial project version」git commit -m 「something」 someFile //提交指定文件git commit -CHEAD-a —amend //復用HEAD留言,增補提交(修改小錯誤,而不增加提交記錄,掩蓋自己的小馬虎)

    參數:

    -m 「提交的說明」-a 動把所有已經跟蹤過的文件暫存,並提交.(工作目錄中修改過的文件都提交到版本庫,不需一個一個手動add了)—amend 增補提交-C 復用指定提交的提交留言-c 打開編輯器在已有的提交基礎上編輯修改

    e.g 修改最後一次提交:

    git commit -m "initial commit"git add forgotten_filegit commit --amend

    如果沒有修改就相當於更改提交說明,上邊3個命令得到一個提交.

    忽略提交的文件:

    所有人都需要忽略的文件要寫在.gitignore文件里,而只有自己的個人偏好需要忽略的文件要寫在.git/info/exclude文件中

    語法:

    # 此為注釋 – 將被 Git 忽略*.a # 忽略所有 .a 結尾的文件!lib.a # 但 lib.a 除外*.[oa] #忽略以.o或.a結尾的文件*~ #忽略以~結尾的文件/TODO # 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODObuild/ # 忽略 build/ 目錄下的所有文件doc/*.txt # 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt

    查看文件改動:

    git diff // 比較工作目錄與緩存區的區別git diff —cached 或者 git diff —staged //緩存區與版本庫里的區別git diffHEAD//三者的區別

    請注意,單單 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 就相當於運行了下面三條命令:

    $ mvREADME.txtREADME$ git rmREADME.txt$ git addREADME

    必須調用 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..HEADgit log fhfs8fh.. //省略HEADgit log 「HEAD^^」..「HEAD^」 //windows必須加引號表示回溯上一個提交git log -1HEAD~1 //相當於git log -1HEAD^

    問責:查明誰修改了代碼

    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.txtgit checkout head *.txtgit checkout head . //撤銷所有

    反轉提交:

    git revertHEAD//創建一個反向的新提交抵消原來的提交改動如果需要反轉多個,必須從最後的開始反轉, 加 -n可以不馬上提交,之後一起提交。git revert -nHEADgit revert -n 54efhdsgit commit -m 「revert head and 54efhds」

    複位:還沒有commit,讓工作目錄回到上次提交時的狀態

    git reset —hardHEAD//所有未提交的內容清空,這會讓"git diff" 和"git diff —cached"命令的顯示法都變為空git reset —softHEAD//複位版本庫,暫存差異,便於提交中發現錯誤需要更改時有用(例如私人密碼放到裡邊了)

    分支:

    在當前分支末梢建立分支:

    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 mastergit branch RB_1.0 6fe57de0git 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.gitclone會默認添加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 paulgit remote rm paul

    獲取數據:

    git fetch [remote-name] 拉取遠程倉庫到本地遠程倉庫,不自動合併 //$ git fetch origin$ git fetch pbremote: 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=目錄/ 版本>壓縮包.zipgit archive —format=zip head>test.zipgit archive —format=tar —prefix=mysite-1.0/ 1.0 | gzip>mysite-1.0.tar.gzgit archive —format=zip —prefix=mysite-1.0/ 1.0 >mysie-1.0.zip

    --EOF--

    本站文章均為原創,轉載請保留鏈接,謝謝。

    推薦閱讀:

    風水筆記(二十七)
    奇門遁甲高級培訓班課堂筆記(下)
    常見疾病的小兒推拿及防護——聽課筆記
    《思考快與慢》與用戶體驗2
    學織插肩,亮片線+特價線(加筆記)

    TAG:控制 | 筆記 | 版本 | 版本控制 |