git是目前最先進的分佈式版本控制系統
一.集中式VS分佈式
1.集中式:版本庫是集中放在中央服務器的,而幹活的時候是用自己電腦,先從中央服務器獲取最新版本,然後工作。工作完畢,推送給中央服務器
2.分佈式:分佈式系統中根本沒有“中央服務器“,每個人的電腦上有一個完整的頒佈,工作的時候不必聯網,因爲版本庫就在本機
二.Windows上安裝Git
百度搜索git,下載國內鏡像就可以,直接安裝就可以
安裝完成,鼠標右鍵Git Bash Here,進行設置
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
三.創建版本庫
1.選擇一個合適的地方,創建一份空目錄
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd:顯示當前位置
2.將這個目錄變成git可以管理的倉庫
$ git init
3.新建一個文件,如何加入git倉庫?
(1)git add 文件名
(2)git commit -m "備註"
當我們成功提交了一份文件,我們可以使用 git status 查看倉庫當前的狀態。同樣我們可以使用git diff 查看文件具體被修改了什麼內容。
四.版本退回修改,撤銷,刪除
1.版本退回 git reset
使用git log 命令可以用於查看提交歷史,以便確定好退回到哪一個版本,顯示的順序是最近到最遠提交的日誌
git log --pretty=oneline 格式控制,前面的一串表示commit id,紅色部門表示版本號
$ git log --pretty=oneline
<span style="color:#ff0000;">3628164</span>fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
HEAD表示當前版本,HEAD^表示上一個版本,HEAD^^表示上上個版本
git reset --hard HEAD^ 退回到上一個版本
git reset --hard 3628164 退回到某一個版本
注意:要重返未來,用git
reflog
查看命令歷史,以便確定要回到未來的哪個版本
2.版本退回 gitcheckout --file
如果你不小心改錯了文件,如果還沒有進行add,commit,可以很容易修改,因爲文件修改過後還沒有放到暫存區,現在撤銷就回到和版本庫中一模一樣的狀態
如果已經添加到暫存區,可以使用git checkout --file
注意:git checkout -- file
命令中的--
很重要,沒有--
,就變成了“切換到另一個分支”的命令
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
3.刪除文件正常情況下在文件管理器中將沒有用的文件刪除了,可以使用rm 文件,此時git 知道你把文件刪除了,可以使用git status查看刪除了那些文件
如果確定要從版本庫中刪除該文件:git rm 文件,再commit
如果不小心刪除錯了,可以從版本庫中恢復:git checkout --文件
五.遠程倉庫
1.創建SSH Key
$ ssh-keygen -t rsa -C "[email protected]"
如果一切順利的話,可以在用戶主目錄裏找到.ssh
目錄,裏面有id_rsa
和id_rsa.pub
兩個文件,這兩個就是SSH
Key的祕鑰對,id_rsa
是私鑰,不能泄露出去,id_rsa.pub
是公鑰,可以放心地告訴任何人
2.登錄GitHub
找到Settings,Add SSH Key,添加任意title在key裏面粘貼:id_rsa.pub文件的內容
3.添加遠程倉庫
在git上創建一個倉庫,名字就是自己本地倉庫的名字就可以,如何將本地倉庫與遠程庫關聯?
添加後,遠程庫的名字就是origin
,這是Git默認的叫法,也可以改成別的,但是origin
這個名字一看就知道是遠程庫。
$ git remote add origin [email protected]:michaelliao/learngit.git
使用git push -u orgin master,把本地庫的內容推送到遠程,用git
push
命令,實際上是把當前分支master
推送到遠程。
由於遠程庫是空的,我們第一次推送master
分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
注意:SSH警告
當你第一次使用
$ git merge --no-ff -m "merge with no-ff" dev
Git的
clone
或者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的服務器,輸入yes
回車即可。Git會輸出一個警告,告訴你已經把GitHub的Key添加到本機的一個信任列表裏了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
這個警告只會出現一次,後面的操作就不會有任何警告了
4.從遠程庫克隆 git clone
$ git clone [email protected]:michaelliao/gitskills.git
六.分支管理
1.創建合併分支:
(1)創建分支:git checkout -b dev ,其中-b表示創建並切換,相當於先git branch dev,再git checkout dev
(2)查看當前分支:git branch
(3)合併分支:git merge dev,合併的模式是:快進模式
(4)刪除分支:git branch -d dev
2.解決衝突
當兩個分支上都對某個文件進行了修改,合併的時候會有衝突,先手動解決衝突,在提交,合併。用git
log --graph
命令可以看到分支合併圖
3.分支管理策略
分支合併的時候,git會用fast forward模式,這種模式下,刪除分支後,會丟掉分支信息,可以強制禁用fast forward 模式,這樣git在merge會生成一個新的commit,這樣可以從分支歷史上看出分支信息
$ git merge --no-ff -m "merge with no-ff" dev
4.Bug分支
當手頭工作沒有完成時,先把工作現場git
stash
一下,然後去修復bug,修復後,再git
stash pop
,回到工作現場。
修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
總結:
(1)--no-ff:不使用fast-forward方式合併,保留分支的commit歷史
(2)--squash:使用squash方式合併,將多次分支commit歷史壓縮爲一次
5.Feature分支
添加一個新功能時,你肯定不希望因爲一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分支,在上面開發,完成後,合併,最後,刪除該feature分支。如果要丟棄一個沒有被合併過的分支,可以通過git
branch -D <name>
強行刪除。
最後:
-
查看遠程庫信息,使用
git remote -v
; -
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
-
從本地推送分支,使用
git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交; -
在本地創建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致; -
建立本地分支和遠程分支的關聯,使用
git branch --set-upstream branch-name origin/branch-name
; -
從遠程抓取分支,使用
git pull
,如果有衝突,要先處理衝突。 -
-
命令
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>
可以刪除一個遠程標籤。
-
-