1.1 GitHub簡介
GitHub是為開發(fā)者提供Git倉庫的托管服務(wù)。這是一個(gè)讓開發(fā)者與朋友浩淘、同事贩耐、同學(xué)以及陌生人共享代碼的完美場所。
社會(huì)化編程
GitHub曾經(jīng)的logo里面就有Social Coding這個(gè)概念本辐,任何人都可以比從前更加容易地獲得源代碼,將其自由更改并加以公開蘸拔。
在Github各個(gè)頁面按下shift + /都可以打開鍵盤快捷鍵一覽表师郑。
Explore:最尖端的技術(shù)和軟件
Gist:使用JavaScript編寫的Ace編輯器,管理和發(fā)布一些沒必要保存在倉庫中的代碼调窍,如比較小的代碼片段宝冕。
2.1 版本管理
集中型:以Subversion為代表,將所有數(shù)據(jù)存放在服務(wù)器中邓萨,有便于管理的優(yōu)點(diǎn)地梨,但是,一旦開發(fā)者所處的環(huán)境不能連接服務(wù)器缔恳,就無法獲得最新的源代碼宝剖。
分散型:以Git為代表,可以擁有多個(gè)倉庫歉甚,開發(fā)者不必連接遠(yuǎn)程倉庫就可以開發(fā)万细。
2.2 Git初始設(shè)置
設(shè)置姓名和郵箱
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "youremail@example.com"
這個(gè)命令會(huì)在“.../User/.gitconfig”中輸出設(shè)置文件,想要更改信息時(shí)纸泄,可以直接更改設(shè)置文件赖钞。
其他初始化操作
$ git config -global core.editor <editor> #設(shè)置默認(rèn)文本編輯器
$ git config -global merge.tool <tool> #設(shè)置解決合并沖突時(shí)差異分析工具
$ git config --list #檢查已有的配置信息
創(chuàng)建新版本庫
$ git clone <url> #克隆遠(yuǎn)程版本庫
$ git init #初始化本地版本庫
提高命令輸出的可讀性
$ git config --global color.ui auto
3.1 GitHub的前期準(zhǔn)備
- 創(chuàng)建賬戶
- 設(shè)置頭像(通過Gravatar服務(wù)器顯示)
- 設(shè)置SSH Key
https 和 SSH 的區(qū)別
- 前者可以隨意克隆github上的項(xiàng)目,而不管是誰的聘裁;而后者則是你必須是你要克隆的項(xiàng)目的擁有者或管理員雪营,且需要先添加 SSH key ,否則無法克隆衡便。
- https url 在push的時(shí)候是需要驗(yàn)證用戶名和密碼的献起;而 SSH 在push的時(shí)候洋访,是不需要輸入用戶名的,如果配置SSH key的時(shí)候設(shè)置了密碼谴餐,則需要輸入密碼的姻政,否則直接是不需要輸入密碼的。
在 github 上添加 SSH key 的步驟
- 檢查你電腦是否已經(jīng)有 SSH key 总寒,運(yùn)行 git Bash 客戶端扶歪,輸入如下代碼:
$ cd ~/.ssh
$ ls
這兩個(gè)命令就是檢查是否已經(jīng)存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已經(jīng)存在摄闸,那么你可以跳過步驟2善镰,直接進(jìn)入步驟3。
- 創(chuàng)建一個(gè) 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:
如果結(jié)果為
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 已經(jīng)創(chuàng)建成功年枕,你只需要添加到github的SSH key上就可以炫欺。
- SSH key 到 github上面去
- 需要拷貝 id_rsa.pub 文件的內(nèi)容,你可以用編輯器打開文件復(fù)制熏兄。
- 登錄你的github品洛,從又上角的設(shè)置進(jìn)入,然后點(diǎn)擊菜單欄的 SSH key 進(jìn)入頁面添加 SSH key摩桶。
- 點(diǎn)擊 Add SSH key 按鈕添加一個(gè) SSH key 桥状。把你復(fù)制的 SSH key 代碼粘貼到 key 所對(duì)應(yīng)的輸入框中,記得 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 回車辅斟,如果創(chuàng)建 SSH key 的時(shí)候設(shè)置了密碼,接下來就會(huì)提示你輸入密碼芦拿,如:
Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa':
當(dāng)然如果你密碼輸錯(cuò)了士飒,會(huì)再要求你輸入,直到對(duì)了為止蔗崎。
注意:輸入密碼時(shí)如果輸錯(cuò)一個(gè)字就會(huì)不正確酵幕,使用刪除鍵是無法更正的。
密碼正確后你會(huì)看到下面這段話缓苛,如:
Hi username! You've successfully authenticated, but GitHub does not
# provide shell access.
查看分支間的差別
- https://github.com/rails/rails/compare/4-0-stable...3-2-stable查看4-0和3-2的差別
- https://github.com/rails/rails/compare/master@{7.day.ago}...master查看master分支7天內(nèi)的差別
- https://github.com/rails/rails/compare/master@{2013-01-01}...master查看master分支與指定日期間的差別
4.1 Git基本操作
git init--初始化倉庫
用 git init 在目錄中創(chuàng)建新的 Git 倉庫芳撒。 你可以在任何時(shí)候、任何目錄中這么做未桥,完全是本地化的番官。
在目錄中執(zhí)行 git init,就可以創(chuàng)建一個(gè) Git 倉庫了钢属。比如我們創(chuàng)建 runoob 項(xiàng)目:
$ mkdir runoob
$ cd runoob
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 在 /runoob/.git/ 目錄初始化空 Git 倉庫完畢。
在Git中我們稱這個(gè)目錄的內(nèi)容為“附屬于該倉庫的工作樹”门躯,文件的編輯等操作在工作樹中進(jìn)行淆党,然后記錄到倉庫中,以此管理文件的歷史快照。如果需要恢復(fù)之前的狀態(tài)染乌,可以從倉庫調(diào)取之前的快照山孔。
git status--查看倉庫狀態(tài)
git status -s以獲得簡短的結(jié)果輸出。
git add --向暫存區(qū)添加文件
git add . 命令來添加當(dāng)前項(xiàng)目的所有文件
git commit 保存?zhèn)}庫的歷史記錄
$ git commit -m "First commit"
# -m 參數(shù)后面的"First commit稱作提交信息
$ git commiy -am "Add something"
# 包含了git add 和 git commit
如果想要記錄更加詳細(xì)的信息荷憋,直接執(zhí)行“git commit”命令即可台颠,編輯器記錄提交信息的格式為:
- 第一行:用一行文字簡述提交的更改內(nèi)容
- 第二行:空行
- 第三行:級(jí)數(shù)更改原因和詳細(xì)內(nèi)容
退出和保存操作參照Vim編輯器基本操作
git commit -a跳過git add 提交緩存的流程
git log--查看提交日志
$ git log --pretty=short
# 只讓程序顯示第一行簡述信息
$ git log README.md
# 只顯示指定文件的信息
$ git log -p
# 查看提交帶來的改動(dòng)
$ git log -p README.md
git diff--查看當(dāng)前工作樹和暫存區(qū)的區(qū)別
$ git diff HEAD
# 查看工作樹與最新提交的區(qū)別,可以在git commit之前用
尚未緩存的改動(dòng):git diff
查看已緩存的改動(dòng): git diff --cached
查看已緩存的與未緩存的所有改動(dòng):git diff HEAD
顯示摘要而非整個(gè) diff:git diff --stat
4.2 推送遠(yuǎn)程倉庫
需要在GitHub上建立與本地倉庫一致的遠(yuǎn)程倉庫勒庄,創(chuàng)建時(shí)不要生成README.md文件串前。
git remote add--添加遠(yuǎn)程倉庫
$ git remote add origin git@github.com:WangYixin-Tom/Modern-Signal-Processing.git
這項(xiàng)指令可以直接從GitHub上拷貝。
git push--推送至遠(yuǎn)程倉庫
$ git push -u origin master
本地倉庫的master分支將會(huì)被推送到遠(yuǎn)程倉庫中实蔽。
遠(yuǎn)程倉庫也可以創(chuàng)建其他分支荡碾。例如分支feature-D,將它以同名形式push至遠(yuǎn)程倉庫局装。
$ git checkout -b feature-D #本地倉庫建立分支
$ git push -u origin feature-D #推送至遠(yuǎn)程倉庫
如果提示: error setting certificate verify locations坛吁,需要重新定位整證書的位置,并再次推送铐尚。
git config --system http.sslcainfo "D:\Program Files\Git\mingw64\ssl\certs\ca-bundle.crt"
4.3 從遠(yuǎn)程倉庫獲取
$ git clone git@github.com:github-book/git-tutorrial.git #注意不要與之前的倉庫在同一個(gè)目錄下
$ git branch -a #查看分支信息
$ git checkout -b feature-D origin/feature-D #將遠(yuǎn)程倉庫中分支獲取至本地倉庫
$ git diff #修改之后拨脉,查看修改
$ git commit -am "Add feature-D"
$ git push
如果需要獲得最新的遠(yuǎn)程倉庫分支
$ git pull origin feature-D
如果兩人同時(shí)修改了同一部分的源代碼,push時(shí)就很容易發(fā)生沖突宣增。所以多名開發(fā)者在同一個(gè)分支作業(yè)時(shí)玫膀,建議頻繁進(jìn)行push和pull操作。
4.4 分支
不同的分支中统舀,可以同時(shí)進(jìn)行完全不同的作業(yè)匆骗,等該分支的作業(yè)完成之后再與master分支合并,可以實(shí)現(xiàn)多人高效地并行開發(fā)誉简。
git branch :顯示所有分支
git checkout -b feature-A :創(chuàng)建名為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 目標(biāo)時(shí)間點(diǎn)哈希值:回溯到指定時(shí)間點(diǎn)碉就,哈希值只要輸入4位以上就可以執(zhí)行。
- git reset HEAD:用于取消已緩存的內(nèi)容闷串。
- git reflog:查看當(dāng)前倉庫執(zhí)行過的操作日記
merge分支的時(shí)候瓮钥,可能會(huì)有沖突,這個(gè)時(shí)候需要手動(dòng)查看沖突部分烹吵,在編輯器中修改成我們希望得到的樣子碉熄。然后重新執(zhí)行add和commit 命令。
- git commit amend:修改提交信息
在合并特性分支之前肋拔,如果發(fā)現(xiàn)已經(jīng)提交的內(nèi)容中有拼寫錯(cuò)誤等锈津,可以提交一個(gè)修改,將修改壓縮到一個(gè)歷史記錄中凉蜂。
- git rebase -i HEAD~2
5.1 Pull Request
定義:自己修改源代碼之后琼梆,請求對(duì)方倉庫采納該修改時(shí)采取的一種行為性誉。在網(wǎng)絡(luò)上也常常被簡稱為PR。
Pull Request一般流程
- Fork源代碼管理者的遠(yuǎn)程倉庫茎杂,建立自己的遠(yuǎn)程倉庫
- pull需要修改的特性分支到自己本地倉庫
- 新建需要修改的特性分支错览,并做相應(yīng)修改
- push到自己的遠(yuǎn)程倉庫
- 發(fā)送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 #創(chuàng)建work分支并自動(dòng)切換
$ git branch -a #確認(rèn)切換work分支
$ ls #查看文件列表,并對(duì)相應(yīng)文件做修改
提交修改
$ git diff #查看修改是否正確進(jìn)行
$ git add index.html
$ git commit -m "Add my impression"
$ git push origin work #創(chuàng)建遠(yuǎn)程分支
$ git branch -a #查看遠(yuǎn)程分支
為了防止開發(fā)到一半的Pull Request被誤合并煌往,可以在標(biāo)題前面加上[WIP]表示W(wǎng)ork In Process倾哺。完成之后再去掉這個(gè)標(biāo)記。
如果用戶對(duì)該倉庫擁有編輯權(quán)限刽脖,則可以直接創(chuàng)建分支羞海,從分支發(fā)送Pull Request≡兀可以免去Fork的麻煩扣猫。
6.1 倉庫的維護(hù)
可以將原倉庫設(shè)置為遠(yuǎn)程倉庫,從該倉庫fetch數(shù)據(jù)并與本地倉庫進(jìn)行合并翘地,讓本地倉庫保持最新的狀態(tài)申尤。
- Fork與clone
$ git clone git@github.com:hirocastest/Spoon-Knife.git
$ cd Spoon-Knife
- 原倉庫設(shè)置名稱
$ git remote add upstream git://github.com/octocat/Spoon-knife.git #upstream作為原倉庫的表示符
- 獲取最新數(shù)據(jù)
$ git fetch upstream #獲取最新源代碼
$ git merge upstream/master #合并
以后只要重復(fù)這一步驟即可。
6.2 Pull Request的接收
首先可以通過代碼審查衙耕,進(jìn)行評(píng)論和比較昧穿。
其次,可以在本地開發(fā)環(huán)境中反映Pull Request的內(nèi)容變化
- 將接收方的本地倉庫更新至最新狀態(tài)
$ git clone git@github.com:ituring/first-pr.git
$ cd first-pr
- 獲取發(fā)送方的遠(yuǎn)程倉庫
$ git remote add PR發(fā)送者 git@github.com:PR發(fā)送者/first-pr.git
$ git fetch PR發(fā)送者
- 創(chuàng)建用于檢查的分支
$ git checkout -b pr1
- 合并
$ git merge PR發(fā)送者/work
實(shí)際開發(fā)之中需要檢查軟件是否能正常運(yùn)行
- 刪除分支
$ git branch -D pr1
刪除沒有用的pr1分支
GitHub上點(diǎn)擊Merge Pull Request自動(dòng)合并至倉庫或者利用CLI進(jìn)行合并操作再push至GitHub
- 合并到主分支
$ git checkout gh-pages # 切換至 gh-pages 分支
$ git merge PR發(fā)送者/work #合并分支
$ git diff origin/gh-pages #查看兩者區(qū)別橙喘,確認(rèn)
# git push
用這種方法處理之后倉庫的PR自動(dòng)從open狀態(tài)切換到close狀態(tài)时鸵。
7.1 GitHub Flow的流程
- 令master分支時(shí)常保持可以部署的狀態(tài)
- 可以進(jìn)行新的作業(yè)時(shí)要從master分支創(chuàng)建新分支,新分支名稱要具有描述性
- 在新建的本地倉庫分支中進(jìn)行提交
- 在GitHub端倉庫創(chuàng)建同名分支厅瞎,定期push
- 需要幫助或者反饋時(shí)饰潜,發(fā)送Pull Request
- 讓其他開發(fā)者進(jìn)行審查,確認(rèn)作業(yè)后與master分支合并
查看GitHub的分支列表頁面(https://github.com/用戶名/倉庫名/branches)還可以輕松掌握各分支與master分支的差別和簸。
附錄
Vim 編輯器基本操作
按下Esc
; 進(jìn)入命令模式彭雾,然后輸入
-
:q
離開 (short for:quit
) -
:q!
離開,不保存(short for:quit!
) -
:wq
保存并離開 -
:wq!
保存并離開锁保,即使只有讀取的權(quán)限薯酝。 -
:x
保存并離開(shorter than:wq
) -
:qa
離開全部 (short for:quitall
)
或者可以按下(Esc
Shift
+Z
Shift
+Z
)以寫入/保存,同時(shí)離開爽柒。
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 : 默認(rèn)開發(fā)分支做葵; origin : 默認(rèn)遠(yuǎn)程版本庫
初始化操作
$ git config -global user.name <name> #設(shè)置提交者名字
$ git config -global user.email <email> #設(shè)置提交者郵箱
$ git config -global core.editor <editor> #設(shè)置默認(rèn)文本編輯器
$ git config -global merge.tool <tool> #設(shè)置解決合并沖突時(shí)差異分析工具
$ git config -list #檢查已有的配置信息
創(chuàng)建新版本庫
$ git clone <url> #克隆遠(yuǎn)程版本庫
$ git init #初始化本地版本庫
修改和提交
$ git add . #添加所有改動(dòng)過的文件
$ git add <file> #添加指定的文件
$ git mv <old> <new> #文件重命名
$ git rm <file> #從緩存區(qū)和硬盤中刪除文件
$ git rm -cached <file> #緩存區(qū)刪除但硬盤不刪除
$ git commit -m <file> #提交指定文件
$ git commit -m “commit message” #提交所有更新過的文件
$ git commit -amend #修改最后一次提交
$ git commit -C HEAD -a -amend #增補(bǔ)提交(不會(huì)產(chǎn)生新的提交歷史紀(jì)錄)
查看提交歷史
$ git log #查看提交歷史
$ git log -p <file> #查看指定文件的提交歷史
$ git blame <file> #以列表方式查看指定文件的提交歷史
$ gitk #查看當(dāng)前分支歷史紀(jì)錄
$ gitk <branch> #查看某分支歷史紀(jì)錄
$ gitk --all #查看所有分支歷史紀(jì)錄
$ git branch -v #每個(gè)分支最后的提交
$ git status #查看當(dāng)前狀態(tài)
$ git diff #查看變更內(nèi)容
撤消操作
$ git reset -hard HEAD #撤消工作目錄中所有未提交文件的修改內(nèi)容
$ git checkout HEAD <file1> <file2> #撤消指定的未提交文件的修改內(nèi)容
$ git checkout HEAD. #撤消所有文件
$ git revert <commit> #撤消指定的提交
分支與標(biāo)簽
$ git branch #顯示所有本地分支
$ git checkout <branch/tagname> #切換到指定分支或標(biāo)簽
$ git branch <new-branch> #創(chuàng)建新分支
$ git branch -d <branch> #刪除本地分支
$ git tag #列出所有本地標(biāo)簽
$ git tag <tagname> #基于最新提交創(chuàng)建標(biāo)簽
$ git tag -d <tagname> #刪除標(biāo)簽
合并與衍合
$ git merge <branch> #合并指定分支到當(dāng)前分支
$ git rebase <branch> #衍合指定分支到當(dāng)前分支
遠(yuǎn)程操作
$ git remote -v #查看遠(yuǎn)程版本庫信息
$ git remote show <remote> #查看指定遠(yuǎn)程版本庫信息
$ git remote add <remote> <url> #添加遠(yuǎn)程版本庫
$ git fetch <remote> #從遠(yuǎn)程庫獲取代碼
$ git pull <remote> <branch> #下載代碼及快速合并
$ git push <remote> <branch> #上傳代碼及快速合并
$ git push <remote> : <branch>/<tagname> #刪除遠(yuǎn)程分支或標(biāo)簽
$ git push -tags #上傳所有標(biāo)簽