Git 學習
git瞭解的一塌糊塗,這裡重新系統的學習一下。
Contents
什麼是git
Git是一款免費、開源的分散式版本控制系統。
Git是目前世界上最先進的分散式版本控制系統(沒有之一)。
分散式和集中式
分散式是每個人電腦上都有完整版本,沒有網路也可以工作,可以同事之間交換修改部分,也可以統一設立中央伺服器,然後得到每個人修改的記錄。
集中式就是將整個檔案統一放在特定伺服器上,工作的時候先要從這個伺服器上獲取到最新版本,然後再進行自己的編輯修改,完了再提交到此伺服器上。所以如果沒有網路,就沒法工作了。
Git是分散式版本控制系統,就是將同一個Git倉庫,分佈到不同的電腦上。這樣工作時就必須找一臺電腦充當伺服器倉庫的角色,每天24小時開機,其他每個人都從這個伺服器倉庫中拉取別人的提交,並且各自把各自的提交推送到這個伺服器倉庫裡。
git基礎操作
建立版本庫
版本庫又名倉庫,英文名repository,可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以”還原”。
新建GitTest目錄,在該目錄下建立版本庫。
git init
此時會在當前目錄下生成一個 .git
目錄,這個目錄是Git來跟蹤管理版本庫的。
提交檔案到索引庫
“索引”儲存工作樹內容的快照,並且將該快照作為下一個提交的內容。 因此,在對工作樹進行任何更改之後,並且在執行 git commit
命令之前,必須使用 git add
命令將任何新的或修改的檔案新增到索引。
新建test.txt檔案,寫入 Smi1e!!!\naaabbb
。
提交test.txt檔案到索引庫
git add test.txt
檢視目錄中所有修改過或已刪件但沒有提交的檔案
git add -i [<path>]
提交索引檔案到倉庫
-m引數是本次修改的描述
git commit -m "add a test.txt file"
關聯遠端倉庫
git remote add origin [email protected]:Github使用者名稱/GitTest.git
把本地庫的所有內容推送到遠端庫上
由於遠端庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令,不加任何引數使用 git push
。
git push -u origin master
顯示工作目錄和暫存區的狀態
git status
命令可以列出當前目錄所有還沒有被git管理的檔案和被git管理且被修改但還未提交( git commit
)的檔案
git status
git diff 檔案對比
假設倉庫裡已提交的有五個版本,依次提交的是A、B、C、D、E 。
不加引數即預設比較工作區與暫存區
git diff
檢視最近兩次提交版本的區別(版本E和版本D的差別)
git diff HEAD^ -- <filename>
命令則可以檢視最近一次提交和最近一次提交的上上個版本的區別(版本E和版本C的差別)
git diff HEAD^^ -- <filename>
檢視版本E和版本A的差別
git diff HEAD~4 -- <filename>
檢視版本歷史記錄
git log git log --pretty=oneline
版本回退
回退到上一個版本
git reset --hard HEAD^ git reset --hard [commit id]
HEAD
指向的版本就是當前版本
檢視git歷史命令
git reflog
撤銷工作區的修改
git reset HEAD <filename>
下面的命令還可以撤銷工作區中刪除的檔案
git checkout -- <filename>
從版本庫中刪除檔案
git rm <filename>
工作區和暫存區
工作區
工作區就是在電腦裡所看到的目錄。
版本庫
工作區中的 .git
目錄不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為 stage
(或者叫 index
)的暫存區,還有Git為我們自動建立的第一個分支 master
,以及指向 master
的一個指標叫 HEAD
。


建立和合並分支
建立+切換分支 dev
$ git checkout -b dev
git checkout命令加上-b引數表示建立並切換,相當於以下兩條命令:
$ git branch dev $ git checkout dev
建立分支
$ git branch dev
切換分支
$ git checkout master
檢視當前分支
git branch命令會列出所有分支,當前分支前面會標一個*號。
$ git branch * dev master
合併分支
合併分支時,加上–no-ff引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
git merge
命令用於合併指定分支到當前分支。
git merge dev git merge --no-ff -m "merge with no-ff" dev
刪除分支
$ git branch -d dev
儲存未提交的修改
git stash
會把所有未提交的修改(包括暫存的和非暫存的)都儲存起來,用於後續恢復當前工作目錄。
檢視已儲存的檔案
git stash list
恢復已儲存的檔案
git stash apply
恢復已儲存的檔案並刪除stash中的內容
git stash pop
標籤管理
建立標籤
預設標籤是打在最新提交的commit上的
$ git tag v1.0
對指定 commit id
打標籤
$ git tag v0.9 [commit id]
檢視所有標籤
$ git tag
檢視標籤資訊
git show <tagname>
刪除標籤
$ git tag -d v0.1
推送標籤到遠端
$ git push origin <tagname>
一次性推送全部尚未推送到遠端的本地標籤
$ git push origin --tags
刪除遠端標籤
先從本地刪除 $ git tag -d v0.9 Deleted tag 'v0.9' (was f52c633) 然後從遠端刪除 $ git push origin :refs/tags/v0.9 To github.com:michaelliao/learngit.git - [deleted]v0.9