git使用教程指南
前言
Git是一個開源的分散式版本控制系統。其核心就在於 版本控制 。
在實際編碼過程中,我們往往會忘記上次對檔案的修改內容。若是剛剛修改的還好說,撤銷操作即可。但若這是你昨天做的修改並關閉了IDE呢?所以我們需要有一個可以回退版本的工具。
Git還有另一個作用便是 多人協作開發 ——將程式碼檔案上傳至雲端,partner可以隨時下載至自己的電腦,又可以隨時做好修改再上傳至雲端。
我將學習Git分為三塊,大家跟著我的步驟做一遍也就會了。
- 配置Git及配置Github
- 本地Git操作
- 遠端推送操作
配置Git及配置Github
首先分清楚Git和Github的作用分別是什麼。你們可以理解為—— Git是運輸的小車,Github是倉庫 ,我們將東西裝上車,然後讓他送到倉庫去。
要想使用Git及Github服務,必須得建立Github賬號,Github官網: https://github.com/ 。
建立好賬號後,再new一個repository。然後,我們接著配置Git。
我們需要先下載Git工具,這是Git官網: https://git-scm.com ,根據自己計算機的系統下載即可。
而後我們需要在本地建立ssh key:
$ ssh-keygen -t rsa -C "[email protected]"
後面的[email protected]改為你在github上註冊的郵箱,之後會要求確認路徑和輸入密碼,我們這使用預設的一路回車就行。成功的話會在~/下生成.ssh資料夾,進去,開啟id_rsa.pub,複製裡面的ssh key。
回到github上,點選右上角頭像,選擇Settings(賬戶配置),選擇左邊欄的SSH and GPG keys,點選new SSH key,title隨便填,貼上上你電腦上生成的key。
配置完ssh key後,我們還需要配置username和email:
$ git config --global user.name "your name" $ git config --global user.email "[email protected]"
至此,Git的配置和Github的配置已經結束了,你已經有了可用的Git和可用的Github。接下來我們來學習如何進行本地Git操作。
本地Git操作
首先要學習幾個概念—— 工作區,暫存區,版本庫 。他們之間的關係如下圖
這三個區域其實沒有什麼神祕的,他們都是個資料夾(為樹結構)。他們的作用分別為
- 工作區:實際持有的資料夾,即你可以在 我的電腦 裡找到的資料夾。用於實際專案開發。
- 暫存區:他就如同一個快取,可以頻繁地將工作區中的檔案傳送到其中,從而使傳送過來的修改後的檔案覆蓋暫存區中的原檔案。
- 版本庫:暫存區將他的檔案傳送到版本庫中,用於傳送到Github倉庫中,作為最新版本。
這三個區域之間的關係及功能搞清楚了,接下來我會先說最重要的Git操作,學會這些操作後就可以直接進行生產活動了。而後,我再陳列其他較重要的的Git操作及更深層的辨析。
首先,建立一個資料夾做為工作區,不過要想這個資料夾成為工作區,需要cd到該資料夾,輸入 git init
哦!這樣其才是工作區,而不是普通的資料夾,切記。
然後,我們在資料夾中隨意進行修改,如建立txt檔案等。我在資料夾中建立了一個experiment.txt檔案,並寫入內容。根據上圖,我們需要將工作區的檔案傳送到暫存區,使用 git add -A
,該命令的意義為將所有的改動傳送到暫存區中。(實際上還有很多種git add方法,但一般來說git add -A已經足夠。)
再然後,將暫存區的檔案傳送到版本庫中,使用 git commit -m 'comments'
,其中comments為你對這個版本的說明文字。
好了,本地Git操作已經結束了,是不是非常簡單?只要三步就好了,我們來複習一遍。
$ git init $ git add -A $ git commit -m 'comments'
基礎的講好了,如果覺得已經夠用的,可以跳過下一階段。我們接下來進入更深的層次。
為什麼要有暫存區
為什麼要有暫存區,我們每次將實際改動的檔案直接傳送到版本庫不就好了?這樣也沒有任何問題啊,還省了一步。
其實你想的沒有錯,這樣是沒有問題的。不過這與軟體開發的一大基礎原則背道而馳了——單一職責原則。若是沒有暫存區,那麼版本庫就得既負責提交版本,又得負責儲存修改,使得Git一點也不優雅。這是兩個完全不同的功能,應該由兩個模組去分別完成。
分支
引用自https://guides.github.com/activities/hello-world/ 的一句話:
Have you ever saved different versions of a file? Branches accomplish similar goals in GitHub repositories.
意思就是:你是否為一個檔案備份了許多不同版本,在GitHub中分支完成同樣的目標。
我們之所以為一個檔案備份好多份檔案,就是擔心我們不備份的話,程式碼打著打著,突然發現出現了bug,而我們卻實在改不過來了,最簡單的方法就是回到沒有修改前的狀態,但我們已經回退不回去了。這樣的話,真的就是心態爆炸。
所以我們備份,但是最終我們發現,桌面一團糟。
所以分支就是這樣的作用—— 絕緣特性開發 ,簡而言之就是,給你一個除錯bug的分支,同時不影響其他分支。
預設情況下,都有一條主分支——master分支
以下是有關分支的操作:
$ git branch 分支名 //用於建立新的分支,該分支的內容就是當前主分支的內容。 $ git checkout 分支名 //切換到某一分支上 $ git branch -d 分支名 //刪除某一分支 $ git merge 分支名 //將該分支合併到當前分支上
要注意一點的是, git checkout 分支名
切換分支後,工作區、暫存區、版本區也都對應的全都改變,即 一個分支對應一套獨立的工作區、暫存區、版本區 ,其中我們可以直觀地看到的是,切換分支後,工作區(也就是你電腦裡的那個資料夾)的檔案內容發生了改變。
其中,我要講的是 $ git merge 分支名
這一操作。
分支合併($ git merge 分支名)
master是我們的主分支,而new是我們新建的分支,用於除錯程式碼。而當我們在該分支上除錯成功了,我們是不是應該將該分支的內容複製到主分支上?畢竟該分支new僅僅是我們為了除錯bug而創建出來的,master才是真正的主分支。
所以分支合併其實就是 將在B分支中修改的檔案覆蓋掉A分支中對應的檔案 ,未修改的檔案不覆蓋。
那麼,又有一個問題來了——如果A分支和B分支都修改了這個檔案呢?那麼應該聽誰的呢?
首先,這個情況我們稱為 分支合併衝突 ,其次, 當發生分支合併衝突時,他會將兩個分支的修改都儲存下來,但是要求你得手動修改檔案後才能commit提交。
其中,Git用<<<<<<<,=======,>>>>>>>標記出來自不同分支的內容。
回退版本
之前我們說過,Git的核心在於 版本控制 。那麼就自然要求Git得有版本回退的功能。
何為版本? 每次commit到版本庫後就是一個版本。
首先, 第一步—— git log
檢視歷史版本 :
第二步—— 擷取commit字樣後的任意字數,用作版本標識。如10feb9882453e57。
第三步—— git reset --hard 第二步擷取的版本標識
回退版本。
就這樣,我們就成功地回退版本啦!終於不用擔驚受怕自己一不小心腦子犯渾commit了一個錯誤的版本卻無法恢復了。
但由此又出現了一個問題,當你回退到以前的版本,那麼在以前的版本後的所有版本就都無法通過 git log
查找出來了。
對此,我們通過 git reflog
來解決。其意義為 檢視所有分支的提交操作,其結果也含有版本標識。
小技巧:如果你想要知道各個版本檔案內容修改的話,使用 git log -p
命令即可。
檢視修改內容
有時,我們想要知道還有什麼檔案需要add/commit,或是自己究竟做了什麼樣的修改內容,那麼我們可以通過 git status
和 git diff
來檢視。
git status
git status
的意義為 檢索本地倉庫的檔案更新狀態。
這說的太籠統了,執行該命令顯示的內容如下:
- 已修改的,未暫存的檔名稱
- 已暫存,為提交的檔名稱
- 未追蹤到的檔案
其中,要解釋一下 未追蹤檔案 的意義:
- 已追蹤檔案:在倉庫之前的版本快照中包含檔案的記錄,在使用者工作一段時間過後,這些檔案同樣能被追蹤到(如檔案的修改和刪除)。可以理解為,原來就有的檔案,非新增檔案。
- 未追蹤檔案:一些檔案的新增
git diff
git diff
的意義為 檢視所有檔案進行的具體的修改,新增到暫存區則看不了 。
與其對應的是 git diff staged
,意義為 檢視新增至暫存區所有的內容修改
遠端推送操作
當你學到這裡的時候,離成功就只剩一步之遙了,堅持下去,加油!
現在我們在本地倉庫中的版本庫中準備好要推送到遠端倉庫的版本檔案了,可是我們現在連要傳送到哪一個遠端倉庫的地址都不知道,所以第一步是—— 建立本地倉庫與遠端倉庫的連線。
建立連線
建立連線的方法有一下幾種:
-
git remoted add 遠端主機名 [email protected]:GitHub名稱/遠端倉庫名.git
。這個命令用於將本地倉庫和遠端倉庫連線起來。 -
git clone [email protected]:GitHub名稱/遠端倉庫名.git
。將遠端倉庫的檔案夾克隆到本地目錄中。
連線成功了之後,便可以進行push和pull操作了。
git push
該命令的意義是 將本地版本庫的分支推送到遠端版本庫的對應分支 。
git push
的一般形式為 git push <遠端主機名> <本地分支名>:<遠端分支名>
。
其中,一旦使用上面兩種方法連線遠端倉庫成功,則遠端倉庫名稱為origin。
git pull
該命令的意義是 將遠端倉庫的分支下載至本地,並將其合併到對應分支 ,其實這一個命令是 git fetch
和 git merge 分支名
的縮寫。
git pull
的一般形式為 git pull <遠端主機名> <本地分支名>:<遠端分支名>
。
全文結束。
參考資料
- git add documents: https://www.git-scm.com/docs/git-add
- 為什麼要先 git add 才能 git commit ? https://www.zhihu.com/question/19946553
- GitHub簡明教程: http://www.runoob.com/w3cnote/git-guide.html
- git status和git diff: https://www.cnblogs.com/kkz-org/p/9313205.html
- git 遠端倉庫和本地倉庫建立連線: https://blog.csdn.net/wowoniuzailushang/article/details/78545971
- Git push: https://www.cnblogs.com/qianqiannian/p/6008140.html