GitHub入門與實踐讀書筆記

1.1 GitHub簡介

GitHub是為開發者提供Git倉庫的托管服務。這是一個讓開發者與朋友、同事、同學以及陌生人共享代碼的完美場所。

社會化編程

GitHub曾經的logo里面就有Social Coding這個概念,任何人都可以比從前更加容易地獲得源代碼,將其自由更改并加以公開。

在Github各個頁面按下shift + /都可以打開鍵盤快捷鍵一覽表。

Explore:最尖端的技術和軟件

Gist:使用JavaScript編寫的Ace編輯器,管理和發布一些沒必要保存在倉庫中的代碼,如比較小的代碼片段。

2.1 版本管理

集中型:以Subversion為代表,將所有數據存放在服務器中,有便于管理的優點,但是,一旦開發者所處的環境不能連接服務器,就無法獲得最新的源代碼。

分散型:以Git為代表,可以擁有多個倉庫,開發者不必連接遠程倉庫就可以開發。

2.2 Git初始設置

設置姓名和郵箱

$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "youremail@example.com"

這個命令會在“.../User/.gitconfig”中輸出設置文件,想要更改信息時,可以直接更改設置文件。

其他初始化操作

$ git config -global core.editor <editor>  #設置默認文本編輯器
$ git config -global merge.tool <tool>  #設置解決合并沖突時差異分析工具
$ git config --list  #檢查已有的配置信息

創建新版本庫

$ git clone <url>  #克隆遠程版本庫
$ git init  #初始化本地版本庫

提高命令輸出的可讀性

$ git config --global color.ui auto

3.1 GitHub的前期準備

  • 創建賬戶
  • 設置頭像(通過Gravatar服務器顯示)
  • 設置SSH Key

https 和 SSH 的區別

  1. 前者可以隨意克隆github上的項目,而不管是誰的;而后者則是你必須是你要克隆的項目的擁有者或管理員,且需要先添加 SSH key ,否則無法克隆。
  2. https url 在push的時候是需要驗證用戶名和密碼的;而 SSH 在push的時候,是不需要輸入用戶名的,如果配置SSH key的時候設置了密碼,則需要輸入密碼的,否則直接是不需要輸入密碼的。

在 github 上添加 SSH key 的步驟

  • 檢查你電腦是否已經有 SSH key ,運行 git Bash 客戶端,輸入如下代碼:
$ cd ~/.ssh
$ ls

這兩個命令就是檢查是否已經存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已經存在,那么你可以跳過步驟2,直接進入步驟3。

  • 創建一個 SSH key
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
# Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
Enter passphrase (empty for no passphrase): 
# Enter same passphrase again:

如果結果為

Your identification has been saved in /c/Users/you/.ssh/id_rsa.
# Your public key has been saved in /c/Users/you/.ssh/id_rsa.pub.
# The key fingerprint is:
# 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com

SSH key 已經創建成功,你只需要添加到github的SSH key上就可以。

  • SSH key 到 github上面去
  1. 需要拷貝 id_rsa.pub 文件的內容,你可以用編輯器打開文件復制。
  2. 登錄你的github,從又上角的設置進入,然后點擊菜單欄的 SSH key 進入頁面添加 SSH key。
  3. 點擊 Add SSH key 按鈕添加一個 SSH key 。把你復制的 SSH key 代碼粘貼到 key 所對應的輸入框中,記得 SSH key 代碼的前后不要留有空格或者回車。
  • 測試SSH Key

在Git Bash中輸入

$ ssh -T git@github.com

或者

$ ssh -T -p 443 git@ssh.github.com

有一段警告

The authenticity of host 'github.com (207.97.227.239)' can't be established.
# RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
# Are you sure you want to continue connecting (yes/no)?

輸入 yes 回車,如果創建 SSH key 的時候設置了密碼,接下來就會提示你輸入密碼,如:

Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa':

當然如果你密碼輸錯了,會再要求你輸入,直到對了為止。

注意:輸入密碼時如果輸錯一個字就會不正確,使用刪除鍵是無法更正的。

密碼正確后你會看到下面這段話,如:

Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.

查看分支間的差別

4.1 Git基本操作

git init--初始化倉庫

用 git init 在目錄中創建新的 Git 倉庫。 你可以在任何時候、任何目錄中這么做,完全是本地化的。
在目錄中執行 git init,就可以創建一個 Git 倉庫了。比如我們創建 runoob 項目:

$ mkdir runoob
$ cd runoob
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 在 /runoob/.git/ 目錄初始化空 Git 倉庫完畢。

在Git中我們稱這個目錄的內容為“附屬于該倉庫的工作樹”,文件的編輯等操作在工作樹中進行,然后記錄到倉庫中,以此管理文件的歷史快照。如果需要恢復之前的狀態,可以從倉庫調取之前的快照。

git status--查看倉庫狀態

git status -s以獲得簡短的結果輸出。

git add --向暫存區添加文件

git add . 命令來添加當前項目的所有文件

git commit 保存倉庫的歷史記錄

$ git commit -m "First commit"
# -m 參數后面的"First commit稱作提交信息
$ git commiy -am "Add something"
# 包含了git add 和 git commit

如果想要記錄更加詳細的信息,直接執行“git commit”命令即可,編輯器記錄提交信息的格式為:

  • 第一行:用一行文字簡述提交的更改內容
  • 第二行:空行
  • 第三行:級數更改原因和詳細內容

退出和保存操作參照Vim編輯器基本操作

git commit -a跳過git add 提交緩存的流程

git log--查看提交日志

$ git log --pretty=short
# 只讓程序顯示第一行簡述信息
$ git log README.md
# 只顯示指定文件的信息
$ git log -p
# 查看提交帶來的改動
$ git log -p README.md

git diff--查看當前工作樹和暫存區的區別

$ git diff HEAD
# 查看工作樹與最新提交的區別,可以在git commit之前用

尚未緩存的改動:git diff
查看已緩存的改動: git diff --cached
查看已緩存的與未緩存的所有改動:git diff HEAD
顯示摘要而非整個 diff:git diff --stat

4.2 推送遠程倉庫

需要在GitHub上建立與本地倉庫一致的遠程倉庫,創建時不要生成README.md文件。

git remote add--添加遠程倉庫

$ git remote add origin git@github.com:WangYixin-Tom/Modern-Signal-Processing.git

這項指令可以直接從GitHub上拷貝。

git push--推送至遠程倉庫

$ git push -u origin master

本地倉庫的master分支將會被推送到遠程倉庫中。

遠程倉庫也可以創建其他分支。例如分支feature-D,將它以同名形式push至遠程倉庫。

$ git checkout -b feature-D     #本地倉庫建立分支
$ git push -u origin feature-D  #推送至遠程倉庫

如果提示: error setting certificate verify locations,需要重新定位整證書的位置,并再次推送。

git config --system http.sslcainfo "D:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt"

4.3 從遠程倉庫獲取

$ git clone git@github.com:github-book/git-tutorrial.git    #注意不要與之前的倉庫在同一個目錄下
$ git branch -a     #查看分支信息
$ git checkout -b feature-D origin/feature-D        #將遠程倉庫中分支獲取至本地倉庫
$ git diff  #修改之后,查看修改
$ git commit -am "Add feature-D"
$ git push

如果需要獲得最新的遠程倉庫分支

$ git pull origin feature-D

如果兩人同時修改了同一部分的源代碼,push時就很容易發生沖突。所以多名開發者在同一個分支作業時,建議頻繁進行push和pull操作。

4.4 分支

不同的分支中,可以同時進行完全不同的作業,等該分支的作業完成之后再與master分支合并,可以實現多人高效地并行開發。

  • git branch :顯示所有分支

  • git checkout -b feature-A :創建名為feature-A的分支

  • git branch feature-A

    git checkout feature-A:和上面指令相同效果

  • git checkout -:切換至上一分支

  • git merge --no-ff feature-A:合并分支

  • git log--graph:以圖表查看分支

4.5 更改操作

  • git reset --hard 目標時間點哈希值:回溯到指定時間點,哈希值只要輸入4位以上就可以執行。
  • git reset HEAD:用于取消已緩存的內容。
  • git reflog:查看當前倉庫執行過的操作日記

merge分支的時候,可能會有沖突,這個時候需要手動查看沖突部分,在編輯器中修改成我們希望得到的樣子。然后重新執行add和commit 命令。

  • git commit amend:修改提交信息

在合并特性分支之前,如果發現已經提交的內容中有拼寫錯誤等,可以提交一個修改,將修改壓縮到一個歷史記錄中。

  • git rebase -i HEAD~2

5.1 Pull Request

定義:自己修改源代碼之后,請求對方倉庫采納該修改時采取的一種行為。在網絡上也常常被簡稱為PR。

Pull Request一般流程

  1. Fork源代碼管理者的遠程倉庫,建立自己的遠程倉庫
  2. pull需要修改的特性分支到自己本地倉庫
  3. 新建需要修改的特性分支,并做相應修改
  4. push到自己的遠程倉庫
  5. 發送PullRequest

clone

$ git clone git@github.com:hirocastest/first-pr.git
$ cd first-pr

branch

$ git branch -a #查看clone出的倉庫分支
$ git checkout -b work gh-pages #創建work分支并自動切換
$ git branch -a #確認切換work分支
$ ls    #查看文件列表,并對相應文件做修改

提交修改

$ git diff  #查看修改是否正確進行
$ git add index.html 
$ git commit -m "Add my impression"
$ git push origin work #創建遠程分支
$ git branch -a #查看遠程分支

為了防止開發到一半的Pull Request被誤合并,可以在標題前面加上[WIP]表示Work In Process。完成之后再去掉這個標記。

如果用戶對該倉庫擁有編輯權限,則可以直接創建分支,從分支發送Pull Request??梢悦馊ork的麻煩。

6.1 倉庫的維護

可以將原倉庫設置為遠程倉庫,從該倉庫fetch數據并與本地倉庫進行合并,讓本地倉庫保持最新的狀態。

  • Fork與clone
$ git clone git@github.com:hirocastest/Spoon-Knife.git
$ cd Spoon-Knife
  • 原倉庫設置名稱
$ git remote add upstream git://github.com/octocat/Spoon-knife.git #upstream作為原倉庫的表示符
  • 獲取最新數據
$ git fetch upstream        #獲取最新源代碼
$ git merge upstream/master #合并

以后只要重復這一步驟即可。

6.2 Pull Request的接收

首先可以通過代碼審查,進行評論和比較。

其次,可以在本地開發環境中反映Pull Request的內容變化

  • 將接收方的本地倉庫更新至最新狀態
$ git clone git@github.com:ituring/first-pr.git
$ cd first-pr
  • 獲取發送方的遠程倉庫
$ git remote add PR發送者 git@github.com:PR發送者/first-pr.git
$ git fetch PR發送者
  • 創建用于檢查的分支
$ git checkout -b pr1
  • 合并
$ git merge PR發送者/work

實際開發之中需要檢查軟件是否能正常運行

  • 刪除分支
$ git branch -D pr1

刪除沒有用的pr1分支

GitHub上點擊Merge Pull Request自動合并至倉庫或者利用CLI進行合并操作再push至GitHub

  • 合并到主分支
$ git checkout gh-pages     # 切換至 gh-pages 分支
$ git merge PR發送者/work  #合并分支
$ git diff origin/gh-pages #查看兩者區別,確認
# git push

用這種方法處理之后倉庫的PR自動從open狀態切換到close狀態。

7.1 GitHub Flow的流程

  • 令master分支時常保持可以部署的狀態
  • 可以進行新的作業時要從master分支創建新分支,新分支名稱要具有描述性
  • 在新建的本地倉庫分支中進行提交
  • 在GitHub端倉庫創建同名分支,定期push
  • 需要幫助或者反饋時,發送Pull Request
  • 讓其他開發者進行審查,確認作業后與master分支合并

查看GitHub的分支列表頁面(https://github.com/用戶名/倉庫名/branches)還可以輕松掌握各分支與master分支的差別。

附錄

Vim 編輯器基本操作

按下Esc; 進入命令模式,然后輸入

  • :q 離開 (short for :quit)
  • :q! 離開,不保存(short for :quit!)
  • :wq 保存并離開
  • :wq! 保存并離開,即使只有讀取的權限。
  • :x 保存并離開(shorter than :wq)
  • :qa 離開全部 (short for :quitall)

或者可以按下(Esc Shift+Z Shift+Z)以寫入/保存,同時離開。

Vim有幫助,只需要按下,輸入,

Vim has extensive help, so type Esc:helpReturn and you will have all your answers and even a neat tutorial.

Git資料

Git托管的軟件

  • GitBucket
  • GitLab
  • Gitorious
  • RhodeCode

Git常用命令

master : 默認開發分支; origin : 默認遠程版本庫

初始化操作

$ git config -global user.name <name>  #設置提交者名字
$ git config -global user.email <email>  #設置提交者郵箱
$ git config -global core.editor <editor>  #設置默認文本編輯器
$ git config -global merge.tool <tool>  #設置解決合并沖突時差異分析工具
$ git config -list  #檢查已有的配置信息

創建新版本庫

$ git clone <url>  #克隆遠程版本庫
$ git init  #初始化本地版本庫

修改和提交

$ git add .  #添加所有改動過的文件
$ git add <file>  #添加指定的文件
$ git mv <old> <new> #文件重命名
$ git rm <file>  #從緩存區和硬盤中刪除文件
$ git rm -cached <file>  #緩存區刪除但硬盤不刪除
$ git commit -m <file> #提交指定文件
$ git commit -m “commit message”  #提交所有更新過的文件
$ git commit -amend  #修改最后一次提交
$ git commit -C HEAD -a -amend  #增補提交(不會產生新的提交歷史紀錄)

查看提交歷史

$ git log  #查看提交歷史
$ git log -p <file>  #查看指定文件的提交歷史
$ git blame <file>  #以列表方式查看指定文件的提交歷史
$ gitk  #查看當前分支歷史紀錄
$ gitk <branch> #查看某分支歷史紀錄
$ gitk --all  #查看所有分支歷史紀錄
$ git branch -v  #每個分支最后的提交
$ git status  #查看當前狀態
$ git diff  #查看變更內容

撤消操作

$ git reset -hard HEAD  #撤消工作目錄中所有未提交文件的修改內容
$ git checkout HEAD <file1> <file2>  #撤消指定的未提交文件的修改內容
$ git checkout HEAD. #撤消所有文件
$ git revert <commit>  #撤消指定的提交

分支與標簽

$ git branch  #顯示所有本地分支
$ git checkout <branch/tagname>  #切換到指定分支或標簽
$ git branch <new-branch>  #創建新分支
$ git branch -d <branch>  #刪除本地分支
$ git tag  #列出所有本地標簽
$ git tag <tagname>  #基于最新提交創建標簽
$ git tag -d <tagname>  #刪除標簽

合并與衍合

$ git merge <branch>  #合并指定分支到當前分支
$ git rebase <branch>  #衍合指定分支到當前分支

遠程操作

$ git remote -v  #查看遠程版本庫信息
$ git remote show <remote>  #查看指定遠程版本庫信息
$ git remote add <remote> <url>  #添加遠程版本庫
$ git fetch <remote>  #從遠程庫獲取代碼
$ git pull <remote> <branch>  #下載代碼及快速合并
$ git push <remote> <branch>  #上傳代碼及快速合并
$ git push <remote> : <branch>/<tagname>  #刪除遠程分支或標簽
$ git push -tags  #上傳所有標簽
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容