使用提取命令共同作業
在新工作以外的停機時間內,您已處理裝載貓相片的網站。 您使用 Git 進行版本控制,現在可以邀請共同作業者加入專案。 在您家裡舉辦的披薩聚會上,您的朋友 Alice 是愛貓人士,因此樂意提供協助幫助您達到目標,您也很開心地接受了。
Alice 必須先建立一份 Git 專案。 然後,Alice 會希望在進行變更時,將他變更傳送給您。 在這種情況下,就可以運用 Git 的「分散式」特色。 Git 可讓兩個或更多人在同一專案上共同作業,不需要擔心會覆寫其他人所做的工作。 此外,您可以先檢查 Alice 的工作,再與您的工作合併。 (Alice 很有才華,但沒有開發人員是完美的。就算信任也需要確認。)
在此課程中,您將會學到如何複製存放庫 (也稱為「repo」) 來提供給其他人使用。 您也會學到如何使用 Git 其中一個最重要的功能:提取要求。
複製存放庫 (git clone)
在 Git 中,您可以使用 git clone
命令「複製」存放庫。 只要您知道指向存放庫的 URL 或路徑,就可以複製儲存在任何位置的存放庫。
git clone
可接受檔案系統路徑、SSH 路徑 (例如 git@example.com:alice/Cats
,如果您已在使用 Rsync 或 SCP,就會熟悉此格式),或是 URL (通常以 file:
、git:
或 ssh
開頭)。 git clone
的文件中會描述各種表單。 在 Unix 與 Linux 上,複製作業會使用永久連結,而且由於只需要複製目錄項目,不用複製檔案,因此速度很快且只會佔用最少的空間。
遠端存放庫 (git pull)
當 Git 複製存放庫時,會使用名稱 origin
建立稱為「遠端」的原始存放庫參考。 此參考會設定複製的存放庫,讓複製的存放庫從遠端存放庫「提取」或取出資料。 (Git 也可以推送。您稍後將在此課程模組中了解如何在 Git 推送。) origin
是 Git 提取變更和推送變更的預設位置。 提取會將 git pull
變更項目從遠端存放庫複製到本機存放庫。 git pull
命令非常有效率,因為它只會複製「新的」認可與物件,然後將它們存入至您的工作樹狀結構。
您可以使用 git pull
命令從 origin
提取。 將 git pull
與其他複製檔案的方法互相比較會很有用。 此 scp
命令會複製所有內容。 (scp
與 Unix cp
命令類似,不同之處在於複製的檔案不一定要在同一部電腦上 )。如果遠端目錄中有10,000 個檔案,scp
會全部複製。 有一個名為 Rsync 的更高效率程式會查看本機和遠端目錄中的每個檔案,而且只會複製兩者之間不同的檔案。 Rsync 通常用於進行備份,但仍必須將每個檔案做雜湊處理,除非檔案大小或建立日期不同。
Git 只會在認可時查看。 因為儲存了認可清單,所以Git 已經知道來自遠端存放庫的最後一個認可是哪一個。 然後 Git 會將下列項目告知要從中複製並傳送所有已變更項目的電腦,包括新的認可及所指向的物件。 那些認可和物件會封裝在一個名為 pack 的檔案中,並以單一批次的方式傳送。 最後,Git 會將所有變更的物件解除封裝,然後視需要將它們與工作樹狀結構中的認可和物件合併,以更新工作樹狀結構。
Git 只會在您要它提取或推送物件時,才會執行這兩個作業。 這與 Dropbox 不同,Dropbox 必須要求作業系統向它通知您在資料夾中所做的任何變更,而且偶爾會向伺服器詢問是否有其他人做過變更。
建立提取要求 (git request-pull)
當另一個開發人員 (例如 Alice) 複製您的存放庫並在她的本機進行一些變更時,一定會想要將這些變更併入原始存放庫中。 將這些變更推送到原始存放庫似乎是正確的處理方法。 不過,推送至原始存放庫會失敗,因為其他使用者無權變更您的存放庫。 而且那是原本就應該要有的限制。 現在,您想要先檢閱傳入的變更,再決定是否將變更合併到主要程式碼基底。
目前,Alice 必須提交「提取要求」,要求您將其變更提取至主要程式碼基底。 Alice 可以使用 git request-pull
來執行這項作業,可能看起來類似此範例:
git request-pull -p origin/main .
Alice 指的是 origin
遠端上的 main
分支作為 origin/main
。
此提取要求基本上與 GitHub 上的提取要求相同 (GitHub 可讓您儲存程式碼,但不在此課程模組的涵蓋範圍內)。 提取要求可讓您有機會先審核其他共同作業者的變更,再將其工作併入您要在網站上進行的工作。 程式碼檢閱是非常重要的一部份,有些人甚至認為那是共同作業程式設計中最重要的部分。
建立遠端 (git remote),然後完成提取要求 (git pull)
身為專案擁有者,您需要知道如何合併提取要求。 首先,使用 git remote
命令將另一個開發人員的存放庫設定為「遠端」。 然後,您可以使用 git pull
命令,將該遠端用於提取和提取要求。
在後台,git pull
是由兩個較簡單作業合併而成的:會取得變更的 git fetch
,以及會將變更合併到您存放庫中的 git merge
。 在此情況下,合併會「向前快轉」,這表示 Alice 的存放庫中會有您最新的認可,而她的認可也可能會在沒有任何修改的情況下新增至您歷史記錄的前面。