設定 - 比較工具 (WinMerge)

進入 Settings 畫面

滑鼠右鍵
點選 TortoiseGit / Settings



修改Diff Viewer」設定

點選External
輸入:C:\Program Files (x86)\WinMerge\WinMergeU.exe -s -e -x -ul -ur -wl -dl %bname -dr %yname %base %mine


按「套用」





修改「Merge Tool」設定

點選External
輸入:C:\Program Files (x86)\WinMerge\WinMergeU.exe %theirs %mine %merged
再切回使用 TortoiseGitMerge
(因為 TortoiseGitMerge 有 3 Way Merge, 試用中, 所以暫時不用 WinMerge 來解決衝突檔案了; 但 External 還是保留 WinMerge 的設定 )


按「確定」




=== 閒聊 ===

WinMerge 是我習慣使用的比較工具
最近開始試用內建的 TortoiseGitMerge 

試用 TortoiseGitMerge 心得:

優點:

1. Double click on word, 可以標示同名字的所有位置
   ( WinMerge 沒有這個功能 )

2. 有 3 Way 視窗
   ( WinMerge 的 Merge 功能較陽春, 沒有 3 Way 視窗)


缺點:

1. 無法比較二位元檔
   解法:
   TortoiseGit -> Settings -> Diff Viewer -> Advanced button
   Add 該檔的檔案類型, 轉用 WinMerge 做比較
   

2. 沒有 Replace 功能

3. 沒有 Align Mark 功能 ( WinMerge 也沒有 )

4. 沒有 Insert Mode


繼續試用中... ^_^ 希望它越來越好用










Switch/Checkout (to existed branch)

簡單說: Working tree Switch/Checkout 到某 branch

Switch/Checkout : HEAD attach some branch
如果 commit 上沒有 branch , HEAD 就會變成 Detached
(個人喜歡在 Log 畫面做 Switch/Checkout , 但這裡先說明在資料夾如何切換已存在的分支)


二種方法:

 1. TortoiseGit
 2. msysGit


1. TortoiseGit

Wanted: master Switch/Checkout to Release




Method:

TortoiseGit -> Switch/Checkout



Select "Release" Branch



Push OK



Success Message:

Push Close


Result:





2. msysGit

Select Branch name directly




maybe wait a while

confirm





================================================================

看起來 msysGit 提供的 Switch/Checkout 比較方便

但是如果 Working tree 仍有修改 , 是無法完成 Switch/Checkout 動作的
(If working tree is modified, Switch/Checkout will fail.)

此時, TortoiseGit 會給出 Error (如下圖), 而 msysGit 則不會
(TortoiseGit will show the error, but msysGit will not.)




solution 1: commit first
solution 2: stash
solution 3: revert local changes






Submodule Add

初步試用 Submodule 
先記錄一下




Submodule 作用:

把 Lib 版本庫 崁入 Project 版本庫
( Project 版本庫 -> 父版本庫 )


Submodule Add:

Lib 版本庫 clone 成 Project 版本庫 的 Submodule
Lib 以 submodule 的型式 被 Project 使用 )


在 父版本庫 中 , 可以把 submodule 視為一大塊"檔案"



 
==============================================================
以下示範加入 submodule 操作


Lib: 準備被加入為 submodule 的 git 版本庫
Project: 準備加入 Lib 為 submodule 的 git 父版本庫



在 父版本庫 , TortoiseGit -> Submodule Add...



填入 Path
(不能先建好該資料夾)
猜測理由: 該資料夾是專用的資料夾, 不能跟其它受版控檔案及資料夾混用
(雖然 git 不版控資料夾)

按 OK


會出現錯誤 LF 錯誤 (似乎可以不理它)




首先, 檢查父版本庫的版本路徑下是否產生 .gitmodules




再檢查剛剛填入的 Path 下是否有 submodule 了 
( Lib 資料夾: 含 Working Tree 以及 一個 .git 檔案, 注意: 不是 .git 資料夾 ) 




先 commit .gitmodule 和 submodule 的資料夾
( 把 submodule 整個資料夾下所有東西視為一大塊 "檔案" )
( 如果因為 .gitmodule 的 EOL 為 LF 而不能 commit
可以進 Settings 將 SafeCrlf 改為 false )


刪掉 .gitmodule, 再 Revert 回來
( 目的: 將 LF 全部改為 CRLF ; Settings 的 AutoCrlf 需勾選 )



進入 Git Bash 下指令:
git submodule status
確認是否加入了 submodule

或者

在父版本庫使用 TortoiseGit -> Submodule Update...
應該會出現











Submodule 使用方法

初步試用 Submodule
先記錄一下


Note: 把 submodule 想成一塊"檔案"


submodule 原來的 log:




submodule 有修改後, commit 修改的內容 
( 將這個過程想像成 對 submodule 存檔 )
log 如下:



回到父版本庫路徑做 commit
(將 submodule 想成檔案, 檔案存檔後, 狀態變 Modified, 即可 commit )


submodule 有新的 commit 後, 最好與 remote(來源/origin) 同步一下
log 如下:
理由: 
當 父版本庫 分享 出去後 ( Ex: Clone, Push, Fetch, Pull ) 
別人也能從 submodule 的來源版本庫抓取到相關連的 commit




對於上圖的 A2 Fetch A1 時, 只能 Fetch Lib 相關資訊
對於 Lib 新的 History 和 commit, 要另外 Fetch

所以流程是:
1. 先 同步 submodule
2. 再 同步 父版本庫
(好像要再開一篇 Sync Repository with Submodule)

^_^




Submodule Update

初步試用 Submodule
先記錄一下


Note: 把 submodule 想成一塊"檔案"



確認目前 submodule 在哪一個 commit 上


確認目前 父版本庫 在哪一個 commit 上



父版本庫 switch 回舊的 commit , 同時建一個新的 branch
( 隨便取一個 check )



再次確認目前 submodule 在哪一個 commit 上
嗯~ 還在原來那個上面
-> submodule 並不會隨著 父版本庫 做 Switch/Reset 等動作, 而跟著 switch 到相關聯的 commit 上

這時候, 就是 Submodule Update 派上用場的地方啦!!!


在 父版本庫, TortoiseGit -> Submodule Update...



好像可以勾掉 Initialize submodules (--init)
(--init -> 再研究)


成功訊息



查看 submodule 的 log:
粗體表示目前的 HEAD (ref) 在這個 commit 上

Note:
Submodule Update 後
HEAD 一定是 Detached 狀態
( HEAD attach 在 local branch 上時, 表示目前作用中的分支 )



=========================================================
很重要的注意事項:


如果要 submodule 之後有 wroking tree 修改, 且 HEAD 仍是 Detached
submodule 做 commit 時, 記得補給一個 branch
有 3 個方式:


(1) commit 時新建 branch

"Commit to:" 顯示 (no branch)

勾選 new branch , 填入 branch
按 OK


(2) commit 畫面直接按 OK 時

貼心的 TortoiseGit 會顯示
詢問要不要順便新建一個 branch
可按 Yes

跳出 Create Branch 視窗
( Switch to new branch 也幫你勾好了 )


(3) 如果以上都沒做, 強制 commit 了

就自己手動在 HEAD 所在的 commit 補上一個 branch
但 HEAD 還是 Detached
所以需再做 Switch/Checkout to "branch name"... 
來將 HEAD attach 到 branch 上 


=========================================================
為什麼要補一個 branch ?

因為在 父版本庫 再做一次 Submodule Update 時,

嘿嘿嘿...

submodule 的 HEAD 會 switch 到 父版本庫關聯的 submodule commit 上

如果 submodule 的 working tree 有修改而沒有 commit
那 working tree 的 修改 就被丟掉了
(目前最新版本不會丟掉 wroking tree 的修改)

如果 submodule 有新的 commit, 卻沒有 branch 在上面
那在 log 畫面就看不到它了 (不過還是可以在 reflog 中找得回來)



總之, Detached HEAD 看起來就是怪怪的
所以, 無論何時看到它, 就先將它 attach 到 branch, 總不會是什麼壞事吧!!!

=========================================================
每次 父版本庫 switch/reset hard 到別的 commit 上時, 不能自動做 Submodule Update 嗎?

目前好像還不行

不過 Switch/Reset 後的訊息畫面提供了 Update Submodules 按鈕, 可以直接按













Switch and Merge

(TortoiseGit Issue #1858)

Move to this Wiki

Note: 
git checkout --merge master 是不同的行為
--merge (-m) 的作用是:
當 b1 的 working tree 仍有修改, 在 checkout 時將修改帶到目的分支去

Fetch&Rebase (with conflict)

Concept:





Steps:


1. do Sync

2. do Fetch&Rebase


3. TGit Fetch Remote


4. TGit show you the Rebase dialog & Start Rebase


   If conflict

   4.1 do Edit conflicts
   4.2 Save Merge Result
   4.3 Resolved
   4.4 Commit

5. Rebase Done

6. Confirm : Log and Diff




Example:


Move to this wiki