2. Git help
Git help 獲取git基本命令
(若是要知道某個特定命令的使用方法,例如:使用Git help clone,來獲取git clone的使用方法)git
3. Git本地操做基本命令
3.1. Git init
或者使用git init-db。
建立一個空的Git庫。在當前目錄中產生一個.git 的子目錄。之後,全部的文件變化信息都會保存到這個目錄下,而不像CVS那樣,會在每一個目錄和子目錄下都建立一個CVS目錄。
在.git目錄下有一個config文件,能夠修改其中的配置信息。
3.2. Git add
將當前工做目錄中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交以前所須要執行的一步。
能夠遞歸添加,即若是後面跟的是一個目錄做爲參數,則會遞歸添加整個目錄中的全部子目錄和文件。例如:
git add dir1 ( 添加dir1這個目錄,目錄下的全部文件都被加入 )
Git add f1 f2 ( 添加f1,f2文件)
git add . ( 添加當前目錄下的全部文件和子目錄 )
3.3. Git rm
從當前的工做目錄中和索引中刪除文件。
能夠遞歸刪除,即若是後面跟的是一個目錄作爲參數,則會遞歸刪除整個目錄中的全部子目錄和文件。例如:
git rm –r * (進入某個目錄中,執行此語句,會刪除該目錄下的全部文件和子目錄)
git rm f1 (刪除文件f1,包含本地目錄和index中的此文件記錄)
git rm --ached f1 (刪除文件f1,不會刪除本地目錄文件,只刪除index中的文件記錄;將已經git add的文件remove到cache中,這樣commit的時候不會提交這個文件, 適用於一會兒添加了不少文件, 卻又想排除其中個別幾個文件的狀況.)
3.4. Git commit
提交當前工做目錄的修改內容。
直接調用git commit命令,會提示填寫註釋。經過以下方式在命令行就填寫提交註釋:git commit -m "Initial commit of gittutor reposistory"。 注意,和CVS不一樣,git的提交註釋必須不能爲空,不然就會提交失敗。
git commit還有一個 -a的參數,能夠將那些沒有經過git add標識的變化一併強行提交,可是不建議使用這種方式。
每一次提交,git就會爲全局代碼創建一個惟一的commit標識代碼,用戶能夠經過git reset命令恢復到任意一次提交時的代碼。
git commit –-amend –m 「message」 (在一個commit id上不斷修改提交的內容)
3.5. Git status
查看版本庫的狀態。能夠得知哪些文件發生了變化,哪些文件尚未添加到git庫中等等。 建議每次commit前都要經過該命令確認庫狀態。
最多見的誤操做是, 修改了一個文件, 沒有調用git add通知git庫該文件已經發生了變化就直接調用commit操做, 從而致使該文件並無真正的提交。這時若是開發者覺得已經提交了該文件,就繼續修改甚至刪除這個文件,那麼修改的內容就沒有經過版本管理起來。若是每次在 提交前,使用git status查看一下,就能夠發現這種錯誤。所以,若是調用了git status命令,必定要格外注意那些提示爲 「Changed but not updated:」的文件。 這些文件都是與上次commit相比發生了變化,可是卻沒有經過git add標識的文件。
3.6. Git log
查看歷史日誌,包含每次的版本變化。每次版本變化對應一個commit id。
Git log -1
-1的意思是隻顯示一個commit,若是想顯示5個,就-5。不指定的話,git log會從該commit一直日後顯示。
Git log --stat –summary (顯示每次版本的詳細變化)
在項目日誌信息中,每條日誌的首行(就是那一串字符)爲版本更新提交所進行的命名,咱們能夠將該命名理解爲項目版本號。項目版本號應該是惟一的,默認由 Git 自動生成,用以標示項目的某一次更新。若是咱們將項目版本號用做git-show 命令的參數,便可查看該次項目版本的更新細節。例如:
1) Git log
2)Git show
實際上,上述命令並不是是真正的進行版本號自定義,只是製造了一個tag對象而已,這在進行項目版本對外發布時比較有用。
3.7. Git merge
把服務器上下載下來的代碼和本地代碼合併。或者進行分支合併。
例如:當前在master分支上,若想將分支dev上的合併到master上,則git merge dev
注意:git merge nov/eclair_eocket (是將服務器git庫的eclair_eocket分支合併到本地分支上)
git rebase nov/eclair_eocket (是將服務器git庫的eclair_eocket分支映射到本地的一個臨時分支上,而後將本地分支上的變化合併到這個臨時分支,而後再用這個臨時分支初始化本地分支)
3.8. Git diff
把本地的代碼和index中的代碼進行比較,或者是把index中的代碼和本地倉庫中的代碼進行比較。
1) Git diff
比較工做目錄和Index中的代碼。
2) Git diff - - cached
比較index和本地倉庫中的代碼。
3.9. Git checkout
3.9.1. 切換到分支
1) 建立一個新分支,並切換到該分支上
Git checkout –b 新分支名
2)切換到某個已經創建的本地分支local_branch
Git checkout local_branch
(使用cat .git/HEAD後,顯示refs:refs/heads/ local_branch)
3) 切換到服務器上的某個分支remote_branch
Git checkout remote_branch
(遠程分支remote_branch能夠經過 git branch –r 列出)
4) 切換到某個commit id
Git checkout commit_id
(使用cat .git/HEAD後,顯示commit_id)
5) 切換到某個tag
Git checkout tag
(使用cat .git/HEAD後,顯示tag)
注意: 除了1)和2)外,其他三種都只是切換到了一個臨時的( no branch )狀態 (this head is detached),這時用 git branch 能夠看處處於(no branch)上, cat .git/HEAD 看到指向相應的commit id。 這個(no branch)只是臨時存在的,並非一個真正創建的branch。 若是此時執行2),則這個(no branch)就自動消失了;若是執行1), 則建立新分支 new branch,並把這個(no branch)掛到這個新分支上,此時cat .git/refs/heads/new_branch 能夠看到已經指向了剛纔那個commit id。
3.9.2. 用已有分支初始化新分支
執行下面的命令,在切換到某個已經創建的local branch或者某個remote branch或者某個commit id 或者某個tag的同時,建立新分支new_branch,而且掛到這個新分支上。
1) 切換到某個已經創建的本地分支local_branch,而且使用此分支初始化一個新分支new_branch。
git checkout –b new_branch local_branch
2) 切換到某個遠程分支remote_branch,而且用此分支初始化一個新分支new_branch。
Git checkout –b new_branch remote_branch
3) 切換到某個commit id,並創建新分支new_branch
Git checkout –b new_branch commit_id
4) 切換到某個tag,並創建新分支new_branch
Git checkout –b new_branch tag
3.9.3. 還原代碼
例如 「git checkout app/model/user.rb」 就會將user.rb文件從上一個已提交的版本中更新回來,未提交的工做目錄中的內容所有會被覆蓋。安全
3.10. Git-ls-files
查看當前的git庫中有那些文件。
3.11. Git mv
重命名一個文件、目錄或者連接。
例如:Git mv helloworld.c helloworld1.c (把文件helloworld.c 重命名爲 helloworld1.c)
3.12. Git branch
3.12.1. 總述
在 git 版本庫中建立分支的成本幾乎爲零,因此,沒必要吝嗇多建立幾個分支。當第一次執行git init時,系統就會建立一個名爲「master」的分支。 而其它分支則經過手工建立。
下面列舉一些常見的分支策略:
建立一個屬於本身的我的工做分支,以免對主分支 master 形成太多的干擾,也方便與他人交流協做;
當進行高風險的工做時,建立一個試驗性的分支;
合併別人的工做的時候,最好是建立一個臨時的分支用來合併,合併完成後再「fetch」到本身的分支。
對分支進行增、刪、查等操做。
注意:分支信息通常在.git/refs/目錄下,其中heads目錄下爲本地分支,remotes爲對應服務器上的分支,tags爲標籤。
3.12.2. 查看分支
git branch 列出本地git庫中的全部分支。在列出的分支中,若分支名前有*,則表示此分支爲當前分支。
git branch –r 列出服務器git庫的全部分支。
(能夠繼續使用命令 「 git checkout -b 本地分支名 服務器分支名」來獲取服務器上某個分支的代碼文件)。
3.12.3. 查看當前在哪一個分支上
cat .git/HEAD
3.12.4. 建立一個分支
1) git branch 分支名
雖然建立了分支,可是不會將當前工做分支切換到新建立的分支上,所以,還須要命令「git checkout 分支名」 來切換,
2) git checout –b 分支名
不但建立了分支,還將當前工做分支切換到了該分支上。
3.12.5. 切換到某個分支:git checkout 分支名
切換到主分支:git checkout master
3.12.6. 刪除分支
git branch –D 分支名
注意: 刪除後,發生在該分支的全部變化都沒法恢復。強制刪除此分支。
3.12.7. 比較兩個分支上的文件的區別
git diff master 分支名 (比較主分支和另外一個分支的區別)
3.12.8. 查看分支歷史
git-show-branch (查看當前分支的提交註釋及信息)
git-show-branch -all(查看全部分支的提交註釋及信息)例如:
* [dev] d2
! [master] m2
--
* [dev] d2
* [dev^] d1
* [dev~2] d0
*+ [master] m2
在上述例子中, 「--」之上的兩行表示有兩個分支dev和master, 且dev分支上最後一次提交的日誌是「d2」,master分支上最後一次提交的日誌是 「m2」。 「--」之下的幾行表示了分支演化的歷史,其中 dev表示發生在dev分支上的最後一次提交,dev^表示發生在dev分支上的倒數第二次提交。dev~2表示發生在dev分支上的倒數第三次提交。
3.12.9. 查看當前分支的操做記錄
git whatchanged
3.12.10. 合併分支
法一:
git merge 「註釋」 合併的目標分支 合併的來源分支
若是合併有衝突,git會有提示。
例如:git checkout master (切換到master分支)
git merge HEAD dev~2 (合併master分支和dev~2分支)或者:git merge master dev~2
法二:
git pull 合併的目標分支 合併的來源分支
例如: git checkout master (切換到master分支)
git pull . dev~2(合併當前分支和dev~2分支)
3.13. Git rebase
通常在將服務器最新內容合併到本地時使用,例如:在版本C時從服務器上獲取內容到本地,修改了本地內容,此時想把本地修改的內容提交到服務器上;但發現服務器上的版本已經變爲G了,此時就須要先執行Git rebase,將服務器上的最新版本合併到本地。例如:
用下面兩幅圖解釋會比較清楚一些,rebase命令執行後,其實是將分支點從C移到了G,這樣分支也就具備了從C到G的功能。
3.14. Git reset
庫的逆轉與恢復除了用來進行一些廢棄的研發代碼的重置外,還有一個重要的做用。好比咱們從遠程clone了一個代碼庫,在本地開發後,準備提交回遠程。可是本地代碼庫在開發時,有功能性的commit,也有出於備份目的的commit等等。總之,commit的日誌中有大量無用log,咱們並不想把這些 log在提交回遠程時也提交到庫中。 所以,就要用到git reset。
git reset的概念比較複雜。它的命令形式:git reset [--mixed | --soft | --hard] [<commit-ish>]
命令的選項:
--mixed 這個是默認的選項。如git reset [--mixed] dev^(dev^的定義能夠參見2.6.5)。它的做用僅是重置分支狀態到dev1^, 可是卻不改變任何工做文件的內容。即,從dev1^到dev1的全部文件變化都保留了,可是dev1^到dev1之間的全部commit日誌都被清除了, 並且,發生變化的文件內容也沒有經過git add標識,若是您要從新commit,還須要對變化的文件作一次git add。 這樣,commit後,就獲得了一份很是乾淨的提交記錄。 (回退了index和倉庫中的內容)
--soft至關於作了git reset –mixed,後,又對變化的文件作了git add。若是用了該選項, 就能夠直接commit了。(回退了倉庫中的內容)
--hard這個命令就會致使全部信息的回退, 包括文件內容。 通常只有在重置廢棄代碼時,才用它。 執行後,文件內容也沒法恢復回來了。(回退了工做目錄、index和倉庫中的內容)
例如:
切換到使用的分支上;
git reset HEAD^ 回退第一個記錄
git reset HEAD~2 回退第二個記錄
若是想把工做目錄下的文件也回退,則使用git reset - - hard HEAD^ 回退第一個記錄
git reset - - hard HEAD~2 回退第二個記錄
還可使用以下方法:
將當前的工做目錄徹底回滾到指定的版本號,假設以下圖,咱們有A-G五次提交的版本,其中C的版本號是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,咱們執行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那麼結果就只剩下了A-C三個提交的版本
3.15. Git revert
還原某次對版本的修改,例如:git revert commit_id (其中commit_id爲commit代碼時生成的一個惟一表示的字符串)
例如:(3.6中)git revert dfb02e6e4f2f7b573337763e5c0013802e392818 (執行此操做,則還原上一次commit的操做)
3.16. Git config
利用這個命令能夠新增、更改Git的各類設置,例如 「git config branch.master.remote origin」 就將master的遠程版本庫設置爲別名叫作origin版本庫。
3.17. Git show
顯示對象的不一樣類型。
3.18. Git tag
建立、列出、刪除或者驗證一個標籤對象(使用GPG簽名的)。
能夠將某個具體的版本打上一個標籤,這樣就不須要記憶複雜的版本號哈希值字符串了,例如你可使用 「git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20」 來標記這個被你還原的版本,那麼之後你想查看該版本時,就可使用 revert_version標籤名,而不是哈希值了。服務器
4. Git服務器操做命令(與服務器交互)
4.1. Git clone
取出服務器的倉庫的代碼到本地創建的目錄中(與服務器交互)
經過git clone獲取遠端git庫後,.git/config中的開發者信息不會被一塊兒clone過來。仍然須要爲本地庫的.git/config文件添加開發者信息。此外,開發者還須要本身添加 . gitignore文件。
經過git clone獲取的遠端git庫,只包含了遠端git庫的當前工做分支。若是想獲取其它分支信息,須要使用 「git branch –r」 來查看, 若是須要將遠程的其它分支代碼也獲取過來,可使用命令 「 git checkout -b 本地分支名 遠程分支名」,其中,遠程分支名爲 「git branch –r」 所列出的分支名, 通常是諸如「origin/分支名」的樣子。若是本地分支名已經存在, 則不須要「-b」參數。
例如:
4.2. Git pull
從服務器的倉庫中獲取代碼,和本地代碼合併。(與服務器交互,從服務器上下載最新代碼,等同於: Git fetch + Git merge)
從其它的版本庫(既能夠是遠程的也能夠是本地的)將代碼更新到本地,例如:「git pull origin master 」就是將origin這個版本庫的代碼更新到本地的master主分支。
git pull能夠從任意一個git庫獲取某個分支的內容。用法以下:
git pull username@ipaddr:遠端repository名遠端分支名 本地分支名。這條命令將從遠端git庫的遠端分支名獲取到本地git庫的一個本地分支中。其中,若是不寫本地分支名,則默認pull到本地當前分支。
須要注意的是,git pull也能夠用來合併分支。 和git merge的做用相同。 所以,若是你的本地分支已經有內容,則git pull會合並這些文件,若是有衝突會報警。
例如:
app
4.3. Git push
將本地commit的代碼更新到遠程版本庫中,例如 「git push origin」就會將本地的代碼更新到名爲orgin的遠程版本庫中。
git push和git pull正好想反,是將本地某個分支的內容提交到遠端某個分支上。用法: git push username@ipaddr:遠端repository名本地分支名 遠端分支名。這條命令將本地git庫的一個本地分支push到遠端git庫的遠端分支名中。
須要格外注意的是,git push好像不會自動合併文件。所以,若是git push時,發生了衝突,就會被後push的文件內容強行覆蓋,並且沒有什麼提示。 這在合做開發時是很危險的事情。
例如:
4.4. Git fetch
從服務器的倉庫中下載代碼。(與服務器交互,從服務器上下載最新代碼)
至關於從遠程獲取最新版本到本地,不會自動merge,比Git pull更安全些。
使用此方法來獲取服務器上的更新。
例如:若是使用git checkout nov/eclair_rocket (nov/eclair_rocket爲服務器上的分支名),則是獲取上次使用git fetch命令時從服務器上下載的代碼;若是先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從服務器上獲取最新的更新信息,而後從服務器上下載最新的代碼。dom