我未來有機會要在 Mac 的 Xcode 開發程式,因為是在不熟悉的環境,所以要先了解一些基本的工具,其中版本控制的 Git 就是重要的工具之一。
在 Windows 環境下,我使用 Git 是用 TortoiseGit 這一套工具,它是 GUI 界面,非常方便好用。在 Windows 下的開發環境或 VSCode 等編輯程式雖然也有整合 Git,我就懶得學那麼多套了,直接用 TortoiseGit 來操作。當然,我更懶得背 Git 的指令了。
在 Mac 上,我雖然有安裝 Sourcetree 這套工具,但還沒有熟悉,所以打算直接學習在 Xcode 上操作 Git,也省得每次要離開 Xcode 才能操作 Git 的功能。
底下記錄我常用的功能與操作方式,不過並不會介紹 Git 的細節,所以這是只適合對 Git 已有初步認識的人閱讀的。
環境
macOS 10.15 Catalina
Xcode 11.1
初始化
在一開始建立專案後,要存檔時,請記得勾選「Create Git repository on my Mac」。
如此就會初始化專案的 Git 目錄了。
如果一開始沒有初始化 Git,則可以使用主功能表的 (Source Control -> Create Git Repositories...) 來建立。
連結 GitHub 帳號
現在要把專案儲存到 GitHub 上,在此之前,必須要先有 GitHub 帳號,若還沒有帳號的,請自行搜尋如何在 GitHub 上建立帳號。
在主功能表選擇 (Xcode -> Preferences...)
選擇 GitHub 帳號,然後繼續。
依指示操作,輸入帳號和密碼,完成後結果如下,表示 GitHub 帳號連結完成了。
在 GitHub 建立專案
現在要在 GitHub 建立同步的專案。
首先點選下圖紅框的圖示,滑鼠移上去的提示文字是「Show the Source Control navigator」。
然後點選專案「githubtest master」,按下滑鼠右鍵(這是在 Windows 的習慣用語,其實我是雙指同時點選觸控板),再選擇「Create "githubtest" Remote...」。
githubtest 是這個專案的名稱。
接著出現下圖,在對話框中填入相關資料,就像在 GitHub 網站建立專案一般。
提交 (Commit)
首先來試著提交專案,把專案的畫面修改一下,加入四個基本元件。
將專案儲存後,選擇主功能表的 (Source Control -> Commit...)。
底下是 commit 畫面,左邊側欄可以看到有一個檔案有打藍勾勾,表示是這個檔案有改變,右邊是檔案的差異。
請在底下填入要提交的訊息,然後進行提交。
後來我才注意到,下方左邊有一個 Push to remote 的功能,如果打勾,就會順便推送到 GitHub 了。
在下圖可以看出,提交之後,就出現紅框的記錄,表示我已經提交成功了,提交訊息就是「增加四個基本元件」。「master」表示是目前分支,至於遠端的 origin/master 還停留在之前的提交,表示還沒推送。
推送 (Push)
提交之後,就要推送到 GitHub 網站。請選擇主功能表的 (Source Control -> Push...)。
選擇遠端的分支 origin/master 之後,就按下 Push 就可以推送至 GitHub 了。
Checkout
Git 強大的功能之一就是可以輕易的回到某個舊版本,這裡就是要測試如何操作。
首先先把畫面弄亂,然後提交並推送它。
如果我想回到畫面整齊的狀態,要怎麼做呢?
如下圖,可以看到右方目前有三個記錄,最上面那個就是四個元件被弄亂的狀態。
若我想回到第二個「增加四個基本元件」的狀態,就在該記錄按滑鼠右鍵,選擇 Checkout "xxxxxxx..."。
出現如下詢問框,按下 Checkout 就可以了。
再回到 Main.storyboard 去看,果然又回到整齊畫面的版本了。
如果要回到 master 分支最新的狀態,只要到 master 分支,按滑鼠右鍵選擇 Checkout...,出現先前見過的詢問框,按下 Checkout 之後,就回到最新的狀態了。
建立分支
分支也是 Git 很重要的功能,底下要來建立 feature 分支。
先找到 master 分支,按滑鼠右鍵,選 Branch from "master"...。
出現如下對話框,寫上 feature,按下 Create 即可。
如下圖,feature 分支就出現在左邊出現了,feature 後面的 (current) 表示這是目前的分支。
切換分支
切換分支很也容易,只要在想要切換的分支上按下滑鼠右鍵,選擇 Checkout...,就可以輕易切換過去了。
合併分支
合併分支其實也不難,但我在實際操作時,有時需要使用「非快進的合併」 (no fast forward),等同如下命令
git merge --no-ff
在 Windows 版的 TortoiseGit 在合併時有提供是否使用 fast forward 的選項,但 Xcode 似乎直接使用 fast forward,無法選擇,這算是小小遺憾。不過還是有辦法解決的,只是稍為麻煩一點。
在此先介紹一般的合併。
首先我在 feature 提交與推送二次,就形成如下畫面。feature 在紅框的位置,而 master 分支還在黃框的位置。
要合併時,先 Checkout 到 master 分支,然後點選 feature,按滑鼠右鍵,選擇 Merge "feature" into "master"...。
接著會出現如下訊息,若沒有任何衝突,按下 Merge 就合併完成了。
「快進」與「非快進」合併
快進 (Fast Forward) 有人翻譯為快轉,這裡簡單介紹「快進」與「非快進」的差別。
我使用 TortoiseGit 的畫面來說明比較簡單。
這是模擬先前的情況,master 還停留在第 3 版,而 feature 已經在第 5 版的位置了。
此時我想要進行合併,也就是先切換到 master,再與 feature 合併,預設是快進合併時,結果會如下圖,這也是 Xcode 合併後的結果。
然而有時我希望能看到不同分支的演變過程,此時使用非快進合併就可以做到了。在 TortoiseGit 合併時只要勾選「不用快進」,如下所示。
合併完成後的分支圖如下,如此就可以看出 feature 分支的範圍了。
Xcode 如何產生非快進合併?
Xcode 如何產生非快進合併的效果?我目前有三個答案:
1. 使用命令列操作:
git merge --no-ff
不過,我實在不想用命令列操作。
2. 將 Merge 預設為非快進
我查到一些設定,可以直接將 Merge 預設為非快進,這二個是網路上查到的,最主要的當然是那二個。
git config --global pull.ff only
git config --global merge.ff false
不過我稍為了試了一下,完全沒有快進也是很麻煩的,會多出許多複雜的狀態。
以這個圖來說
若我把 feature 再合併至 master 時,不使用快進則會變成如下:
上圖絕對不是我們想要的,我們要看到的是下圖這種:
這種合併就需要使用快進合併,因此將合併預設為非快進也不是好方法。
3. 製造無法快進合併的情況
最後我想到一個方法,為了避免快進,我可以在 master 分支變更一個檔案,例如說明檔,讓它和 feature 不會產生衝突,也可以避免快進合併,以達到我們需要的情況。
在 master 更新一個不會衝突的說明檔。
再與 feature 合併,這就是我想要看到的結果了。
總結
其實也沒什麼好總結的,Xcode 的 Git 看起來還蠻好用的,常用的功能都有了,不用使用命令列就是一大福音,先用一陣子看看,日後有問題再來報告了。
補充:在命令列使用 Token 推送
2022/03/23 今天用 Xcode v13.3 提交雖然有成功,但推送卻失敗。詳見此篇
「在 Mac 命令列使用 Github 的 Token 執行 Git Push」
- 瀏覽次數:14053
發表新回應