安裝 Git 以後,你要作的第一件事情就是去配置你的名字和郵箱,由於每一次提交都須要這些信息:git
git config --global user.name "bukas" |
獲取Git配置信息,執行如下命令:github
git config --list |
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你能夠簡單理解成一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改、刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻能夠「還原」。數據庫
mkdir testgit && cd testgit |
瞬間Git就把倉庫建好了,細心的讀者能夠發現當前目錄下多了一個ls -ah
命令就能夠看見。安全
touch readme.md |
而後用命令
服務器
git commit -m "wrote a readme file"
簡單解釋一下-m
後面輸入的是本次提交的說明,能夠輸入任意內容,固然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。app
一次能夠
ssh
git add a.txt b.txt c.txt
git status |
但若是能看看具體修改了什麼內容就更好了:
ui
git diff readme.md |
在實際工做中,咱們腦子裏怎麼可能記得一個幾千行的文件每次都改了什麼內容,否則要版本控制系統幹什麼。版本控制系統確定有某個命令能夠告訴咱們歷史記錄,在Git中,咱們用
spa
git log
--pretty=oneline
參數:.net
git log --pretty=oneline |
須要友情提示的是,你看到的一大串相似commit id
(版本號)
在 Git中,用commit id
,上一個版本就是HEAD^^
,固然往上100個版本寫100個^比較容易數不過來,因此寫成 如今咱們要把當前版本回退到上一個版本,就可使用
git reset --hard HEAD^
git reset --hard HEAD^
然咱們用
辦法其實仍是有的,只要上面的命令行窗口尚未被關掉,你就能夠順着往上找啊找啊,假設找到那個2e70fdf...
,因而就能夠指定回到將來的某個版本:
git reset --hard 2e70fdf |
版本號不必寫全,前幾位就能夠了,Git會自動去找。固然也不能只寫前一兩位,由於Git可能會找到多個版本號,就沒法肯定是哪個了。
如今,你回退到了某個版本,關掉了電腦,次日早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的 Git提供了一個命令
git reflog
git reflog
終於舒了口氣,因而你看到的2e70fdf
,如今,你又能夠乘坐時光機回到將來了。
Git和其餘版本控制系統如SVN的一個不一樣之處就是有暫存區的概念。
工做區就是你在電腦裏能看到的目錄,好比個人 工做區有一個隱藏目錄
Git的版本庫裏存了不少東西,其中最重要的就是稱爲
index
)的暫存區,還有Git爲咱們自動建立的第一個分支master
的一個指針叫 前面講了咱們把文件往 Git 版本庫裏添加的時候,是分兩步執行的:
第一步是用 第二步是用
由於咱們建立Git版本庫時,Git自動爲咱們建立了惟一一個
git commit
就是往 你能夠簡單理解爲,
git commit
就能夠一次性把暫存區的全部修改提交到分支。
一旦提交後,若是你又沒有對工做區作任何修改,那麼工做區就是「乾淨」的。
用
git checkout -- readme.md
git checkout -- readme.md
命令readme.md
文件在工做區的修改所有撤銷,即讓這個文件回到最近一次git add
時的狀態。
通常狀況下,你一般直接在文件管理器中把沒用的文件刪了,或者用
rm readme.md
rm readme.md
這個時候,Git 知道你刪除了文件,所以,工做區和版本庫就不一致了, 如今你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令
git commit
:
git rm readme.md |
如今,文件就從版本庫中被刪除了。
另外一種狀況是刪錯了,由於版本庫裏還有呢,因此能夠很輕鬆地把誤刪的文件恢復到最新版本:
git checkout -- readme.md |
建立 SSH Key。在用戶主目錄下,看看有沒有id_rsa
和
ssh-keygen -t rsa -C "youremail@example.com"
你須要把郵件地址換成你本身的郵件地址,而後一路回車,使用默認值便可。
若是一切順利的話,能夠在用戶主目錄裏找到id_rsa
和id_rsa
是私鑰,不能泄露出去, 而後登陸GitHub(或者其它Git代碼託管平臺),打開
SSH Keys
頁面,點Title
,在id_rsa.pub
文件的內容。
爲何GitHub須要SSH Key呢?由於GitHub須要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,因此GitHub只要知道了你的公鑰,就能夠確認只有你本身才能推送。
固然,GitHub容許你添加多個Key。假定你有若干電腦,你一下子在公司提交,一下子在家裏提交,只要把每臺電腦的Key都添加到GitHub,就能夠在每臺電腦上往GitHub推送了。
Git 最強大的功能之一是能夠有一個以上的遠程服務器(另外一個事實,你老是能夠運行一個本地倉庫)。你不必定老是須要寫訪問權限,你能夠從多個服務器中讀取(用於合併),而後寫到另外一個服務器中。添加一個遠程服務器很簡單:
git remote add origin(別名,根據愛好命名) git@github.com:bukas/bukas.git |
若是你想查看遠程服務器的相關信息,你能夠這樣作:
# shows URLs of each remote server |
下一步,就能夠把本地庫的全部內容推送到遠程庫上:
git push -u origin master |
把本地庫的內容推送到遠程,用master
推送到遠程。
因爲遠程庫是空的,咱們第一次推送-u
參數,Git不但會把本地的master
分支,還會把本地的master
分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。
從如今起,只要本地做了提交,就能夠經過命令把本地
git push origin master
SSH警告
當你第一次使用Git的push
命令鏈接GitHub時,會獲得一個警告:
The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
這是由於Git使用SSH鏈接,而SSH鏈接在第一次驗證GitHub服務器的Key時,須要你確認 GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入 從遠程庫克隆
當已經有一個遠程庫的時候,咱們能夠用命令
git clone git@github.com:test/testgit.git
git clone git@github.com:test/testgit.git
你也許還注意到,GitHub給出的地址不止一個,還能夠用git://
使用https
等其餘協議。使用http
端口的公司內部就沒法使用https
。
首先咱們建立dev
分支:
git checkout -b dev |
-b
參數表示建立並切換,至關於如下兩條命令:
git branch dev |
而後用
git branch
咱們在dev
分支的工做成果合併到
git checkout master
git merge dev
注意到
Fast-forward
字樣,Git告訴咱們,此次合併是「快進模式」,也就是直接把dev
的當前提交,因此合併速度很是快。
固然也不是每次合併都能 合併完成後,就能夠放心地刪除
git branch -d dev
git branch -d dev
若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <branch>
強行刪除。
在本地建立和遠程分支對應的分支,使用 創建本地分支和遠程分支的關聯,使用
從遠程抓取分支,使用
解決衝突
人生不如意之事十之八九,合併分支每每也不是一路順風的。
有時候咱們進行合併的時候,會提示有衝突出現git status
也能夠告訴咱們衝突的文件。
打開衝突文件咱們會看到Git用=======
,>>>>>>>
標記出不一樣分支的內容,咱們修改後提交:
git add readme.md |
用帶參數的
git log --graph --pretty=oneline --abbrev-commit
一般,合併分支時,若是可能,Git會用 若是要強制禁用
merge
時生成一個新的 下面咱們實戰一下
git merge
:
首先,仍然建立並切換
git checkout -b dev
修改commit
:
git add readme.md |
如今,咱們切換回
git checkout master
準備合併--no-ff
參數,表示禁用
git merge --no-ff -m "merge with no-ff" dev
軟件開發中,bug就像屢見不鮮同樣。有了bug就須要修復,在Git中,因爲分支是如此的強大,因此,每一個bug均可以經過一個新的臨時分支來修復,修復後,合併分支,而後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很天然地,你想建立一個分支dev
上進行的工做尚未提交。
並非你不想提交,而是工做只進行到一半,還無法提交,預計完成還需1天時間。可是,必須在兩個小時內修復該bug,怎麼辦?
幸虧,Git還提供了一個
git stash
如今,用 首先肯定要在哪一個分支上修復bug,假定須要在
master
建立臨時分支:
git checkout master |
如今修復bug,而後提交:
git add readme.md |
修復完成後,切換到issue-101
分支:
git checkout master |
太棒了,原計劃兩個小時的bug修復只花了5分鐘!如今,是時候接着回到
git checkout dev
git status
工做區是乾淨的,剛纔的工做現場存到哪去了?用
git stash list
工做現場還在,Git把 一是用
stash
內容並不刪除,你須要用 另外一種方式是用
stash
內容也刪了:
git stash pop |
再用stash
內容了。
你能夠屢次git stash list
查看,而後恢復指定的
git stash apply stash@{0}
發佈一個版本時,咱們一般先在版本庫中打一個標籤,這樣,就惟一肯定了打標籤時刻的版本。未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,標籤也是版本庫的一個快照。
命令HEAD
,也能夠指定一個
能夠指定標籤信息。
還能夠經過
git tag -s v0.5 -m "signed version 0.2 released" fec145a
用命令
git show <tagname>
能夠查看某個標籤的詳細信息。
若是標籤打錯了,也能夠刪除:
git tag -d v0.1 |
由於建立的標籤都只存儲在本地,不會自動推送到遠程。因此,打錯的標籤能夠在本地安全刪除。
若是要推送某個標籤到遠程,使用命令git push origin <tagname>
:
git push origin v1.0 |
或者,一次性推送所有還沒有推送到遠程的本地標籤:
git push origin --tags |
若是標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除:
git tag -d v0.9 |
而後,從遠程刪除。刪除命令也是
git push origin :refs/tags/v0.9
在安裝Git一節中,咱們已經配置了user.email
,實際上,Git還有不少可配置項。
好比,讓Git顯示顏色,會讓命令輸出看起來更醒目:
git config --global color.ui true |
有些時候,你必須把某些文件放到Git工做目錄中,但又不能提交它們,好比保存了數據庫密碼的配置文件啦,等等,每次 好在Git考慮到了你們的感覺,這個問題解決起來也很簡單,在 Git工做區的根目錄下建立一個特殊的
不須要從頭寫
固然也能夠配置全局忽略的文件,這樣就不用每一個項目都加gitignore了:
git config --global core.excludesfile '~/.gitignore' |
有沒有常常敲錯命令?好比status
這個單詞真心很差記。
若是敲git status
那就簡單多了,固然這種偷懶的辦法咱們是極力同意的。
咱們只須要敲一行命令,告訴Git,之後status
:
git config --global alias.st status |
固然還有別的命令能夠簡寫:
git config --global alias.co checkout |
在撤銷修改一節中,咱們知道,命令
unstage
),從新放回工做區。既然是一個unstage
別名:
git config --global alias.unstage 'reset HEAD' |
配置一個
git config --global alias.last 'log -1'
甚至還有人把
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置文件
配置Git的時候,加上–global是針對當前用戶起做用的,若是不加,那隻針對當前的倉庫起做用。
配置文件放哪了?每一個倉庫的Git配置文件都放在 而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件
.gitconfig
中。