書名:最親切的Git入門小教室
推薦網站:連猴子都能懂的Git入門指南|貝格樂(Backlog)
Git用於備份程式碼歷程,用戶開發到一個進度選擇提交時,會建立一個修改歷程,可以觀察到你此次修改哪些地方,如果後續開發發生問題,可以快速回復到先前沒出錯的版本。
與整份檔案備份相比能節省大量空間,避免重複備份沒修改過的檔案。
由於本人沒有與別人共同協作的經驗,目前對於共同協作會發生哪些問題還不太清楚。
🌟學習使用Git
優點:
- 可供團隊共同開發
- 可紀錄更新歷程,以便還原為舊版:比較差異 找出新舊檔案差異。
- 可共同開發:合併 上傳至相同位置。
- 可切換儲存位置:分支 儲存不同位置。開發、測試、正式
重要用語:
衝突:conflict
想往不同的方向修改,導致無法確定何者正確的狀況。
分支:branch
儲存庫內,用來儲存不同檔案歷程的位置(版本)。
差異:diff(difference)
檔案與檔案不同之處
合併:merge
將修改部分混在一起
注意事項:
文件編碼:使用UTF-8否則GitHub可能會顯示亂碼。
Git伺服器:
分成兩種儲存位置:遠端儲存庫(Git伺服器)、本地儲存庫(個人電腦)
Git伺服器:GitHub(公開無限/私人無限),Bitbucket(私人1G),GitLab(自架)
使用Git伺服器:
建立儲存庫>使用者管理
Git用戶端:
為了方便操作Git儲存庫可使用用戶端軟體:GitHub Desktop(本書使用)、Sourcetree、Git GUI、Fork(本人使用)
連線需得知:儲存庫URL、使用者名稱、密碼
儲存庫repository:
HEAD:目前的歷程位置
分支:可以切出 開發專用 測試專用 正式專用
master(主分支):建立儲存庫之後,會自動新增master分支,之後的提交在切換分支之前都會增加在master分支裡。
暫存區:存放新增或更新過的檔案(還沒提交的檔案),刪除檔案也會將已刪除的紀錄留在暫存區。
建立儲存庫:
遠端建立儲存庫:
登入GitHub帳號>建立儲存庫>向協作者開放存取儲存庫權限
本機建立儲存庫:
利用用戶端軟體、某些IDE也有提供Git版控功能,操作上差不多。
GitHub有公開儲存庫及私有儲存庫兩種。
公開儲存庫:可讓網路上所有人一起開發某個程式或交換意見
私有儲存庫:只有部分使用者可存取儲存庫。私有儲存庫通常與營利活動有關,所以需要付費使用,免費功能通常有限制。
GitHub建立儲存庫步驟:
1.建立帳號:https://github.com/
輸入使用者名稱,信箱,密碼建立帳戶,並驗證信箱。
2.建立儲存庫:
首頁左側有當前庫Repositories右邊有NEW可以新增儲存庫,輸入儲存庫名稱、簡介,選擇是否公開或私有。
3.確認儲存庫資訊:
建立後點選你所創建的儲存庫查看儲存庫資訊,URL分兩種HTTP或SSH,可利用按鈕切換,可將此URL給共同開發的人。
4.設定協作者(Collaborator)存取權限:
到儲存庫頁面,找到Settings進入設定畫面,點選Collaborators(合作者),Add people新增協作者,輸入email或userName,點選Add collaborators會寄信給協作者。
新增使用者會標示為Awaiting…代表正在等待協作者回應。協作者打開信件點選View invitation之後再點選Accept invitation跟可操座這個儲存庫。
若要刪除協作者,進到設定的協作者畫面,Name右方有叉叉
複製儲存庫到本機:
複製clone:將雲端資料下載至本機。(只有第一次執行)
需要:
-
-
- 公開儲存庫需要遠端儲存庫的URL。
- 私人儲存庫還需要需要使用者名稱與密碼。
- 設定一個自己的資料夾(本地儲存庫)
-
程式設計師在使用儲存庫時,第一步就是複製。
從遠端儲存庫 複製clone 下來,存放在用戶端中才可編輯修改。
複製下來後,會在本地新增一個追蹤分支origin/master。(內定為遠端庫原始的分支名稱)
儲存庫實體為.git的隱藏資料夾,這檔案千萬不能刪掉。
(整個資料夾複製到其他電腦,能沿用所有資訊,繼續後續作業。)
本機:
提交commit:將編輯後的資料寫入本機儲存庫。
要操作儲存庫的檔案,就必須透過Git用戶軟體。
暫存區>提交commit>本地儲存庫當前分支(HEAD)會新增一個修改歷程。
當前分支可能是master或者自行新增的其他名稱分支。
新增檔案時:只需勾選要給Git管理的檔案再按提交,未勾選擇不在Git管理範圍裡。(例如因設備不同而變動的常數、設定等)
提交時機:為了實現某項功能所進行的一整組修正。(可執行功能就提交)
提交時需輸入主題與描述(例子):
主題:完成拍照與顯示照片
描述:使用MediaStore.ACTION_IMAGE_CAPTURE系統照相機拍照與ImageView顯示照片
遠端:
推送push:將本機master主分支合併至追蹤分支origin/master,接著將追蹤分支上傳至雲端儲存庫。(遠端歷程更新了)
本地儲存庫有新提交時-推送->-本地端推送往遠端->遠端儲存庫歷程更新-追蹤分支更新。(多一個新的歷程紀錄)(如果有其他人先提交會有衝突錯誤)
拉取pull:從雲端儲存庫更新檔案至本機。
遠端儲存庫-傳送>追蹤分支origin/master更新了-拉取>master分支更新了。資料夾內容也更新至最新狀態。(如果本地有新增檔案會有衝突錯誤)
擷取fetch:從雲端儲存庫下載至追蹤分支。
(實務上多半只用拉取)
(遠端儲存庫損壞,可用本地儲存庫修復。)
推送拉取發生衝突:如果很多人同時修改同一部分,導致不知該以誰的修改為優先狀態。
避免方法:常常執行拉取操作。放棄自己的修改內容。
遠端儲存庫是共享的空間,在檔案不完整的時候不要推送,否則別人就會拉取不完整的檔案,會造成問題。
————————————操作篇————————————
🌟Git的基本操作
下載後安裝,點選登入,設定發布用的名稱與電子信箱即可安裝完成。
GitHub網頁:
左側是儲存庫列表,右側是clone從遠端儲存庫、新增儲存庫、從硬盤添加儲存庫。
(作業前先拉取遠端儲存庫檔案,修改完功能提交至本地儲存庫後就可以推送至遠端儲存庫。)
遠端儲存庫新增至本機(拉取):
若以利用GitHub登入則左側列表會列出可存取的儲存庫,點選後。
如果要操作非GitHub儲存庫,則點選右側Clone貼上URL輸入所需驗證資訊,正確輸入後即可連線。
GitHub新增儲存庫:
選擇Creat a repository>輸入repository名稱-說明文字-選擇是公開還是私人儲存庫-選擇是否建立自述文件(README裡面通常包含有軟件的描述或使用的注意事項。)>最後建立儲存庫即可完成新增儲存庫。
從硬盤檔案添加儲存庫:
Mac建立儲存庫:cd移動至專案資料夾,輸入git init。
會顯示 已初始化空的 Git 版本庫於 [檔案位置]
並且資料夾內會建立.git
添加協作者:
到GitHub-Repository畫面>settings>左邊找到access分類裡的collaborator>Add prople>輸入協作者的用戶名/全名/信箱(擇一)
(本人實際操作沒用過)
主要操作步驟🌟🌟🌟:
拉取(下載)>[編輯檔案]>提交>推送(上傳) 循環
提交Commit:
寫上註解:
標題:
設定了OO部份的設計。
修正了OO功能的異常。
註解:
近一步說明,一般省略。
選擇檔案:將新增的檔案放入本地暫存區。
指令:git add [檔案名稱]
用版控軟體在提交前會列出新增的檔案,點選需要交由Git管理的檔案後再接著提交。
建立好本地儲存庫後,並不會將所有檔案納入Git管理範圍,將檔案新增至暫存區代表這個檔案需要版本控制。
並不是所有檔案都需要交由Git管理,例如因設備不同而變動的常數、設定、系統自動生成不必要文件、容量過大的檔案。
不必要文件:
所有人都要排除檔案時:可以設定.gitignore忽略特定文件或資料夾,可參考此網站提供的忽略參考。(github/gitignore)(忽略IDE生成的或系統生成的檔案)
只有自己想要排除特定檔案時:使用文字編輯器開啟.git/info/exclude將要排除的檔案名稱或位置添加至檔案中,即可自動排除。
選擇的檔案如果有修改會建立副本放入本地暫存區等待你提交存放到儲存庫(你的.git/index資料夾)。
確認提交:
可從本地儲存庫中查看到目前分支歷程前進了一格,而追蹤分支origin/master還停留在原本位置。
推送Push:將本地儲存庫放入雲端儲存庫。
確認推送:
確認推送後,可以從本地儲存庫看到目前分支master與追蹤分支origin/master都在同一格。
也可以至GitHub儲存庫頁面右上有Commits可以查看提交內容。
擷取Fetch:遠端儲存庫匯入最新的追蹤分支,但沒有反應到資料夾。
(這部分本人沒做過)
拉取Pull:遠端儲存庫匯入最新資訊到本地儲存庫與資料夾。
確認拉取:
確認拉取後,可以從本地儲存庫看到目前分支master與追蹤分支origin/master都往前一格。
不適合Git管理的檔案:
個人檔案:個人設定、使用者姓名與密碼的檔案。
自動產生的檔案:編譯器或建置器轉換後的二進制檔案。
容量過大的檔案:容量過大的檔案不該由Git管理。
(可利用排除設定排除指定類型:.gitignore)
使用GitHub網站變更檔案:
點選想要更改的檔案,點選視窗右上角鉛筆進入編輯畫面,點選Commit即可提交,點選右上角歷史可確認是否操作正確。
————————————故障排除篇————————————
🌟常見問題⚠️⚠️⚠️無實作不懂的地方很多⚠️⚠️⚠️
無法推送,內容衝突(conflict):
若自己的歷程比推送目的地的歷程還舊,就無法推送檔案。
得先從遠端儲存庫-拉取->合併->再推送出去。
會有兩種狀況:
第一種:合併處理正常結束,顯示0 Conflicted file,只需要點選Commit merge即可完成拉取操作。
第二種:合併發生衝突,顯示1 Conflicted file,請先點選Commit merge,之後再視情況修正檔案,此時的檔案內容會被修改成「同時紀錄A與B的修改內容」的狀態,所以之後得手動修改內容。
利用記事本或文字編輯器打開發生衝突的檔案會發現檔案顯示:
<<<<<本地儲存庫分支名
[自己修改的內容]
===============
[遠端儲存庫的內容]
>>>>他人修改的歷程編號
(以上為一個衝突 [內為雙方修改的程式碼])
(要阻止衝突發生,就要經常執行拉取操作)
無法拉取,你有未提交的修改內容:
拉取操作是合並已提交的檔案,如果有修改後但未再次提交的檔案就會被覆寫,這代表你瀏覽的檔案內容有可能消失。
此時你有三種方法:
-
- 先提交(commit)再拉取(pull)。
- 刪除檔案再拉取。
- 於其他位置暫存(只要未再次提交的檔案不在git管理範圍裡就能拉取!)(可用分支取代)。
執行拉取操作時不提交檔案(分支Branch):
答案是建立另一個分支。
當master的內容修改時,分支temp的內容會自行增加,兩個分支互不干擾,等到功能完成時,在視情況合併暫存的內容。
-
- 我要新增分支時:
建立分支>開始編程 - 做到一半我要拉取最新檔案做合併時(分支內容更新):
提交檔案(才能切換分支)>切換成master分支>執行拉取操作,可順利執行拉取操作>切換回temp分支>將最新的master分支合併至temp分支>繼續編程直至完成。 - 完成功能要將分支合併至master時(合併修正內容):
切換至master分支>執行拉取動作讓master保持在最新狀態>將temp分支合併至master分支>沒問題就提交>再推送至遠端儲存庫>刪除temp分支
- 我要新增分支時:
建立分支(Branch):
GitHub遠端儲存庫建立分支:
遠端儲存庫顯示檔案位置上方有顯示多少個branch點進去>選擇New Branch>輸入分支名稱後建立分支
Fork本地儲存庫建立分支:
在本地儲存庫中當前分支右鍵選擇New Branch>輸入分支名稱後建立分支
合併分支(Merge):
Fork本地儲存庫合併分支:
移動至master主分支,滑鼠移動到要合併的分支,右鍵Merge in master,會將沒有共同修改過的文件(先前Git託管的文件)直接放到待提交區,提交後master會前進一格,推送後即可更新遠端庫。
發生合併衝突(Merge Conflict):
如果有相同修改的文件,會顯示是否要用Fork還是外部工具進行合併,以下是在Fork中合併的樣子,上方兩個視窗各代表兩個分支檔案內容,移至高透灰色區塊(為未選擇),區塊右上角會有選擇按鈕,點選時行號會藍底,且底下是合併後的樣子,如果兩個都選,將會把兩邊不相同的程式碼都保留起來,檢視過後,右下角Resolve解決合併衝突。
(圖片中只選擇左邊,因為右邊是重複的程式碼,如果兩個都選,將有兩個相同的敏感權限宣告。)
只擷取忘記拉取導致master使用到有問題的版本(本地庫舊版本),之後又推送錯誤的版本上去導致追蹤分支origin/master紀錄錯誤版本時:
移動到本地master 還原提交(revert commit):,退回原先的版本,追蹤分支origin/master則還在原先位置。
將追蹤分支強制退回原先版本:利用終端機移動(cd)到專案資料夾使用以下指令 強制推送
git push -f origin master
-f強制推送:請謹慎使用。
如果你在團隊中工作,並且其他人也在同一個分支上開發,那麼在使用前,一定要與團隊成員進行溝通,以確保你的操作不會破壞其他人的工作。