[教學] git應用-commit 比一比(2) - 討論區

[教學] git應用-commit 比一比(2)

文章瀏覽次數 1129 文章回覆數 0

特種兵

特種兵圖像(預設)

2020-09-12 15:35:52

From:211.23.21.202

有時候在一個 commit 當中會去更改很多檔案,或是一個檔案的各個地方,

因此,讓我們來看一些比較複雜的 diff 資訊,其實說穿了都是一樣的東西,

我們會感覺比較複雜只是因為修改的量比較大而已。

$ git show 62087e083x
commit 62087e083x2f7cf2349764348b40110daee372fe
Author: Logo Kuo <logo@forblind.org.tw>
Date:   Wed Sep 9 18:29:42 2020 +0800

    將所有請休假寄信功能改成 mailTemplate

diff --git a/xxx/self/leaveCalculation.php b/xxx/self/leaveCalculation.php
index 84eeeab..128cb33 100644
# index 表示這些改動資料已經進到索引裡面,也就是已經提交囉
--- a/xxx/self/leaveCalculation.php
+++ b/xxx/self/leaveCalculation.php
# 所以後面的 - 行數 與 + 行數就是表示來源檔案與目標檔案的代稱
@@ -1519,7 +1519,6 @@ class leaveCalculation extends forblind_DB
# 從 1519 行開始加3行 也就是 1522 原檔原本是
# $retData = []; 
# 但這行前面有個 - 號,所以它被刪掉了
# 所以目的檔的 1522 就變成原檔的 1523
# 因此目的檔的 1522 是這行
#		$subject['name'] = $data['name'];
# 所以原檔這個區塊原本有 7 行,到了目的檔刪了一行,這個區塊就只有 6 行
# 這就是逗號後面數字的意義
 	protected function setMailContent($data,$type){ // 信件內容
 		$data = $this->dbAryStr($data);
 		$subject = ['title'=>'','name'=>'','type'=>'','time'=>'',];
-		$retData = [];
 		$subject['name'] = $data['name'];
 		switch ($data['itemsName']) {
 			case '加班':
@@ -1541,46 +1540,35 @@ class leaveCalculation extends forblind_DB
# 這邊又進入了下一個修改區段
# 這個區塊原本有 46 行,但加加減減後變成只有 35 行
# 但實際狀況要看內容,並不是很單純了少了 11 行
# 而是有些地方加,有些地方減,最後整個小區塊得到的結果
# 當改動越來越多也越來越大時,你會發現很難推算原本某一行在原檔的行數
# 但重點在於區塊當中加了什麼跟少了什麼,也就是通常注意相對性的資訊是比較重要的
# 這裡,目的檔是 1540 一樣加 3 也就是目的檔的 1543 是這行
#		// 寄送信件所需資訊
# 這是原本沒有的,因為前面有個 + 號,就是新增的行
# 從這邊開始加了 11 行
# 經過了兩行沒有被更動的
# 接下來又刪了 6 行加了 1 行
# 以此類推…
# 所以這一段總計是 +11-6+1-6+2-6+2-7+2-2+2-5+1
# 最後 -11 沒錯, 46-35 = 11 目的檔少了 15 行
 			$subject['time'] = date('ymdHi',strtotime($data['setDateTime']));
 			$bodyTime = date('Y-m-d',strtotime($data['startTime']));
 		}
+		// 寄送信件所需資訊
+		$mailTpl = new mailTemplate;
+		$bodyData = [
+			'name' => $subject['name'],
+			'type' => $subject['type'],
+			'time' => $subject['time'],
+			'toName' => $data['toName'],
+			'bodyTime' => $bodyTime,
+			'in_url' => $in_url,
+			'ex_url' => $ex_url,
+		];
 		switch ($type) {
 			case 'signing': // 審核信 
-				$subject['title'] = "待簽核";
-				$retData['body'] = "<p style='margin: 4px 0;'><span style='font-weight: bold;'>$data[toName] ($bodyTime $subject[type])</span>待審核,煩請儘速連至系統簽核。</p>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='".$this->ishttps().IN_URL."/leave/deptMar_signing'>內部[待簽核表單]</a>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='".$this->ishttps().EX_URL."/leave/deptMar_signing'>外部[待簽核表單]</a>";
-				$retData['body'] .= " <span style='color:red;'>*請務必連線協會網路才可登入</span></p>";
-				$retData['body'] .= "<p style='margin: 4px 0;'>若您讀取本通知信時,已完成該份表單簽核,請忽略此信!</p>";
+				$mailContent = $mailTpl->leaveSigningMail($bodyData);
 				break;
-			case 'OK': // 審核完成 
-				$subject['title'] = "簽核通過";
-				$retData['body'] = "<p style='margin: 4px 0;'><span style='font-weight: bold;'>$data[name] ($bodyTime $subject[type])</span> 已由主管簽核完成,請至系統查詢簽核結果。</p>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='$in_url'>內部[查詢簽核表單]</a>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='$ex_url'>外部[查詢簽核表單]</a>";
-				$retData['body'] .= " <span style='color:red;'>*請務必連線協會網路才可登入</span></p>";
+			case 'OK': // 審核完成信
+				$mailContent = $mailTpl->leaveOkMail($bodyData);
 				break;
-			case 'fail': // 簽核不通過 
-				$subject['title'] = "簽核不通過";
-				$retData['body'] = "<p style='margin: 4px 0;'><span style='font-weight: bold;'>$data[name] ($bodyTime $subject[type])</span> 簽核不通過,請至系統查詢簽核結果。</p>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='$in_url'>內部[查詢簽核表單]</a>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='$ex_url'>外部[查詢簽核表單]</a>";
-				$retData['body'] .= " <span style='color:red;'>*請務必連線協會網路才可登入</span></p>";
+			case 'fail': // 簽核不通過信
+				$mailContent = $mailTpl->leaveFailMail($bodyData);
 				break;
-			case 'alNot':
-				$subject['title'] = "特休不通過";
-				$subject['info'] = "特休時數錯誤";
-				$retData['body'] = "<p style='margin: 4px 0;'>您的 <span style='font-weight: bold;'>$data[name] 請假單</span>時數有誤,特別休假採半日計,僅能請上半天、下半天或全天,請至系統重新填寫請假單。</p>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='$in_url'>內部[查詢簽核表單]</a>";
-				$retData['body'] .= "<p style='margin: 4px 0;'><a style='color: blue;font-weight: bold;' href='$ex_url'>外部[查詢簽核表單]</a>";
-				$retData['body'] .= " <span style='color:red;'>*請務必連線協會網路才可登入</span></p>";
+			case 'alNot': // 特休不通過信 (以前特休最少要請半天)
+				$mailContent = $mailTpl->leaveAlnotMail($bodyData);
 				break;
-			case 'adminDelLeave':
-				$retData['body'] .= "<p style='margin: 4px 0;'>$data[name] <span style='font-weight: bold;'>$bodyTime $subject[type]</span> 已取消。</p>";
+			case 'adminDelLeave': // 休假被取消信
+				$mailContent = $mailTpl->leaveAdminDelLeaveMail($bodyData);
 				break;
 		}
-		$retData['subject'] = "【".$subject['title']."】 ".$subject['name']." (".$subject['type'].") - ".$subject['time'];
-		if( $type == 'alNot' ) $retData['subject'] = "【".$subject['title']."】 (".$subject['info'].")";
-		if( $type == 'adminDelLeave' ) $retData['subject'] = "【".$subject['type']."已取消】 ".$subject['name']." (".$subject['type'].")";
-		$retData['body'] .= "<hr><i>此信件為系統自動寄信。</i>";
-		return $retData;
+		return $mailContent;
 	}
 	function setSigningMailData($lsysID , $type) { // 信件收件人
 		$lsysID = $this->db_string($lsysID);

再來看這一小段:

--- a/data/sysLlibrary/mail/template/announcement/iread.tpl
+++ b/data/sysLlibrary/mail/template/announcement/iread.tpl
@@ -1,4 +1,4 @@
-{extends file="basedocument.tpl"}
+{extends file="base.tpl"}
# 看起來行數都沒改,好像都一樣
# 但其實是減了一行又加了一行,所以行數一樣
# 但內容不一樣

還有這個:

diff --git a/data/sysLlibrary/mail/template/leave/admindelleave.tpl b/data/sysLlibrary/mail/template/leave/admindelleave.tpl
new file mode 100644
# new file 這邊表示這個檔案是完全新增的,原本沒有
index 0000000..8b75745
--- /dev/null
+++ b/data/sysLlibrary/mail/template/leave/admindelleave.tpl
# 因為原本沒有,所以 --- 的來源檔是空的
@@ -0,0 +1,7 @@
+{extends file="base.tpl"}
+
+{block "content"}

最後這一段

 diff --git a/xxx/controllers/rootController.php b/xxx/controllers/rootController.php                                                                            
 deleted file mode 100644                                                        
# deleted file 表示這個檔案整個被刪掉了
 index 4cfdcb0..0000000                                                          
 --- a/xxx/controllers/rootController.php                                        
 +++ /dev/null                                                                   
# 因為被刪了,所以目的變成空的,沒這個檔
 @@ -1,578 +0,0 @@                                                               
 -<?php                                                                          
 -/**                                                                            
 - * 內部系統前台                                                                

以上是儘量帶著大家去看不同情況的 git diff 所呈現出來的資訊。

我之前曾經按照 diff 內容複製一份目的檔然後修改回原本的檔案,再拿兩個檔案做比較自己寫一份 diff 內容出來

花了很多時間,但覺得很有趣,也對於 git diff 更了解一些。

想要原本的來源檔內容,其實不用這樣做啦,切換到原本的版本就有原本的檔案內容了。

我自己是覺得用這種簡單的描述可以把來源跟目的檔的差異表示的很清楚是一個很聰明的方式,

就像我們會覺得正規表示法很神一樣。

最後補充一下,git diff 可以用來比較的環境很多源,

像是 stash 改了什麼,某兩個 commit 相比的差異,

還有 stage 跟工作目錄的差異等等,都是可以觀察的。

以下面這篇文章做個小結,讓大家可以想把誰拿來跟誰比都不成問題。

git diff