第一章 由來
-
GitHub是為開發者提供Git倉庫的托管服務。
-
Git與GitHub的區別:在Git中,開發者將源代碼存入名叫“Git倉庫”的資料庫中並使用;而GitHub則是在網絡上提供Git倉庫的一項服務。
-
Pull Request使得地球上不同位置不同時間的開發者共同開發軟件。
-
GitHub Flavored Markdown語法被用於GitHub作文字標記使用。
-
GitHub以人為中心,我們可以看到一個人公開的所有源代碼,還能看出其他的信息,包括提交信息等。
-
Issue功能是將一個任務或問題分配給一個Issue進行追求和管理的功能。
第二章 基本知識簡介
-
版本管理就是管理更新的歷史記錄。
-
集中型,將所有數據集中存放在服務器中,便於管理,但一旦開發者所處環境無法連接服務器時,就無法獲取最新的源代碼,使得開發停滯下來。萬一翻身服務故障導致數據消失,那就一切前功盡棄了。
-
分散性,GitHub將倉庫Fork給了每一個用戶,分散性擁有多個倉庫,開發者本地就有倉庫,無需連接遠程服務器就可以進行開發。
-
Fork就是將GitHub的某個特定倉庫復制到自己的賬戶下,Fork的倉庫與原倉庫是兩個不同的倉庫,開發者可以隨便編輯。
-
所有倉庫之間可以push和pull,即使不通過GitHub,開發者A也可以直接向開發者B的倉庫進行push和pull。
-
linux和mac系統自帶Git,windows安裝git應用程序git bash。
-
設置姓名和郵箱地址,輸入內容會在
~/.gitconfig
中顯示
git config --global user.name "Firstname Lastname"
git config --global user.email "email@example.com"
- 另外,為了提高可讀性,可以設置
git config --global corlor.ui auto
第三章 初始操作
3.1 注冊賬號
-
注冊賬號https://github.com/
-
設置SSH Key,GitHub上連接已有倉庫時的認證,是通過使用了SSH的公開密鑰認證方式進行的。
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key
(/Users/your_user_directory/.ssh/id_rsa): 按回車鍵
Enter passphrase (empty for no passphrase): 輸入密碼
Enter same passphrase again: 再次輸入密碼
需求:注冊有限,密碼,生成的ssh密鑰會放置在/Users/your_user_directory/.ssh/
,包括id_rsa
和id_rsa.pub
。
然后將id_rsa.pub
其添加至注冊GitHub賬號的SSH keys中,id_rsa
是私鑰,需要自己慎重保存,切勿公開。添加位置
之后就可以使用手中的私人密鑰與GitHub進行認證和通信了。測試:
ssh -T git@github.com
Hi hugechuanqi! You've successfully authenticated, but GitHub does not provide shell access.
表示成功。
3.2 創建倉庫
-
創建倉庫repository,參考筆記
-
.gitgnore
文件記錄不需要在Git倉庫中進行版本管理的文件。 -
README.md文件標明本倉庫所包含的軟件的概要、使用流程、許可協議等信息。
-
clone倉庫,將已有倉庫clone到本地電腦上進行開發:
git clone https://github.com/hugechuanqi/MachineLearing.git
-
然后編寫代碼或其他文件,例如
.md, .py, .cpp, .c, .java, .txt
等,此處假設為hello_world.php,內容自定。 -
提交,通過
git add
命令將文件加入暫存區,再通過git commit
命令提交
git add hello_world.php
git commit -m "Add very good script by php"
-m表示提交說明
可以通過git log
查看日志;公開的源代碼也擁有軟件著作權,協議包括BSD修正協議,Apache許可協議,MIT許可協議。
- 然后執行push,GitHub上的倉庫就會被更新:
git pull
第四章 具體實際操作
4.1 初始化倉庫及相關操作
- git init初始化倉庫,要使用版管理,首先得初始化一個倉庫,實際建立一個目錄並初始化倉庫:
mkdir git-tutorial
cd git-tutorial
git init
目錄底下會生成.git目錄,存儲着管理當前目錄內容所需的倉庫數據。在Git中,這個目錄的內容成為“附屬於該倉庫的工作樹”,文件編輯等操作在工作樹中進行。
-
git status顯示Git倉庫的狀態。
-
git add表示向暫存區中添加文件。
-
git commit命令可以將當前的暫存區中的文件實際保存到倉庫的歷史紀錄中,保存倉庫的歷史記錄。
-
git log查看提交日志
git log -p
顯示文件的改動
git log -p README.md
僅查看README.md文件的提交日志。
git diff
查看更改前后的差別,可以查看工作樹、暫存區、最新提交之間的差別。
4.2 分支操作
-
分支操作:從master分支創建feature-A分支和fix-B分支,每個分支中都擁有自己的最新代碼;master分支是Git默認創建的分支。
-
git branch命令可以顯示分支名列表;
-
git checkout -b創建和切換分支;
git checkout -b feature-A
git checkout master
表示切換到master分支
git checkout -
切換回上一個分支
-
特性分支,是集中實現單一特性,除此之外不進行任何作業的分支,往往特性分支會有數個,如feature-A,而保留一個可以隨時發布軟件的穩定分支,如master。
-
主干分支,master,是特性分支的原點,也是特性分支的終點。
-
git merge合並分支,假設分支feature-A上的內容已經實現完畢,這時應該先切換到主干分支master中,然后
git merge --no-ff feature-A
- git reset 回溯歷史版本
git reset --hard 3e3e67a1a94cc6180dcd0bbdd2efa91076073422
其中這一長串數字是時間節點的哈希值。git log之后就可以看到,在commit后面。
git checkout -b fix-B
創建特性分支
4.3 消除沖突
- 消除沖突,系統在合並README.md時,feature-A分支更改的部分與本次想要合並的fix-B分支更改的部分發生了沖突,因此需要解決這個沖突。打開README.md文件會發現以下內容:
<<<<<<< HEAD
- Feature-A
=======
- fix-B
>>>>>>> fix-B
其中,=======以上的部分是當前HEAD的內容,以下的部分是要合並的fix-B分支中的內容。我們在編輯器中將其改成想要的樣子,即
- Feature-A
- fix-B
這樣,就可以讓feature-A和fix-B的內容並存於文件之中;但是在實際中,往往需要刪除其中一個。然后提交:
git add README.md
git commit -m "solve the conflict"
- git commit --amend修改提交信息
git commit --amend
然后在編輯器中修改並保存
隨后git log --graph就可以看到提交日志的相應內容已經被修改。
4.4 壓縮歷史
- git rebase -i 壓縮歷史,若發現前一個提交內容有錯,則提交一個修改,並將這個修改包含到前一個提交之中,壓縮成一個歷史記錄。過程為:
git checkout -b feature-C
#創建新分支git commit -am "Add feature-C"
#提交內容git diff
#查看修改后的差別,如何修改內容就是對文件的操作了git commit -am "Fix typo"
#Fix typo英文意思是錯字和漏字git rebase -i HEAD~2
#將修改的內容“Fix typo”與前一次的提交合並
- git checkout master 切換到主分支
- git merge --no-ff feature-C 將分支feature-C與master主分支合並
4.5 推送至遠程倉庫
-
Git是分散型版本管理系統,為防止與其他倉庫混淆,倉庫名請與本地倉庫保持一致,即git-tutorial。為了提高整合性,創建倉庫時不要勾選初始化README文件。
-
git remote add 添加遠程倉庫。在GitHub上創建的倉庫路徑為"git@github.com: 用戶名/git-tutorial.git"。用git remote add命令將其設置成本地倉庫的遠程倉庫。例如:
git remote add original git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git
上述操作之后,Git會自動把git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git遠程倉庫的名稱設置為origin(標志符)。
-
git push 推送至遠程倉庫
git push -u origin master
把當前分支的內容推送給遠程倉庫origin的master分支。-u闡述可以在推送的同時,將origin倉庫的master分支設置為本地倉庫當前分支的upstream(上游)。添加-u闡述有利於之后運行git pull
命令從遠程倉庫獲取內容時,省去了另外添加的麻煩。
-
git push 推送至master以外的分支
git checkout -b feature
創建分支git push -u origin feature-D
將當前分支push給遠程倉庫並保持分支名稱不變。之后就可以在遠程倉庫的GitHub頁面就可以查看到feature-D分支。
4.5 從遠程倉庫獲取
-
git clone 獲取遠程倉庫。
切換到非倉庫目錄名
下后,執行git clone git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git
,我們會默認處於master分支,同時系統會自動將origin設置成該遠程倉庫的標識符。即當前倉庫的master分支與GitHub端的遠程倉庫(origin)的master分支在內容上完全相同。 -
git branch -a 命令查看當前分支的相關信息。
-
獲取遠程的feature-D分支(??此處有點問題,今天暫時沒時間修改)
git checkout -b feature-D origin/feature-D
. -b參數后面是本地倉庫中新建分支的名稱。為了與遠程倉庫origin/feature-D
保持同名,此處-b后面也起名為feature-D
,過程如下:
git init
git remote add origin git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git #將遠程倉庫名稱設置為origin
git checkout -b feature-D origin/feature-D #新建分支,並獲取遠程分支內容
- git pull 獲取最新的遠程倉庫分支
git pull origin feature-D
將本地的feature-D分支更新到最新狀態。如果兩人同時修改了同一部分的源代碼,push時就很容易發生沖突,所以多人同時在同一個分支中進行作業時,為減少沖突情況的發生,建議更頻繁地進行push和pull操作。
推薦資料:
1、Pro Git:http://git-scm.com/book/zh/v1,是一本零基礎Git學習資料。 由 Scott Chacon書寫。
2、LearnGiBranching:http://pcottle.github.io/learnGitBranching/,是學習Git基本操作的網站,偏重樹形結構。
3、tryGit:http://try.github.io/ 可以在Web上一邊操作一邊學習Git的基本功能。
97/286 未完待續
參考:書籍:github入門與實踐