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

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

我認爲每一個學過Git的人都應該作過相似這種筆記,由於Git命令太多看着看着就把前邊看過的忘了,以前我也看過Git,可是一直沒用,如今一看幾乎沒有印象了,因此此次我要把我看到的命令記下來給我本身備忘。 html

Git已是最流行的版本控制系統了,網上相關的免費學習資源不少,我見過的中文書籍就有: git

但我是買的一本紙質書叫作《版本控制之道—使用Git》,下邊是我記錄的幾乎是整本書講過的全部命令: github

設置

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 //查看設置 windows

其實最後這些設置都保存在C:\Documents and Settings\用戶名\.gitconfig 文件下(windows) 緩存

查看幫助: git help command 編輯器

初始化 :

git init 工具

歸入版本控制:

git add *.txt //添加全部txt文件
git add README //添加單個文件
git add . //添加全部文件包括子目錄,但不包括空目錄 學習

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

git add -i //進入交互式add
git add -p //直接進入補丁模式,能夠暫存修改的一部分。 ui

提交:

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>test.zip
git archive —format=tar —prefix=mysite-1.0/ 1.0 | gzip>mysite-1.0.tar.gz
git archive —format=zip —prefix=mysite-1.0/ 1.0 >mysie-1.0.zip


--EOF--

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

相關文章
相關標籤/搜索