Git是當今最流行的版本控制工具。這幾年GitHub也幹掉了GoogleCode和Sourceforge,從三大代碼倉庫中脫穎而出,除了GitHub自身的優秀外,Git也是功不可沒。git
爲什麼Git如此出衆呢?這是由於Git保存的不是文件的變化或者差別,而是一系列不一樣時刻的文件快照,同時支持分支模型。Git處理分支的方式可謂是難以置信的輕量,建立新分支這一操做幾乎能在瞬間完成,而且在不一樣分支之間的切換操做也是同樣便捷。與許多其它版本控制系統不一樣,Git鼓勵在工做流程中頻繁地使用分支與合併,哪怕一天以內進行許屢次。程序員
這裏,我簡單地總結一了下Git的命令行命令數據庫
本地倉庫操做
在現有目錄中初始化倉庫
若是你打算使用 Git 來對現有的項目進行管理,你只須要進入該項目目錄並輸入:服務器
該命令將建立一個名爲.git的子目錄,這個子目錄含有你初始化的Git倉庫中全部的必須文件,這些文件是Git倉庫的骨幹。網絡
狀態簡覽
能夠查看修改狀態編輯器
也可使用git status -s命令或git status --short命令,你將獲得一種更爲緊湊的格式輸出。ide
暫存已修改文件
Git能夠暫存一個已跟蹤文件的修改記錄,其實只不過暫存了運行git add命令時的版本,若是如今提交,提交文件的版本是你最後一次運行git add命令時的那個版本,而不是運行git commit時,在工做目錄中的當前版本。因此,運行了git add以後又做了修訂的文件,須要從新運行git add把最新版本從新暫存起來工具
移除文件
要從Git中移除某個文件,就必需要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),而後提交。能夠用git rm命令完成此項工做,並連帶從工做目錄中刪除指定的文件,這樣之後就不會出如今未跟蹤文件清單中了。測試
移動文件
運行git mv就至關於運行了下面三條命令:fetch
同時可使用mv命令實現修改文件名稱。不論是直接使用git mv仍是使用上述三個操做,Git都會意識到這是一次更名,因此無論何種方式結果都同樣。二者惟一的區別是,mv是一條命令而另外一種方式須要三條命令,直接用git mv輕便得多。
查看已暫存和未暫存的修改
git diff命令讓你知道當前作的哪些更新尚未暫存,同時也能夠知道有哪些更新已經暫存起來準備好了下次提交。
提交修改
如今的暫存區域已經準備穩當能夠提交了。在此以前,請必定要確認還有什麼修改過的或新建的文件尚未git add過,不然提交的時候不會記錄這些還沒暫存起來的變化。
這些修改過的文件只保留在本地磁盤。因此,每次準備提交前,先用git status看下,是否是都已暫存起來了,而後再運行提交命令git commit
這種方式會啓動文本編輯器以便輸入本次提交的說明。會啓用默認指定的軟件編輯,能夠按照,使用git config --global core.editor命令設定指定的編輯軟件。
另外,你也能夠在 commit 命令後添加 -m 選項,將提交信息與命令放在同一行
給git commit加上-a選項,Git 就會自動把全部已經跟蹤過的文件暫存起來一併提交,從而跳過git add步驟
查看提交歷史
在提交了若干更新,又或者克隆了某個項目以後,你也許想回顧下提交歷史。完成這個任務最簡單而又有效的工具是git log命令。
撤銷提交
在任何一個階段,都有可能想要撤消某些操做,有些撤消操做是不可逆的。
有時候咱們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。此時,能夠運行帶有--amend選項的提交命令嘗試從新提交
最終你只會有一個提交 - 第二次提交將代替第一次提交的結果。
取消暫存的文件
已經修改了兩個文件而且想要將它們做爲兩次獨立的修改提交,可是卻意外地輸入了git add *暫存了它們兩個。如何只取消暫存兩個中的一個呢?
可使用git reset HEAD撤銷一次提交
Git 分支
幾乎全部的版本控制系統都以某種形式支持分支。 使用分支意味着你能夠把你的工做從開發主線上分離開來,以避免影響開發主線。
Git保存的不是文件的變化或者差別,而是一系列不一樣時刻的文件快照。而所謂的Git分支,就是指向一個快照的指針。
分支建立
Git的默認分支名字是master。咱們能夠建立新的分支。好比,建立一個testing分支,只須要使用git branch命令:
同時有一個名爲HEAD的特殊指針,指向當前分支。
查看全部分支
使用git branch命令能夠查看全部分支,當前分支(HEAD指向的分支)前面會帶有*
分支切換
要切換到一個已存在的分支,你須要使用 git checkout 命令。 咱們如今切換到新建立的 testing 分支去:
這樣 HEAD 就指向 testing 分支了。
你能夠在不一樣分支間不斷地來回切換和工做,並在時機成熟時將它們合併起來。而全部這些工做,你須要的命令只有branch、checkout 和commit。
合併分支
git能夠將當前分支合併回其餘分支。可使用git merge命令來達到上述目的:
變基
rebase(變基)命令將提交到某一分支上的全部修改都移至另外一分支上,就好像「從新播放」同樣。
簡單來講:merge操做會生成一個新的節點,以前的提交分開顯示。而rebase操做不會生成新的節點,是將兩個分支融合成一個線性的提交。
刪除分支
可使用帶-d選項的git branch命令來刪除分支:
遠程倉庫操做
爲了能在任意Git項目上協做,你須要知道如何管理本身的遠程倉庫。遠程倉庫是指託管在因特網或其餘網絡中的你的項目的版本庫。
一個項目能夠有好幾個遠程倉庫,一般有些倉庫對你只讀,有些則能夠讀寫。遠程倉庫須要有個名字,origin是Git給你克隆的倉庫服務器的默認名字
與他人協做涉及管理遠程倉庫以及根據須要推送或拉取數據。管理遠程倉庫包括瞭解如何添加遠程倉庫、移除無效的遠程倉庫、管理不一樣的遠程分支並定義它們是否被跟蹤等等。
克隆遠程倉庫
git clone命令會自動設置本地master分支跟蹤克隆的遠程倉庫的master分支。運行git pull一般會從最初克隆的服務器上抓取數據並自動嘗試合併到當前所在的分支。
查看遠程倉庫
若是想查看你已經配置的遠程倉庫服務器,能夠運行git remote命令。它會列出你指定的每個遠程服務器的簡寫。
添加遠程倉庫
運行git remote add
從遠程倉庫中抓取與拉取
從遠程倉庫中得到數據,能夠執行
這個命令會訪問遠程倉庫,從中拉取全部你尚未的數據。執行完成後,你將會擁有那個遠程倉庫中全部分支的引用,能夠隨時合併或查看。
推送到遠程倉庫
只有當你有所克隆服務器的寫入權限,而且以前沒有人推送過期,這條命令才能生效。當你和其餘人在同一時間克隆,他們先推送到上游而後你再推送到上游,你的推送就會毫無疑問地被拒絕。你必須先將他們的工做拉取下來並將其合併進你的工做後才能推送。
查看遠程倉庫
若是想要查看某一個遠程倉庫的更多信息,可使用 git remote show [remote-name] 命令。
遠程倉庫的移除與重命名
若是想要重命名引用的名字能夠運行git remote rename去修改一個遠程倉庫的簡寫名
值得注意的是這一樣也會修改你的遠程分支名字
若是由於一些緣由想要移除一個遠程倉庫,可使用git remote rm
遠程分支
當你切換了本地分支,可是在push的時候,不指定分支,事實上仍是在向默認的origin/master。
所以若是你但願你的分支可以被提交到遠程服務器上,讓其餘人也能看到他。須要執行git push (remote) (branch),例如:
這樣在遠程服務器上便建立了origin/testing分支。
刪除遠程分支
能夠運行帶有--delete選項的git push命令來刪除一個遠程分支。
分支 - 分支開發工做流
一般咱們在使用Git的時候,都會在master分支上保留徹底穩定的代碼——有可能僅僅是已經發布或即將發佈的代碼。
同時還有一些名爲develop的平行分支,被用來作後續開發或者測試穩定性——這些分支沒必要保持絕對穩定,可是一旦達到穩定狀態,它們就能夠被合併入 master 分支了。
這樣,在確保這些已完成的特性分支可以經過全部測試,而且不會引入更多 bug 以後,就能夠合併入主幹分支中,等待下一次的發佈。
同時高水平的程序員也能夠在review水平較低的程序員後,再合併代碼。
這個過程咱們叫Git工做流
Git 標籤
Git能夠給歷史中的某一個提交打上標籤,以示重要
建立標籤
Git使用兩種主要類型的標籤:輕量標籤(lightweight)與附註標籤(annotated)。
一個輕量標籤很像一個不會改變的分支 - 它只是一個特定提交的引用。
附註標籤是存儲在 Git 數據庫中的一個完整對象。能夠包含打標籤者的名字、電子郵件地址、日期時間等等
附註標籤
在Git中建立一個附註標籤是很簡單的。最簡單的方式是當你在運行tag命令時指定-a選項。-m選項指定了一條將會存儲在標籤中的信息。
輕量標籤
另外一種給提交打標籤的方式是使用輕量標籤。建立輕量標籤,不須要使用-a、-s或-m選項,只須要提供標籤名字。
共享標籤
git push命令並不會傳送標籤到遠程倉庫服務器上。在建立完標籤後你必須顯式地推送標籤到共享服務器上。能夠運行
檢出標籤
在Git中不能真的檢出一個標籤,由於它們並不能像分支同樣來回移動。若是想要工做目錄與倉庫中特定的標籤版本徹底同樣,可使用
這實際是在特定的標籤上建立一個新分支