學習GIT 你只要這一篇(轉)

http://blog.csdn.net/afei__/article/details/51476529

安裝以後第一步

安裝 Git 以後,你要作的第一件事情就是去配置你的名字和郵箱,由於每一次提交都須要這些信息:git

git config --global user.name "bukas"
git config --global user.email "bukas@gmail.com"

獲取Git配置信息,執行如下命令:github

git config --list

建立版本庫

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你能夠簡單理解成一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改、刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻能夠「還原」。數據庫

mkdir testgit && cd testgit
git init

瞬間Git就把倉庫建好了,細心的讀者能夠發現當前目錄下多了一個ls -ah命令就能夠看見。安全

git-init

把文件添加到版本庫

touch readme.md
git add 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

git-log

--pretty=oneline參數:.net

git log --pretty=oneline

git-log-pretty

須要友情提示的是,你看到的一大串相似commit id(版本號)

在 Git中,用commit id,上一個版本就是HEAD^^,固然往上100個版本寫100個^比較容易數不過來,因此寫成 如今咱們要把當前版本回退到上一個版本,就可使用

git reset --hard HEAD^
git reset --hard HEAD^

然咱們用 git-reset

辦法其實仍是有的,只要上面的命令行窗口尚未被關掉,你就能夠順着往上找啊找啊,假設找到那個2e70fdf...,因而就能夠指定回到將來的某個版本:

git reset --hard 2e70fdf

版本號不必寫全,前幾位就能夠了,Git會自動去找。固然也不能只寫前一兩位,由於Git可能會找到多個版本號,就沒法肯定是哪個了。

如今,你回退到了某個版本,關掉了電腦,次日早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的 Git提供了一個命令

git reflog
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 commit -m "remove readme.md"

如今,文件就從版本庫中被刪除了。

另外一種狀況是刪錯了,由於版本庫裏還有呢,因此能夠很輕鬆地把誤刪的文件恢復到最新版本:

git checkout -- readme.md

生成SSH key

建立 SSH Key。在用戶主目錄下,看看有沒有id_rsa

ssh-keygen -t rsa -C "youremail@example.com"

你須要把郵件地址換成你本身的郵件地址,而後一路回車,使用默認值便可。

若是一切順利的話,能夠在用戶主目錄裏找到id_rsaid_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 remote -v

# gives more details about origin
git remote show origin(別名)

下一步,就能夠把本地庫的全部內容推送到遠程庫上:

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 checkout 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 commit -m "conflict fixed"

用帶參數的

git log --graph --pretty=oneline --abbrev-commit

分支管理策略

一般,合併分支時,若是可能,Git會用 若是要強制禁用merge時生成一個新的 下面咱們實戰一下git merge

首先,仍然建立並切換

git checkout -b dev

修改commit

git add readme.md
git commit -m "add merge"

如今,咱們切換回

git checkout master

準備合併--no-ff參數,表示禁用

git merge --no-ff -m "merge with no-ff" dev

Bug分支

軟件開發中,bug就像屢見不鮮同樣。有了bug就須要修復,在Git中,因爲分支是如此的強大,因此,每一個bug均可以經過一個新的臨時分支來修復,修復後,合併分支,而後將臨時分支刪除。

當你接到一個修復一個代號101的bug的任務時,很天然地,你想建立一個分支dev上進行的工做尚未提交。

並非你不想提交,而是工做只進行到一半,還無法提交,預計完成還需1天時間。可是,必須在兩個小時內修復該bug,怎麼辦?

幸虧,Git還提供了一個

git stash

如今,用 首先肯定要在哪一個分支上修復bug,假定須要在master建立臨時分支:

git checkout master
git checkout -b issue-101

如今修復bug,而後提交:

git add readme.md
git commit -m "fix bug 101"

修復完成後,切換到issue-101分支:

git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101

太棒了,原計劃兩個小時的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
git config --global alias.ci commit
git config --global alias.br branch

在撤銷修改一節中,咱們知道,命令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中。

相關文章
相關標籤/搜索