SlideShare a Scribd company logo
1 of 407
Download to read offline
Git 基礎教學
COSCUP 2015 Workshop
Brought to you by GitCafe
關於我們
⺫⽬目的
• 學習 Git 的基本⽤用法
• 學習使⽤用 GitCafe 來為開源專案做貢獻
• 學習使⽤用 GitCafe 來為協作⼀一個專案
規則
• 請各位聽眾嚴格按照 Slides 上的指⽰示⼀一步⼀一步做
• 如果在課程中遇到任何問題,可以詢問助教
• 課後如果還有問題,可以求助於 GitCafe Support
或者 Facebook 群
Agenda
• Git 是什麼?GitCafe 是什麼?
• 基本環境配置
• Git 和 GitCafe 的基本⽤用法
• 最佳實踐介紹
⾸首先讓我們舉個例⼦子
以下 33 ⾴頁 Slides 來⾃自 Code Smart, Don't Code hard by 畢⽟玉泉(CrBoy)<crboy@crboy.net>
Solution
+
Git 是什麼
Git 是當今開源世界中最流⾏行的版本控制系統
版本控制是什麼
追蹤⽂文件變化
版本控制能幫到我什麼
• 看到每⼀一⾏行程式碼修改的原因
• 程式碼如果寫的太爛還能看是誰寫的
• 錯誤的修改可以直接回退
• 幾個版本可以同時存在,任意切換,互相合併
GitCafe 是什麼
• 存放開源專案的程式碼
• 發現專案的問題,提交⼯工單,與開發者交流
• ⾃自⼰己有能⼒力改好,提交 PR
• 多⼈人協作⼀一個專案
基礎環境配置
安裝 Git
⼤大家都⽤用什麼操作系統?
• Windows?
• Mac OS X?
• Linux? (Debian? CentOS? OpenSUSE?)
• BSD?
• Solaris?
• ???
安裝在 Windows 上
Google “git”
git-scm.com
打開安裝包,按 Next
Next
Next
Next
Next
Next
Next
Wait
去掉那個鉤,Finish
開始菜單,選擇 Git Bash
Git Bash
git
看成這樣的提⽰示就算成功
安裝在 Mac OS X 上
Homebrew
Mac OS X 下的命令⾏行軟件安裝⼯工具
Google “homebrew”
brew.sh
Copy
打開 spotlight 輸⼊入 terminal
terminal
paste
brew install git
git
請⼤大家務必安裝好 Git
安裝 程式碼編輯器
⼤大家都⽤用什麼編輯器寫程式碼?
• Word?
• Notepad?
• Visual Studio?
• Eclipse?
• Vim?
• Emacs?
• Notepad++?
• TextEdit?
• Text Mate?
• Sublime Text?
• Atom?
⼤大家都⽤用什麼編輯器寫程式碼?
• Word?
• Notepad?
• Visual Studio?
• Eclipse?
• Vim?
• Emacs?
• Notepad++?
• TextEdit?
• Text Mate?
• Sublime Text?
• Atom?
程式碼編輯器
• 本次教程需要⼤大家使⽤用程式碼編輯器編輯⽂文本
• ⼤大家可以⾃自由使⽤用⾃自⼰己慣⽤用的程式碼編輯器
• 如果沒有慣⽤用的程式碼編輯器,為了統⼀一不同平
台的編輯器需求,本次教程使⽤用 Atom 作為編輯
器
Google “atom”
atom.io
Atom 安裝指導
• Windows ⽤用⼾戶雙擊安裝包即可直接安裝
• Mac ⽤用⼾戶解壓安裝包並把 app 拖曳到 /
Applications 中去,然後在 Atom 主菜單中選擇
Install Shell Commands
GitCafe
GitCafe.com
註冊 GitCafe
註冊 GitCafe
註冊 GitCafe
註冊 GitCafe
請⼤大家務必註冊好
GitCafe
還需要做⼀一些配置
~/.gitconfig
gitcafe.com/poetries/tang
Copy
atom ~/.gitconfig
編輯器
• 通過 atom 命令後⾯面跟⽂文件名就可以⽤用 atom 編輯
該⽂文件
• ⼤大家也可以使⽤用⾃自⼰己慣⽤用的編輯器編輯⽂文件
彈出 Atom 窗⼝口
paste
填上你的英⽂文名和郵箱
如果你⽤用的不是 Atom 編輯器還需要在這裡修改設置
然後保存,退出
• Windows ⽤用⼾戶按下 Ctrl + s 保存,然後點擊右上
⾓角的關閉窗⼝口按鈕退出
• Mac ⽤用⼾戶按下 Cmd + s 保存,然後按下 Cmd +
q 退出,注意不要直接按關閉窗⼝口按鈕
完成後開始今天正式的
Git 基礎教程
課程規劃
• 任務⼀一:學習為 GitCafe 的開源項⺫⽬目貢獻代碼
• 任務⼆二:兩名開發者在 GitCafe 上合作完成⼀一個
項⺫⽬目
• 任務三:學習通過分⽀支來幫助項⺫⽬目協作更順利的
完成
任務⼀一
• 現在你看到 GitCafe 上有⼀一個唐詩專案
• gitcafe.com/poetries/tang
• 你發現第⼀一⾸首詩有個地⽅方寫錯了
• 你需要修復這個問題
步驟
1. 打開 gitcafe.com/poetries/tang
2. 複製這個專案到⾃自⼰己的 GitCafe 帳⼾戶
3. 將這個專案的源碼下載到⾃自⼰己的電腦上
4. 在⾃自⼰己的電腦上改正錯誤
5. 提交修改並上傳到 GitCafe
6. 寫信給專案的原作者
在 GitCafe 上複製項⺫⽬目
Remote
Local
別⼈人家的項⺫⽬目v1 我們家的項⺫⽬目v1
複製
下載項⺫⽬目到本地,在本地修改
Remote
Local
我們家的項⺫⽬目v1
我們家的項⺫⽬目v2
下載
我們家的項⺫⽬目v1
修改
下載項⺫⽬目到本地,在本地修改
Remote
Local
我們家的項⺫⽬目v2
上傳
我們家的項⺫⽬目v2
別⼈人家的項⺫⽬目v1
寫信
然後我們就開⼯工吧
打開 gitcafe.com/poetries/tang
選擇 poem1
⼤大家知道這⾸首詩中哪裡有問題嗎?
我們需要為原作者改正這個錯誤
但是在 GitCafe 上,預設情況下⽤用⼾戶
不會對其他⼈人的專案有寫⼊入權限
派⽣生 & 請求合併 這兩個功能就是為
這種情況設計的
點擊右上⾓角的 派⽣生 按鈕
派⽣生 (Fork)
將別⼈人的開源專案複製⼀一份到⾃自⼰己的帳⼾戶下
看到派⽣生成功的提⽰示
複製紅框內的網址
打開 terminal
git clone
• 這是我們學習的第⼀一個 git 命令
• git clone 能夠把存放在 GitCafe 上的專案下載到
⾃自⼰己的電腦上
git clone,然後 paste
git clone,然後 paste
成功的話就是這個效果
git clone
• 預設情況下,git clone 會在當前⺫⽬目錄中創建⼀一個
與專案名同名的新⺫⽬目錄
• 例如我們 clone 的這個專案叫 tang,因此新⺫⽬目錄
也就叫 tang
• 所有源碼都會被下載到這個新⺫⽬目錄中
• 這樣⼀一個⺫⽬目錄就叫 Git repo
• ⺫⽬目錄和當前⺫⽬目錄的概念如果不理解請詢問助教
⽤用圖形界⾯面剛剛下載的⺫⽬目錄
• Windows ⽤用⼾戶可以查看 計算機 ➡ 本地磁盤
(C:)➡️ ⽤用⼾戶 ➡ <當前⽤用⼾戶名>
• Mac ⽤用⼾戶可以在 Finder 中⽤用 Cmd + Shift + G 可
以打開 Go to the folder 對話框
Windows ⽤用⼾戶驗證⽅方法
Finder 下⽤用 Cmd + Shift + G
輸⼊入波浪號 ~,按 Go
輸⼊入波浪號 ~,按 Go
回到 Terminal
cd tang
cd tang
• 切換當前⺫⽬目錄到 tang 這個⺫⽬目錄下
• 切換當前⺫⽬目錄的概念如果不理解請詢問助教
cd tang
然後我們可以看下項⺫⽬目裡⾯面的代碼
ls
ls
• 列出當前⺫⽬目錄下所有的⽂文件名
• ⽂文件的概念如果不理解請詢問助教
然後我們需要檢查下這些⽂文件
的狀態
git status
git status
• 這是我們學習的第⼆二條 git 命令
• 這條命令是⽤用來查看當前 Git repo 的狀態
• 仔細閱讀這條命令所顯⽰示的信息,可以幫助我們
知道接下來該做什麼
• 所以這條命令應該經常使⽤用
• 現在它告訴我們當前 Git repo 還沒有被修改過
現在我們需要編輯 poem1
atom poem1
編輯器
• 本次教程使⽤用 Atom 作為編輯器
• 通過 atom 命令後⾯面跟⽂文件名就可以⽤用 atom 編輯
該⽂文件
• ⼤大家也可以使⽤用⾃自⼰己慣⽤用的編輯器編輯⽂文件
atom poem1
改正錯誤
然後保存,退出
• Windows ⽤用⼾戶按下 Ctrl + s 保存,然後點擊右上
⾓角的關閉窗⼝口按鈕退出
• Mac ⽤用⼾戶按下 Cmd + s 保存,然後按下 Cmd +
q 退出,注意不要直接按關閉窗⼝口按鈕
請再次⽤用 git status 檢查
git status
• 正如之前所說的
• 這條命令是⽤用來查看當前 Git repo 的狀態
• 這裏它告訴我們有⼀一個叫 poem1 的⽂文件被修改過
• 仔細閱讀這條命令所顯⽰示的信息,可以幫助我們
知道接下來該做什麼
• 這裏它告訴我們該執⾏行 git add 了
git add
• 在 Git 中,所有修改過的⽂文件都需要⽤用 git add 命
令做標記
• 如果修改過的⽂文件沒有被標記,等會 git 就不會提
交這個修改
git add poem1
請再次⽤用 git status 檢查
git status
• 以紅⾊色顯⽰示的⽂文件表⽰示還沒有被 git add 標記
• 以綠⾊色顯⽰示的⽂文件表⽰示已經被 git add 標記了
然後就可以提交你的修改了
git commit
• 這條命令將當前所有被標記為提交的⽂文件提交
• 每次提交都需要⼀一段描述性的語句來解釋修改程
式碼的原因,這被稱為 commit message,通常
是英語
• ⽐比如這裡的 commit message 就可以是 "correct
author",⼤大家也可以適當發揮
• 為了⽅方便,本次教程統⼀一⽤用 git commit 的 -m 參
數來設置 commit message
git commit -m "correct author"
git commit -m "correct author"
檢查下⾃自⼰己的提交
git log
可以看到你的提交
還可以⽤用 git log -p 查看你具
體的修改內容
git log -p
git log -p
git log -p
• 在預設情況下,git 總是按⾏行⽐比較
• 紅⾊色⾏行表⽰示被刪除的⾏行
• 綠⾊色⾏行表⽰示新增加的⾏行
按 Q 退出 git log -p 的界⾯面
提交完成後,你需要把提交上
傳到 GitCafe 上
git push
輸⼊入你的 GitCafe ⽤用⼾戶名
輸⼊入你的 GitCafe 密碼
可以看到 push 成功
git push
• git push 會通過網絡將你所有提交上傳到 GitCafe
上
• 由於你電腦上的 Git repo 是通過 git clone 命令從
你帳⼾戶下的 tang 項⺫⽬目中下載的,因此你的提交會
上傳回同樣的地⽅方
⼀一次修改的必要流程
1. 修改程式碼
2. git add <所有要提交的⽂文件>
3. git commit -m "<commit message>"
4. git push
重新打開 GitCafe
點擊 poem1
可以看到你的修改已經⽣生效
但是這還是不夠的
你只是修復了你⾃自⼰己帳⼾戶下的 tang 項⺫⽬目
中的錯誤
原作者此時還不知道你做了修改
這個修復也沒有進⼊入原作者的專案中去
那怎麼辦?
你需要使⽤用請求合併
回到你的專案主⾴頁
在右上⾓角點擊請求合併
然後出現了這樣的⾴頁⾯面
請求合併(Pull Request)
相當於你給原作者寫封信,你要在信中告知它修改
程式碼的原因,以及為何要這麼修改,信中會⾃自動
包含你對他的 Git repo 所做的全部修改
原作者會收到你的信,他可以選擇與你進⼀一步交流,
或者選擇接受你的修改,當然也可以拒絕咯
在 Pull Request 被發明之前,Linux 開源⼩小組確實
⽤用寫信的⽅方法來提交修改的
你需要填寫這封信的內容
然後點擊發送請求合併
然後就完成了
任務⼀一結束
任務⼀一步驟回憶
1. 打開 gitcafe.com/poetries/tang
2. 複製這個專案到⾃自⼰己的 GitCafe 帳⼾戶
3. 將這個專案的源碼下載到⾃自⼰己的電腦上
4. 在⾃自⼰己的電腦上改正錯誤
5. 提交修改並上傳到 GitCafe
6. 寫信給專案的原作者
任務⼀一步驟回憶
1. 打開 gitcafe.com/poetries/tang
2. 點擊“派⽣生”將項⺫⽬目複製⼀一份到⾃自⼰己帳⼾戶下
3. git clone <派⽣生後的項⺫⽬目的地址>
4. 在⾃自⼰己的電腦上改正錯誤
5. git add <所有要提交的⽂文件>
6. git commit -m "<commit message>"
7. git push
8. 在項⺫⽬目中點擊“請求合併”,並填寫內容發送給原作者等待決定
第⼀一階段 Q & A 時間
• 提問
• 跟上節奏
• 相互交流
• 安排分組
任務⼆二
• ⾓角⾊色扮演
• 在場聽眾兩兩分組,假設其中⼀一⼈人為 project owner,⽽而另
⼀一個⼈人充當他的 collaborator
• 兩⼈人合作完成⼀一個寫詩的專案
• Project owner 負責在 GitCafe 創建專案並設置另⼀一名同伴
為他的 collaborator
• Owner 與 collaborator 根據指⽰示交替開發同⼀一專案
• 並且解決交替開發中發⽣生⼀一切的衝突
任務⼆二
• 多⼈人通過 collaborator 的⽅方式同時開發同⼀一專案
最頭疼的情況就是發⽣生衝突
• 任務⼆二的主體就是模擬多種造成衝突的可能情況,
由簡⼊入深,並學習解決衝突的⽅方法
⾸首先 owner 開始創建
專案
owner: 創建 project
owner: 創建 project
owner: 創建 project
owner 需要設置
collaborator
相當於賦予其他⽤用⼾戶對
該專案的寫⼊入權限
此時 collaborator 不需
要經過 owner 也可以改
程式碼了
owner: 設置協作者
owner: 設置協作者
owner: 設置協作者
輸⼊入 collaborator 的
⽤用⼾戶名,不要輸錯
owner: 設置協作者
owner: 設置協作者
owner / collaborator: 重新打開 terminal
owner / collaborator: git clone
Paste 新項⺫⽬目的地址
owner / collaborator: cd my_poetries
Paste 新項⺫⽬目的地址
假設 collaborator 開始編輯
⽂文件並提交到伺服器
collaborator: atom README.md
collaborator: atom README.md
collaborator: atom README.md
collaborator: git add README.md
collaborator: git commit -m "..."
collaborator: git push
collaborator push 完後,
owner 需要 pull 最新的修改
owner: git pull
owner: 注意到 Fast-forward 字樣
git pull
• git pull 從伺服器上抓取所有新 push 的提交並且
更新本地的代碼
• 如果執⾏行 git pull 前本地沒有提交過任何代碼,則
顯⽰示 Fast-Forward,表⽰示更新本地代碼沒有問題
Fast Forward
Owner
Remote
Collaborator
Fast Forward
Owner
Remote
Collaborator
Fast Forward
Owner
Remote
Collaborator
Fast Forward
Owner
Remote
Collaborator
owner: 檢查 pull 之後的結果
owner 可以看到 collaborator 的修改
接著由 owner 負責編輯⽂文件
並提交到伺服器
owner 繼續修改當前⽂文件
owner: git add README.md
owner: git commit -m "..."
owner: git push
collaborator 還不知道
owner 再次 push 了程式碼
但是他覺得寫⾸首詩卻沒有 title
很不好,於是 ...
collaborator: 編輯⽂文件
collaborator: 編輯⽂文件
collaborator: 寫上 title
collaborator: git add README.md
collaborator: git commit -m "..."
collaborator: git push
git push 失敗了
只要有其他⼈人在你之前做
過 push,你就不能直接
push
根據提⽰示,你先需要
git pull
collaborator: git pull
Auto-merging
• 當你執⾏行 git pull 之前提交過代碼,同時其他⼈人在
此之前也 push 過代碼,那麼 Git 會試圖將雙⽅方提
交的代碼合併,並⾃自動解決衝突
• 如果衝突解決成功,就無須⼿手⼯工解決
• 衝突解決後,需要創建⼀一個特殊提交稱之為
merge commit,合併提交本⾝身不包含⽂文件修改,
但是同時基於兩個或兩個以上的提交
Merge commit
Owner
Remote
Collaborator
Owner commits
Owner
Remote
Collaborator
Owner pushes
Owner
Remote
Collaborator
Collaborator commits
Owner
Remote
Collaborator
Pull
Owner
Remote
Collaborator
Merge
Owner
Remote
Collaborator
既然是提交,就有
commit message
collaborator: git pull
commit message
• git 會⾃自動打開編輯器讓你編輯 commit message
• 預設的 merge commit 已經很清晰,無需修改直
接退出 Atom 即可
collaborator: ⾃自動合併結束
collaborator: 查看合併結果
collaborator: 同時包含雙⽅方的修改
collaborator: 再次 git push
owner: 也同樣做下 git pull
此時,collaborator 不僅
添加了標題,也寫了詩
collaborator: atom README.md
collaborator: git add README.md
collaborator: git commit -m "..."
collaborator: git push
同時 owner 也在⾃自顧⾃自
的寫詩
owner: atom README.md
owner: git add README.md
owner: git commit -m "..."
owner: git push
owner: git pull
git pull 也失敗了
雙⽅方修改有重疊,無法
⾃自動合併
Merge commit
Collaborator
Remote
Owner
Collaborator commits
Remote
Collaborator Owner
Collaborator pushes
Remote
Collaborator Owner
Owner commits
Remote
Collaborator Owner
Pull
Remote
Collaborator Owner
Merge
Remote
Collaborator Owner ??
Conflict
看⼀一眼 git status
owner: git status
git status 告訴我們雙⽅方
對同⼀一個⽂文件做出了衝突
的修改
必須⼿手動解決
需⼿手動解決衝突的情況
• 當雙⽅方都修改了同⼀一個⽂文件的同⼀一⾏行或相鄰⾏行,
修改內容不同
• 當雙⽅方都在同⼀一個⽂文件末尾或開頭增加了內容,
⽽而且內容不同
• 當雙⽅方都創建了⼀一個同名⽂文件,並且內容不同
• 當⼀一⽅方修改了⼀一個⽂文件,⽽而另⼀一⽅方刪除了它
• 還有其他情況
⼿手動解決衝突的⽅方法
• Git 解決衝突的最直觀⽅方法是直接編輯衝突⽂文件
owner: atom README.md
通過編輯⽂文件解決衝突
• 從衝突⽂文件的內容可知,衝突部分被⽤用 7 個⼤大於
符號和⼩小於符號包住,並且⽤用 7 個等號分割開來
• 在前⾯面的例⼦子中,⽤用 HEAD 標⽰示的部分為本地衝
突內容,⽽而另⼀一部分為來⾃自伺服器的衝突內容
• 需要⼿手動刪除 >,< 和 =,然後編輯衝突部分,編
輯結果就是衝突解決的最終結果
owner: atom README.md
此時 owner 應該判定如何解決衝突
解決衝突
• 選擇⾃自⼰己的修改
• 選擇 collaborator 的修改
• 都保留,但需要適當修改
owner: 編輯完畢
合併需要提交 merge commit
在⼿手動解決衝突的情況下,你
需要⾃自⼰己⽤用 git add 標記已經
解決掉衝突的⽂文件
然後執⾏行 git commit 創建
merge commit
owner: git add README.md
owner: git commit -m "..."
owner: git push
collaborator: git pull
owner 的衝突解決的很好
第⼆二階段 Q & A 時間
• 提問
• 跟上節奏
• 相互交流
任務三
• 繼續⾓角⾊色扮演
• owner 和之前⼀一樣繼續開發這個專案
• ⽽而 collaborator 將創建⼀一個新的分⽀支,在這個分
⽀支中,collaborator 也將同時開發這個專案
• 之後 owner 將 pull 下 collaborator 的新分⽀支,並
將它合併回主分⽀支
什麼是分⽀支
• 在實際的軟件開發中,⼀一個軟件通常會有多個開
發版本在同時開發
• 例如在同⼀一時刻,A,B,C 三個⼯工程師在開發
GitCafe 的程式碼 Highlight 功能,⽽而 D,E,F 三
個⼯工程師在開發 GitCafe 的 PR Line Note 功能,
他們不希望互相影響
什麼是分⽀支
• 如果沒有分⽀支功能,所有程式碼都只在主分⽀支上
提交,那麼這些複雜的功能在開發過程中勢必互
相影響
• 開發到⼀一半的功能還會導致另⼀一部分功能無法正
常使⽤用,其他同事無法在錯誤的狀態下開發新功
能
git branch
master
fix/123
highlight
line_note
git branch
• Git 的分⽀支功能特別易⽤用⾼高效,它實際上只是版本
樹上浮動的指針
• ⼀一個 Git repo ⾄至少有⼀一個分⽀支,預設情況下,⼀一
個新專案只有⼀一個分⽀支 master,通常也叫主分⽀支
owner: atom README.md
owner: git add README.md
owner: git commit -m "..."
owner: git push
同時 collaborator 發現之前的
⼀一⾸首詩《⼭山居秋暝》並沒有寫全
為了不像上次⼀一樣讓 owner 的
git pull 受到影響,於是他創建
⼀一個新的分⽀支來補全這⾸首詩
⾸首先 collaborator 查看了當
前的分⽀支情況
collaborator: git branch
git branch
• 通過 git branch 命令,可列出所有本地分⽀支名
稱,並⽤用星號指出當前分⽀支
只有 master 分⽀支,這是 git
新專案的預設分⽀支
然後 collaborator 創建⼀一個
新分⽀支,並且切換到新分⽀支上
collaborator: git checkout -b cowork
這會在當前 master 分⽀支基礎
上,創建⼀一個新的分⽀支 cowork
collaborator: git branch
可以看到新分⽀支 cowork 已經創建,
並且當前分⽀支也變成了 cowork
接著我們就在 cowork 的分⽀支上做
開發
collaborator: atom README.md
collaborator: git add README.md
collaborator: git commit -m "..."
新的提交總是會被提交在當前分⽀支上
collaborator: git branch -v
git branch -v 提⽰示每個分⽀支的指向
的 commit 的內容
collaborator: git lg
git lg
• git lg 其實並⾮非⼀一條 git 命令,它其實是⼀一條複雜
的 git log 命令的別名
• git 的別名定義在最初提供的 ~/.gitconfig 中
• 這條命令告訴我們 cowork,也就是當前分⽀支,指
向了 fix poem3 這個 commit,⽽而主分⽀支還停留在
merge conflict 那邊
分⽀支的存在意味著程式碼可以同時存
在多個版本,你可以切換回 master
分⽀支查看當前的程式碼
collaborator: git checkout master
collaborator: atom README.md
可以看到程式碼回到了之前的狀
態
collaborator: git lg
可以看到當前分⽀支切換回了
master,不包含 fix poem3 的修改
collaborator: git checkout cowork
collaborator: atom README.md
⼀一回到 cowork 分⽀支,之前的修改
⼜又回來了
然後 collaborator 要 push cowork
這個新分⽀支到 GitCafe 伺服器
collaborator: git push -u origin cowork
我們可以看到 git push 更複雜的⽤用法
git push -u origin cowork
它的語意是
• 將本地 Git repo 的 cowork 分⽀支 push 到遠端
origin 伺服器的 cowork 分⽀支上
• 如果伺服器上沒有這⼀一分⽀支就創建
• 並且設置當前 cowork 分⽀支對應遠端的 cowork 分
⽀支
它的語意是
master
master
cowork
Remote
Local
它的語意是
master
master
cowork
cowork
Remote
Local
它的語意是
master
master
cowork
cowork
Remote
Local
那麼問題來了,什麼是 origin?
什麼是對應遠端的分⽀支?
git remote
• ⼀一個 Git repo 可以有⼀一個或多個遠端伺服器上的
Git repo
• 每個遠端伺服器上的 Git repo 都有⼀一個名稱,預設
名稱是 origin
• 我們的 Git repo 是通過 git clone 命令從 GitCafe
伺服器下載的,因此預設的 origin 伺服器就是這個
repo 在 GitCafe 上的地址
• 可以通過 git remote -v 看到
collaborator: git remote -v
遠端分⽀支
• 即遠端 Git repo 上的分⽀支
• 本地的 Git repo 有分⽀支,遠端 Git repo 上⾃自然也要
有分⽀支與本地分⽀支對應
• 遠端分⽀支⼀一律以「遠端 repo 名稱」/「分⽀支名」命
名
• 你不能直接切換到遠端分⽀支上,也不能直接對遠端
分⽀支進⾏行修改
注:這是⼀一個簡化模型,⽤用來簡化我們的教學
遠端分⽀支
• 每⼀一個本地分⽀支可以選擇與⼀一個遠端分⽀支對應
• git status 總是會⾃自動⽐比較當前分⽀支與其對應的遠
端分⽀支的差異,並告知⽤用⼾戶
• git push 可以不總是指定遠端庫和遠端分⽀支,預
設總是上傳到對應的遠端分⽀支
• git pull 也是類似
collaborator: git branch -vv
git branch -vv 可以列出每個
branch 的對應的遠端分⽀支
我們再來提交⼀一次
collaborator: atom README.md
collaborator: git add README.md
collaborator: git commit -m "..."
collaborator: git status
git status 提⽰示 cowork 分⽀支⽐比
遠端的 cowork 分⽀支多⼀一個提交
collaborator: git push
git push 也會⾃自動將 cowork 分
⽀支推送到遠端的 cowork 分⽀支上
回到 owner
owner: git lg
可以看到 owner 的數據已經⽼老了
owner: git pull
已經提⽰示找到了新的分⽀支
git pull 不僅可以更新當前分⽀支,
也可以同步遠端分⽀支
但注意 git pull 不會⾃自動為新的
遠端分⽀支創建對應的本地分⽀支
owner: git branch -v
owner: git branch -a
git branch -a 會同時列出本地分⽀支
和遠端分⽀支的情況,可以看到
cowork 這個遠端分⽀支
⽤用 git lg 會有更加清晰的呈現
owner: git lg
可以看到遠端的 cowork 分
⽀支⽐比當前分⽀支多兩個 commit
可以⽤用命令對⽐比⼆二者的區別
owner: git log master..origin/cowork
git log A..B
• 注意 A 和 B 當中⽤用兩個點連接
• 列出 A 和 B 兩個分⽀支之間的區別
• 更精確的說,列出所有存在於 B 分⽀支卻不存在於
A 分⽀支的提交
不僅可以有提交之間的 對
⽐比,還有程式碼之間的對⽐比
owner: git diff master..origin/cowork
紅⾊色的⾏行表⽰示 master 分⽀支有⽽而 origin/cowork 分⽀支沒有的內容
綠⾊色的⾏行表⽰示 origin/cowork 分⽀支有⽽而 master 分⽀支沒有的內容
git diff A..B
• git diff 對⽐比兩個分⽀支之間源碼的區別
• 紅⾊色的⾏行表⽰示 A 分⽀支有⽽而 B 分⽀支沒有的內容
• 綠⾊色的⾏行表⽰示 B 分⽀支有⽽而 A 分⽀支沒有的內容
• 從返回的結果可知,遠端的 cowork 分⽀支與
master 分⽀支相⽐比,不僅改了《⼭山居秋暝》,還增
加了《相思》,但沒有《早發⽩白帝城》
owner 對 collaborator 的⼯工
作很滿意
現在 owner 需要把 collaborator
的提交合併到主分⽀支中去
owner: git merge origin/cowork
git merge origin/cowork
• 將 origin/cowork 與當前分⽀支合併
• 與 git pull ⼀一樣,如果合併中發現衝突就要進⼊入⼿手
動合併的流程
• ⼿手動合併的流程與 git pull 也完全⼀一致
owner: atom README.md
owner: atom README.md
owner: 解決衝突
owner: git add README.md
owner: git commit -m "..."
owner: git lg
owner: git push
最佳實踐
⽤用⼾戶名/密碼 認證
• 每次 git push 和 git pull 都要輸⼊入⽤用⼾戶名/密碼
• 很⿇麻煩
• 怎麼才能做到不⽤用⼀一直輸⼊入密碼
SSH 認證
• ⽐比密碼認證更安全並且也更⽅方便
• ⾸首次使⽤用需要在本地⽣生成⼀一對 SSH 密鑰
• 然後將公鑰內容填寫在 GitCafe ⽤用⼾戶設置中
• 今後提交代碼無須再輸⼊入密碼
• 課後可以找助教幫忙設置
oh-my-zsh
• 這裏對 Mac ⽤用⼾戶重點推薦下 zsh + oh-my-zsh
• 更友好的⾃自動補全
• ⾃自動提⽰示當前分⽀支
• ⾃自動提⽰示當前 Git repo 有沒有程式碼還沒有提交
oh-my-zsh
alias
• ⾃自定義⼀一條簡單的命令⽤用來取代⼀一條複雜的命令
• 原本由於過於複雜⽽而不常⽤用的命令,可以通過別
名來簡化使⽤用⽅方法
• 你可以⾃自⼰己修改 ~/.gitconfig 來配置別名
alias
Learn more
www.atlassian.com/git/tutorials
progit.org
Q&A
如果你對 Git 或者 GitCafe 的⽤用法有任何問題
或者希望獲取 Git 相關的更多詳細資料
Email: support@gitcafe.com
Facebook:開源之道-Git Workshop

More Related Content

What's hot

Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學Duncan Chen
 
初心者 Git 上手攻略
初心者 Git 上手攻略初心者 Git 上手攻略
初心者 Git 上手攻略Lucien Lee
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshellNelson Tai
 
Git基礎介紹
Git基礎介紹Git基礎介紹
Git基礎介紹Max Ma
 
Git and git hub
Git and git hubGit and git hub
Git and git hub唯 李
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作奕浦 郭
 
git, repo, Gerrit 基礎教學
git, repo, Gerrit 基礎教學git, repo, Gerrit 基礎教學
git, repo, Gerrit 基礎教學Doremi Lin
 
幸福快樂的完美結局
幸福快樂的完美結局幸福快樂的完美結局
幸福快樂的完美結局Anna Su
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战icy leaf
 
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
大家應該都要會的工具 Git   從放棄到會用1-基礎篇大家應該都要會的工具 Git   從放棄到會用1-基礎篇
大家應該都要會的工具 Git 從放棄到會用1-基礎篇Alan Tsai
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌Mu Chun Wang
 
連哈秋都懂的Git教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學hydai
 
電子內容管理 使用Git 與 github 1
電子內容管理   使用Git 與 github 1電子內容管理   使用Git 與 github 1
電子內容管理 使用Git 與 github 1Alan Tsai
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作Bo-Yi Wu
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Wen-Tien Chang
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Will Huang
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTreeChu-Siang Lai
 
Mercurial簡介與教學
Mercurial簡介與教學Mercurial簡介與教學
Mercurial簡介與教學芳本 林
 

What's hot (20)

Git與source tree 基礎教學
Git與source tree 基礎教學Git與source tree 基礎教學
Git與source tree 基礎教學
 
初心者 Git 上手攻略
初心者 Git 上手攻略初心者 Git 上手攻略
初心者 Git 上手攻略
 
Git in a nutshell
Git in a nutshellGit in a nutshell
Git in a nutshell
 
Git基礎介紹
Git基礎介紹Git基礎介紹
Git基礎介紹
 
Git and git hub
Git and git hubGit and git hub
Git and git hub
 
Git 入門與實作
Git 入門與實作Git 入門與實作
Git 入門與實作
 
git, repo, Gerrit 基礎教學
git, repo, Gerrit 基礎教學git, repo, Gerrit 基礎教學
git, repo, Gerrit 基礎教學
 
幸福快樂的完美結局
幸福快樂的完美結局幸福快樂的完美結局
幸福快樂的完美結局
 
Git 入门实战
Git 入门实战Git 入门实战
Git 入门实战
 
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
大家應該都要會的工具 Git   從放棄到會用1-基礎篇大家應該都要會的工具 Git   從放棄到會用1-基礎篇
大家應該都要會的工具 Git 從放棄到會用1-基礎篇
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
 
連哈秋都懂的Git教學
連哈秋都懂的Git教學連哈秋都懂的Git教學
連哈秋都懂的Git教學
 
電子內容管理 使用Git 與 github 1
電子內容管理   使用Git 與 github 1電子內容管理   使用Git 與 github 1
電子內容管理 使用Git 與 github 1
 
Gitlab
GitlabGitlab
Gitlab
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰Visual Studio 2015 與 Git 開發實戰
Visual Studio 2015 與 Git 開發實戰
 
Git and Github basic with SourceTree
Git and Github basic with SourceTreeGit and Github basic with SourceTree
Git and Github basic with SourceTree
 
Mercurial簡介與教學
Mercurial簡介與教學Mercurial簡介與教學
Mercurial簡介與教學
 

Viewers also liked

COSCUP 開源工作坊:Git workflows
COSCUP 開源工作坊:Git workflowsCOSCUP 開源工作坊:Git workflows
COSCUP 開源工作坊:Git workflowsCarl Su
 
你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?Mu Chun Wang
 
HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者Mu Chun Wang
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......hugo lu
 
手機自動化測試和持續整合
手機自動化測試和持續整合手機自動化測試和持續整合
手機自動化測試和持續整合Carl Su
 

Viewers also liked (7)

Git workshop
Git workshopGit workshop
Git workshop
 
版本控制Git
版本控制Git版本控制Git
版本控制Git
 
COSCUP 開源工作坊:Git workflows
COSCUP 開源工作坊:Git workflowsCOSCUP 開源工作坊:Git workflows
COSCUP 開源工作坊:Git workflows
 
你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?你有想過畢業九年後的你會變什麼樣子嗎?
你有想過畢業九年後的你會變什麼樣子嗎?
 
HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者HR Search - 輕鬆管理面試者
HR Search - 輕鬆管理面試者
 
關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......
 
手機自動化測試和持續整合
手機自動化測試和持續整合手機自動化測試和持續整合
手機自動化測試和持續整合
 

Similar to COSCUP 2015 開源之道-Git工作坊教學簡報

Git 使用介绍
Git 使用介绍Git 使用介绍
Git 使用介绍medcl
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹PingLun Liao
 
First meetingwithgit
First meetingwithgitFirst meetingwithgit
First meetingwithgitRhythm Sun
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuanWei-Yuan Chang
 
大家應該都要會的工具 Git 從放棄到會用2-分支篇
大家應該都要會的工具 Git   從放棄到會用2-分支篇大家應該都要會的工具 Git   從放棄到會用2-分支篇
大家應該都要會的工具 Git 從放棄到會用2-分支篇Alan Tsai
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607Charles Tang
 
Learn git
Learn gitLearn git
Learn git甘 李
 
Github in xcode
Github in xcodeGithub in xcode
Github in xcode郁凱 曾
 
Git introduction
Git introductionGit introduction
Git introductionmythnc
 
Git & git flow
Git & git flowGit & git flow
Git & git flowAmo Wu
 
Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)flylon
 
Android 程式設計(4)
Android 程式設計(4)Android 程式設計(4)
Android 程式設計(4)Roy Wang
 
Git &amp; git hub v1.2
Git &amp; git hub v1.2Git &amp; git hub v1.2
Git &amp; git hub v1.2Chris Chen
 
20170510 git 懶人包
20170510 git 懶人包20170510 git 懶人包
20170510 git 懶人包Chen-Ming Yang
 
為自己學 Git
為自己學 Git為自己學 Git
為自己學 Git昀 李
 
Git Flow 管理
Git Flow 管理Git Flow 管理
Git Flow 管理Pu Lee
 

Similar to COSCUP 2015 開源之道-Git工作坊教學簡報 (20)

Git 使用介绍
Git 使用介绍Git 使用介绍
Git 使用介绍
 
Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹Git 程式碼版本控制軟體介紹
Git 程式碼版本控制軟體介紹
 
First meetingwithgit
First meetingwithgitFirst meetingwithgit
First meetingwithgit
 
Learning to Use Git | WeiYuan
Learning to Use Git | WeiYuanLearning to Use Git | WeiYuan
Learning to Use Git | WeiYuan
 
大家應該都要會的工具 Git 從放棄到會用2-分支篇
大家應該都要會的工具 Git   從放棄到會用2-分支篇大家應該都要會的工具 Git   從放棄到會用2-分支篇
大家應該都要會的工具 Git 從放棄到會用2-分支篇
 
Git原理与实战 201607
Git原理与实战 201607Git原理与实战 201607
Git原理与实战 201607
 
Github簡介
Github簡介Github簡介
Github簡介
 
Learn git
Learn gitLearn git
Learn git
 
Github in xcode
Github in xcodeGithub in xcode
Github in xcode
 
Git introduction
Git introductionGit introduction
Git introduction
 
Git & git flow
Git & git flowGit & git flow
Git & git flow
 
Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)Git 超簡單學習懶人包(軟體程式版本控管系統)
Git 超簡單學習懶人包(軟體程式版本控管系統)
 
Android 程式設計(4)
Android 程式設計(4)Android 程式設計(4)
Android 程式設計(4)
 
Git &amp; git hub v1.2
Git &amp; git hub v1.2Git &amp; git hub v1.2
Git &amp; git hub v1.2
 
20170510 git 懶人包
20170510 git 懶人包20170510 git 懶人包
20170510 git 懶人包
 
Git 实战
Git 实战Git 实战
Git 实战
 
為自己學 Git
為自己學 Git為自己學 Git
為自己學 Git
 
Git Tutorial
Git TutorialGit Tutorial
Git Tutorial
 
Git教學
Git教學Git教學
Git教學
 
Git Flow 管理
Git Flow 管理Git Flow 管理
Git Flow 管理
 

COSCUP 2015 開源之道-Git工作坊教學簡報