
什么是Git?
Git是一款免費、開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項目。
創(chuàng)建版本庫
版本庫又名倉庫,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
怎么做
- 初始化一個Git倉庫,使用
git init
命令。 - 添加文件到Git倉庫,分兩步:
- 使用命令
git add <file>
,可反復(fù)多次使用,添加多個文件; - 使用命令
git commit
,完成。
- 使用命令
時光穿梭機
- 使用
git status
命令,隨時掌握工作區(qū)的狀態(tài)。 - 如果如果
git status
告訴你有文件被修改過,用git diff
可以查看修改內(nèi)容。
版本回退
-
HEAD
指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。 - 穿梭前,用
git log
可以查看提交歷史,以便確定要回退到哪個版本。 - 要重返未來,用
git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
工作區(qū)和暫存區(qū)
工作區(qū)(Working Directory): 就是你在電腦里能看到的目錄。
版本庫(Repository):工作區(qū)有一個隱藏目錄.git
,這個不算工作區(qū),而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動穿件的第一個分支master
,以及指向master
的一個指針叫HEAD
。
你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。
管理修改
- Git跟蹤并管理的是修改,而非文件。
- 每次修改,如果不
add
到暫存區(qū),那就不會加入到commit
中。
撤銷修改
- 場景1:當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令
git checkout -- file
。 - 場景2:當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令
git reset HEAD file
,就回到了場景1,第二步按場景1操作。 - 場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節(jié),不過前提是沒有推送到遠程庫。
刪除文件
一般情況下,你通常直接在文件管理器中把沒用的文件刪了,或者用rm
命令刪了
這個時候,Git知道你刪除了文件,因此,工作區(qū)和版本庫就不一致了,git status
命令會立刻告訴你哪些文件被刪除了;
現(xiàn)在你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,并且git commit
現(xiàn)在,文件就從版本庫中被刪除了。
另一種情況是刪錯了,因為版本庫里還有呢,所以可以很輕松地用git checkout
把誤刪的文件恢復(fù)到最新版本,git checkout
其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除,都可以“一鍵還原”。
命令git rm
用于刪除一個文件。如果一個文件已經(jīng)被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復(fù)文件到最新版本,你會丟失最近一次提交后你修改的內(nèi)容。
遠程倉庫
自行注冊GitHub賬號。由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以,需要一點設(shè)置:
- 第1步:創(chuàng)建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub。
這兩個文件,如果已經(jīng)有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認值即可,由于這個Key也不是用于軍事目的,所以也無需設(shè)置密碼。
如果一切順利的話,可以在用戶主目錄里找到.ssh
目錄,里面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa
是私鑰,不能泄露出去,id_rsa.pub
是公鑰,可以放心地告訴任何人。 -
第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:
然后,點“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
github-addkey-1點“Add Key”,你就應(yīng)該看到已經(jīng)添加的Key:
github-addkey-2
添加遠程庫
- 要關(guān)聯(lián)一個遠程庫,使用命令
git remote add origin git@server-name:path/repo-name.git
; - 關(guān)聯(lián)后,使用命令
git push -u origin master
第一次推送master分支的所有內(nèi)容; - 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改; - 分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而SVN在沒有聯(lián)網(wǎng)的時候是拒絕干活的!當有網(wǎng)絡(luò)的時候,再把本地提交推送一下就完成了同步。
從遠程庫克隆
- 要克隆一個倉庫,首先必須知道倉庫的地址,然后使用
git clone
命令克隆。 - Git支持多種協(xié)議,包括
https
,但通過ssh
支持的原生git
協(xié)議速度最快。
分支管理
Git的分支是與眾不同的,無論創(chuàng)建、切換和刪除分支,Git在1秒鐘之內(nèi)就能完成!無論你的版本庫是1個文件還是1萬個文件。
創(chuàng)建與合并分支
Git鼓勵大量使用分支:
查看分支:git branch
創(chuàng)建分支:git branch <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
解決沖突
當Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。用git log --graph
命令可以看到分支合并圖。
分支管理
在實際開發(fā)中,我們應(yīng)該按照幾個基本原則進行分支管理:
- 首先,
master
分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時不能在上面干活; - 那在哪干活呢?干活都在
dev
分支上,也就是說,dev
分支是不穩(wěn)定的,到某個時候,比如1.0版本發(fā)布時,再把dev
分支合并到master
上,在master分
支發(fā)布1.0版本; - 你和你的小伙伴們每個人都在
dev
分支上干活,每個人都有自己的分支,時不時地往dev
分支上合并就可以了。 -
所以,團隊合作的分支看起來就像這樣:
git-br-policy
小結(jié)
- Git分支十分強大,在團隊開發(fā)中應(yīng)該充分應(yīng)用。
- 合并分支時,加上
--no-f
f參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward
合并就看不出來曾經(jīng)做過合并。
Bug分支
- 修復(fù)bug時,我們會通過創(chuàng)建新的bug分支進行修復(fù),然后合并,最后刪除;
- 當手頭工作沒有完成時,先把工作現(xiàn)場
git stash
一下,然后去修復(fù)bug,修復(fù)后,再git stash pop
,回到工作現(xiàn)場。
Feature分支
- 開發(fā)一個新feature,最好新建一個分支;
- 如果要丟棄一個沒有被合并過的分支,可以通過
git branch -D <name>
強行刪除。
多人協(xié)作
- 查看遠程庫信息,使用
git remote -v
; - 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
- 從本地推送分支,使用
git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交; - 在本地創(chuàng)建和遠程分支對應(yīng)的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致; - 建立本地分支和遠程分支的關(guān)聯(lián),使用
git branch --set-upstream branch-name origin/branch-name
; - 從遠程抓取分支,使用
git pull
,如果有沖突,要先處理沖突。
標簽管理
發(fā)布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本。將來無論什么時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來。所以,標簽也是版本庫的一個快照。
創(chuàng)建標簽
- 命令
git tag <name>
用于新建一個標簽,默認為HEAD
,也可以指定一個commit id; -
git tag -a <tagname> -m "blablabla..."
可以指定標簽信息; -
git tag -s <tagname> -m "blablabla..."
可以用PGP簽名標簽; - 命令
git tag
可以查看所有標簽。
操作標簽
- 命令
git push origin <tagname>
可以推送一個本地標簽; - 命令
git push origin --tags
可以推送全部未推送過的本地標簽; - 命令
git tag -d <tagname>
可以刪除一個本地標簽; - 命令
git push origin :refs/tags/<tagname>
可以刪除一個遠程標簽。
使用GitHub
- 在GitHub上,可以任意Fork開源倉庫;
- 自己擁有Fork后的倉庫的讀寫權(quán)限;
- 可以推送pull request給官方倉庫來貢獻代碼。
此教程基源于廖雪峰的官方網(wǎng)站Git教程
其他好的Git學習網(wǎng)站
寶劍鋒從磨礪出,梅花香自苦寒來。加油吧,繼續(xù)向前。