前言
寫這篇文章的原因是組內的產品和美術同學,開始參與到git工作流中,但是網上又沒有找到一個比較詳細的使用教程,所以干脆就自己寫了一個[doge]。文章的內容比較基礎,介紹了Git內的一些基礎概念和基本操作,適合零基礎的人作為入門指南。
Git常見的一些概念
1.倉庫(repository/repo):代碼和資源的倉庫,Git分為本地倉庫和遠程倉庫,Git在啟動和主動拉取的時候會將遠程倉庫的內容同步到本地。遠程倉庫是托管在服務器上,僅會有一份,并且時刻保持最新。本地倉庫則是可以有多份,每個人的本地倉庫是互不影響的,而且可以斷網進行修改。
2.克隆(Clone):當遠程倉庫已經建好,并且沒有本地倉庫的時候。需要將遠程倉庫Clone到本地,剛完成克隆的時候,本地倉庫與遠程是完全相同的。
3.分支(Branch):一個倉庫里在初始化提交的時候會生成一個初始的主分支。之后可以在這個主分支上創建其他新的分支。 當你需要做一些操作并且不想影響到其他人時,可以單獨創建一個分支,在分支上開發完功能,最后再合并(Merge)到主干上。
分支同樣存在本地和遠程的區別,遠程分支記錄的是遠程倉庫該分支的內容。本地分支則是保存了你本地倉庫修改的內容。如果存在遠程分支,但是沒有對應的本地分支的情況,可以檢出(Checkout)獲得一個本地分支。
在GitKraken左側可以看到所有的本地(Local)和遠程(Remote)的分支。同時在中間的主面板也可以看到遠程和本地分支的情況,遠程的分支顯示為一個圓形的圖標,本地則為一個小電腦的圖標
GitKraken界面介紹
主界面
GitKraken的主界面如下,頂部顯示為當前的工程。中間為圖形化的Git提交記錄,可以看到當前項目的提交情況,左側為本地/遠程分支和貯藏等區域。右側則為文件修改區
Git文件修改區
文件修改區,當有文件產生變化的時候,會出現如下的提示
點擊View change會切換到如下界面,處理當前的修改
右側的文件修改區可以看到幾種不同的文件狀態
黃色為該文件進行過修改(本地與遠程不同)
紅色為該文件已經被刪除(遠程存在,本地不存在)
綠色為該文件為新增文件? (本地存在,遠程不存在)
這里需要注意一點如果本地沒有任何修改的時候,修改區是不會顯示的
左鍵點擊右側修改區的文件時,進入修改預覽界面。可以看到具體文件修改情況。側邊欄有文件修改情況的縮略圖,可以拖動后找到對應的修改位置。左側則是實際的修改情況。查看完畢后可以選擇暫存該文件或者關閉預覽
GitKranken基礎操作
丟棄修改(Discard)
如果不想要本地的修改了,可以選擇將本地修改丟棄,具體操作如下
(1)丟棄單個修改
在修改區內,如果想要某個修改,可以右鍵點擊該文件,選擇Discard changeds
之后頂部會出現一個確認彈窗,點擊Discard Unstaged changeds按鈕,即可還原到修改前的狀態
修改和刪除的文件都可以進行Discard操作。如果是新增的文件,想要還原,需要右鍵點擊Delete file。
(2)丟棄文件夾內修改
想要丟棄某個文件內的所有修改,需要先將修改區切換成Tree模式,這樣修改區的文件就會以樹狀結構出現
然后右鍵選擇需要丟棄的文件夾,點擊Discard all changes in folder
然后點擊頂部彈窗的Reset Files
(3)丟棄所有修改
如果想要忽略所有修改,則可以點擊左上角的垃圾桶
之后頂部會出現一個彈窗,點擊Reset All即可清空整個修改區
貯藏(Stash)
點擊頂部的Stash會將當前修改區內所有的修改貯藏起來。
對應的修改會放在下圖中的一個小抽屜里。并且會自動按照分支對該Stash進行命名。在develop上貯藏的message就會自動命名為WIP on develop
如果想要修改Stash的名字,可以點擊這個小抽屜,點擊右側Stash Message框,修改這個Message
后續如果想要恢復這個Stash內的修改,可以右鍵點擊小抽屜所在的那一行記錄,然后選擇Pop Stash即可
提交修改(Commit)
Git可以完成離線的開發工作,所有的提交內容可以先提交(Commit)到本地的分支中,此時并不影響遠程分支。
具體操作是鼠標移動到修改的文件處,點擊右側的StageFile,即可暫存(Stage)該文件
可以看到文件移動到了下方的Staged Files區域
如果想要暫存所有文件可以點擊右上角的Stage all changes
按文件夾暫存則是右鍵文件夾,然后選擇Stage folder
所有需要暫存的文件都放入暫存區后,在Commit Message填寫修改日志,點擊Commit changes就可以將修改提交到本地倉庫
提交修改之后,可以看到主界面會有一條對應日志的提交記錄。
拉取(Pull)
當有其他人提交一些更改到遠程分支時,需要通過Pull操作將其他人的修改同步到本地。Pull的操作十分簡單,只需要點擊頂部的Pull按鈕即可
在進行Pull之前,有兩類本地分支的狀態:
第一類最簡單,本地和遠程都處在同一條線上。代表本地未commit任何文件,但是其他人Push了一些修改到遠程分支
此時進行Pull操作之后,遠程和本地分支的標識都在同一個地方,說明Pull成功,本地和遠程的分支完全一致。
第二類情況是,本地進行修改并且Commit之后,沒有推送到遠端。
此時本地和遠程兩條分支在兩條線上并且本地和遠程分支沒有匯合到一起。當遠程分支的修改時間在本地Commit之后,遠程分支顯示在本地分支上方
反之遠程分支顯示在本地分支下方
直接點擊Pull即可進行拉取。Pull完成后,可以看到雖然遠程代碼和本地依然是在兩條線上,但是遠程分支匯聚到了本地分支上,代表Pull成功。
推送(Push)
當需要將本地分支的修改推送到遠程分支時,就需要進行推送(Push)操作,需要注意的時,在Push之前需要先進行Pull操作,將遠程分支的內容同步到本地才可以進行Push。
Push操作也十分簡單,點擊頂部的Push即可
Push成功之后,可以看到小圓點和小電腦此時處在同一行。說明Push 成功,本地和遠程的分支完全一致。
創建分支(Create Branch)
右鍵希望創建分支的位置,選擇Create branch here
之后在左側會出現一個enter branch name的彈窗,輸入分支名后,點擊Enter即可創建分支
這里輸入的分支名為testBranch,可以看到創建后會有一個小電腦的圖標,代表本地分支
檢出分支(Checkout)
當想要從一個分支切換到另外一個分支的時候,可以通過Checkout進行切換,具體操作是右鍵點擊需要切換的分支,選擇"Checkout 分支名稱"。(該操作也可以化簡為直接雙擊分支)
當切換到該分支時,可以看到分支左側有一個“打鉤”的圖標.
Checkout可以選擇切換到本地分支,或者遠程分支。如果不存在本地分支,可以直接雙擊遠程分支的所在的圓點。
會自動生成一個本地分支。
如果已經存在本地分支,并且本地分支和遠程和分支不在相同的位置,選擇Checkout遠程分支,會出現以下提示。如果選擇Reset Local Here,相當于將本地分支全部重置,并且同步到遠程分支所在的位置。(特別注意,該操作會將本地未Push的Commit全部丟棄,不要輕易執行該操作)如果不希望重置本地分支,可以選擇Cancel取消。大多數情況下,如果存在本地分支,都是先Checkout本地分支,然后Pull更新到最新。
合并分支(Merge)
不同的分支之間可以進行Merge操作,比如你在自己分支上進行了一些修改之后,希望將修改同步到主干上時,可以進行Merge操作。同時也可以把主干的修改同步到自己的分支上。
具體的操作是,先切換到目標分支,然后右鍵點擊需要合并的源分支,選擇"Merge 源分支 into 目標分支"。這樣就可以把來源分支的內容合并的目標分支上。
Merge成功后會自動產生一條合并的日志。并且源分支所代表的那根線也匯聚到目標分支上了
采用提交(Cherry Pick Commit)
有時候你在某個分支上做了多個修改,比如“添加圖片”(A),"修改圖片參數"(B),“修改代碼”(C)。這時候,你想要在另外一個目標分支上應用A修改,但是又不想其他修改也合并到目標分支,這時候就可以通過Cherry pick commit實現該操作。
具體步驟是,右鍵點擊需要采用的提交,然后選擇Cherry pick commit
操作完成之后可以看到目標分支上出現了一條跟采用提交相同的日志
恢復提交(Revert Commit)
如果一個已經提交的修改,希望將它恢復到提交之前的狀態,就可以使用Revert Commit操作。只需要右鍵點擊需要恢復的提交,選擇Revert commit即可
操作完成之后會自動生成一個Revert日志
處理沖突(Resolve Conflict)
處理沖突是git工作流中最為麻煩的。一般原因是兩個分支同時對一個文件進行了修改。下面舉一個簡單的例子,來模擬這樣一個情況。分支BranchA和分支BranchB都有個文件TestScript.cs,里面的內容就是聲明了一個變量a,一開始a的值是0。
XML |
然后在BranchA把a的值改成100,在BranchB的值改成50。然后嘗試將BranchB Merge到BranchA上。
可以看到左下角會彈出一個Merge Failed的提示
并且頂部同樣會有一個黃色的提示,文件修改區的Conflicted Files會顯示哪個文件出現沖突。
點擊沖突區的文件,會進入處理沖突的界面。可以看到沖突界面有三塊區域
左上角為BranchA的內容
右上角為BranchB的內容
底部為輸出區域的內容
這時候如果想要采用BranchA的提交可以點擊出現沖突那一行左側的勾選框
可以看到下方的輸出區域的內容也跟著變成跟BranchA相同的修改
這時候沖突便解決完畢了。可以點擊右上角的Save按鈕,退出處理沖突界面。
此時可以看到TestScript.cs從沖突區,移動到了下方的暫存區。并且自動填入了Commit Message。如果確定采用這次的沖突處理,可以點擊左側的Commit and Merge就完成了整個合并沖突的流程
主界面上也會出現這條Merge成功的Commit信息
實際在操作的過程中會發生單個文件會有多個沖突出現的情況。可以看到輸出區域Output,會顯示conflict n of m。n代表當前查看的是第n個沖突,m代表一共有幾個沖突。可以點擊右側的箭頭在不同的沖突之間切換。
有時候會出現單個文件的沖突特別多的情況。或者由于修改prefab或者場景導致不知道如何去一條一條地處理沖突。這時候可以直接點擊頂部兩個勾選框,選擇直接采用哪個分支的文件。比如點擊左側A的勾選框,代表直接采用BranchA上的文件,完全忽略BranchB上的修改。后續可以等待沖突處理完之后再手動將BranchB上的修改添加回來。
在處理沖突直接采用哪個文件時,建議大家按照以下的原則進行選擇
(1)、優先采用其他人修改的文件
(2)、優先采用遠程分支的文件
(3)、優先采用修改較多的文件
在處理沖突的時候還有一種簡單粗暴的處理方式,就是在Conflicted Files選擇Mark all resolved
這樣GitKranken會把所有沖突標記為已經解決。但是實際上文件的內容并不是正確的,比如前面那個修改a值的例子,選擇Mark all resolved的輸出內容是下圖這個樣子。同時把兩個分支的內容都填進去了,并且還有
Git自動輸出的提示“<<< Head? ===? >>> branchA”,最后還是需要手動地去解決。
GitKranken操作流程
1.清空修改區
在進行Pull或者切換分支的操作之前,需要先清空修改區。
清空有幾種方式:
(1)丟棄修改(Discard)
(2)貯藏(Stash)
(3)提交修改(Commit)
具體操作可以查看上一個章節中對應基本操作
2.確定分支
清空完修改區后,需要確定是在哪個分支上進行操作。之后需要切換到對應分支。可以先查看本地是否有該分支。(左側Local欄),如果存在。直接雙擊該分支即可切換到該分支上。如果該分支本地倉庫不存在,可以直接雙擊遠程分支,這樣就可以在本地Checkout了一個對應的分支,并完成切換。
3.同步遠程分支
切換到對應分支后需要進行Pull的操作,將遠程倉庫的修改同步到本地。點擊Pull按鈕,可以完成Pull操作
4.本地進行修改
在進行本地修改的時候,可以自由地創建本地分支,貯藏,或者提交到本地。
點擊完貯藏按鈕后可以看到頂部出現一個小抽屜的圖標,本地所有的修改都臨時保存在這個貯藏中
之后再次拉取最新的分支,驗證最終效果。
如果發現仍有需要修改的情況,可以直接在最新的分支上修改。也可以根據情況恢復貯藏的內容,右鍵剛剛貯藏的小抽屜,選擇Pop Stash,恢復修改。
常見問題處理
1.文件被其他程序使用
在進行文件操作的時候,(比如Stash,Discard等)可能會出現如下彈窗,導致無法進行操作。原因是,有文件被其他程序使用了,比如播放器,圖片瀏覽器等。這時候,需要把占用該文件的程序關閉,即可順利進行操作。(如果實在找不到是哪個程序,可以重啟電腦)
2.切換分支失敗Checkout Failed
在進行分支切換的時候,有時會因為修改區未清空出現如下報錯。清空修改區后再切換分支即可。
創作不易,如果覺得這篇文章對你有所幫助,可以動動小手,點個贊哈,?( ′・?・` )比心