git 常用指令集
Git是分散式的版本控制系統,從架設、簡易操作、設定,此篇主要是整理基本操作、遠端操作等.
註:Git的範圍太廣了,把這篇當作是初學入門就好了.
注意事項
由project/.git/config可知:(若有更多,亦可由此得知)
origin(remote)是Repository的版本
master(branch)是local端,正在修改的版本
平常沒事不要去動到origin,如果動到,可用gitreset--hard回覆到沒修改的狀態.
Git新增檔案
gitadd.#將資料先暫存到stagingarea,add之後再新增的資料,於此次commit不會含在裡面.
gitaddfilename
gitaddmodify-file#修改過的檔案,也要add.(不然commit要加上-a的參數)
gitadd-u#只加修改過的檔案,新增的檔案不加入.
gitadd-i#進入互動模式
Git刪除檔案
gitrmfilename
Git修改檔名、搬移目錄
gitmvfilenamenew-filename
Gitstatus看目前的狀態
gitstatus#看目前檔案的狀態
GitCommit
gitcommit
gitcommit-m'commitmessage'
gitcommit-a-m'commit-message'#將所有修改過得檔案都commit,但是新增的檔案還是得要先add.
gitcommit-a-v#-v可以看到檔案哪些內容有被更改,-a把所有修改的檔案都commit
Git產生新的branch
gitbranch#列出目前有多少branch
gitbranchnew-branch#產生新的branch(名稱:new-branch),若沒有特別指定,會由目前所在的branch/master直接複製一份.
gitbranchnew-branchmaster#由master產生新的branch(new-branch)
gitbranchnew-branchv1#由tag(v1)產生新的branch(new-branch)
gitbranch-dnew-branch#刪除new-branch
gitbranch-Dnew-branch#強制刪除new-branch
gitcheckout-bnew-branchtest#產生新的branch,並同時切換過去new-branch
#與remoterepository有關
gitbranch-r#列出所有Repositorybranch
gitbranch-a#列出所有branch
Gitcheckout切換branch
gitcheckoutbranch-name#切換到branch-name
gitcheckoutmaster#切換到master
gitcheckout-bnew-branchmaster#從master建立新的new-branch,並同時切換過去new-branch
gitcheckout-bnewbranch#由現在的環境為基礎,建立新的branch
gitcheckout-bnewbranchorigin#於origin的基礎,建立新的branch
gitcheckoutfilename#還原檔案到Repository狀態
gitcheckoutHEAD.#將所有檔案都checkout出來(最後一次commit的版本),注意,若有修改的檔案都會被還原到上一版.(gitcheckout-f亦可)
gitcheckoutxxxx.#將所有檔案都checkout出來(xxxxcommit的版本,xxxx是commit的編號前四碼),注意,若有修改的檔案都會被還原到上一版.
Gitdiff
gitdiffmaster#與Master有哪些資料不同
gitdiff--cached#比較stagingarea跟本來的Repository
gitdifftag1tag2#tag1,與tag2的diff
gitdifftag1:file1tag2:file2#tag1,與tag2的file1,file2的diff
gitdiff#比較目前位置與stagingarea
gitdiff--cached#比較stagingarea與Repository差異
gitdiffHEAD#比較目前位置與Repository差別
gitdiffnew-branch#比較目前位置與branch(new-branch)的差別
gitdiff--stat
GitTag
gittagv1ebff#log是commitebff810c461ad1924fc422fd1d01db23d858773b的內容,設定簡短好記得Tag:v1
gittag中文ebff#tag也可以下中文,任何文字都可以
gittag-d中文#把tag=中文刪掉
Gitlog
gitlog#將所有log秀出
gitlog-p#將所有log和修改過得檔案內容列出
gitlog--stat--summary#查每個版本間的更動檔案和行數
gitlogfilename#這個檔案的所有log
gitlogdirectory#這個目錄的所有log
gitlog-S'foo()'#log裡面有foo()這字串的.
gitlog--no-merges#不要秀出merge的log
gitlog--since="2weeksago"#最後這2週的log
gitlog--pretty=oneline#秀log的方式
gitlog--pretty=short#秀log的方式
gitlog--pretty=format:'%hwas%an,%ar,message:%s'
gitlog--pretty=format:'%h:%s'--graph#會有簡單的文字圖形化,分支等.
gitlog--pretty=format:'%h:%s'--topo-order--graph#依照主分支排序
gitlog--pretty=format:'%h:%s'--date-order--graph#依照時間排序
Gitshow
gitshowebff#查log是commitebff810c461ad1924fc422fd1d01db23d858773b的內容
gitshowv1#查tag:v1的修改內容
gitshowv1:test.txt#查tag:v1的test.txt檔案修改內容
gitshowHEAD#此版本修改的資料
gitshowHEAD^#前一版修改的資料
gitshowHEAD^^#前前一版修改的資料
gitshowHEAD~4#前前前前一版修改的資料
Gitreset還原
gitreset--hardHEAD#還原到最前面
gitreset--hardHEAD~3
gitreset--softHEAD~3
gitresetHEADfilename#從stagingarea狀態回到unstaging或untracked(檔案內容並不會改變)
Gitgrep
gitgrep"te"v1#查v1是否有"te"的字串
gitgrep"te"#查現在版本是否有"te"的字串
Gitstash暫存
gitstash#丟進暫存區
gitstashlist#列出所有暫存區的資料
gitstashpop#取出最新的一筆,並移除.
gitstashapply#取出最新的一筆stash暫存資料.但是stash資料不移除
gitstashclear#把stash都清掉
Gitmerge合併
gitmerge
gitmergemaster
gitmergenew-branch
下述轉載自:ihower的Git版本控制系統(2)開branch分支和操作遠端repo.x
Straightmerge預設的合併模式,會有全部的被合併的branchcommits記錄加上一個merge-commit,看線圖會有兩條Parents線,並保留所有commitlog。
Squashedcommit壓縮成只有一個merge-commit,不會有被合併的log。SVN的merge即是如此。
cherry-pick只合併指定的commit
rebase變更branch的分支點:找到要合併的兩個branch的共同的祖先,然後先只用要被merge的branch來commit一遍,然後再用目前branch再commit上去。這方式僅適合還沒分享給別人的localbranch,因為等於砍掉重練commitlog。
指令操作
gitmerge<branch_name>#合併另一個branch,若沒有conflict衝突會直接commit。若需要解決衝突則會再多一個commit。
gitmerge--squash<branch_name>#將另一個branch的commit合併為一筆,特別適合需要做實驗的fixesbug或newfeature,最後只留結果。合併完不會幫你先commit。
gitcherry-pick321d76f#只合併特定其中一個commit。如果要合併多個,可以加上-n指令就不會先幫你commit,這樣可以多pick幾個要合併的commit,最後再gitcommit即可。
Gitblame
gitblamefilename#關於此檔案的所有commit紀錄
Git還原已被刪除的檔案
gitls-files-d#查看已刪除的檔案
gitls-files-d|xargsgitcheckout--#將已刪除的檔案還原
Git維護
gitgc#整理前和整理後的差異,可由:gitcount-objects看到.
gitfsck--full
Gitrevert資料還原
gitrevertHEAD#回到前一次commit的狀態
gitrevertHEAD^#回到前前一次commit的狀態
gitresetHEADfilename#從stagingarea狀態回到unstaging或untracked(檔案內容並不會改變)
gitcheckoutfilename#從unstaging狀態回到最初Repository的檔案(檔案內容變回修改前)
以下與遠端Repository相關
Gitremote維護遠端檔案
gitremote
gitremoteaddnew-branchhttp://git.example.com.tw/project.git#增加遠端Repository的branch(origin->project)
gitremoteshow#秀出現在有多少Repository
gitremotermnew-branch#刪掉
gitremoteupdate#更新所有Repositorybranch
gitbranch-r#列出所有Repositorybranch
抓取/切換Repository的branch
gitfetchorigin
gitcheckout--track-breps-branchorigin/reps-branch#抓取reps-branch,並將此branch建立於local的reps-branch
刪除Repository的branch
gitpushorigin:heads/reps-branch