[教學] git應用-同檔需保存也需刪除的案例 - 討論區

[教學] git應用-同檔需保存也需刪除的案例

文章瀏覽次數 251 文章回覆數 2

特種兵

特種兵圖像(預設)

2023-08-11 10:32:46

From:211.23.21.202

回顧

之前,我們已經分享過比較兩個 commit 到底做了什麼的差異。一些 diff 的相關應用,我們都有概念了。

這一次想用一個實際案例,分享工作區與暫存區的檔案比較。

狀況

我昨天下午再抓 bug,發現問題後,修改了一個函數的寫法。

修改完後,還是有其他問題,於是在這個過程中,我會把一些結果寫到 log 裡。

然後跟人有約,急著下班,就這樣先存檔,就關機了。

為什麼不直接秀出結果,反正是測試環境,測完 git restore 再來修改程式推 commit 就好。

因為查詢使用了 ajax 方式,也就是直接從前端查詢後端資料,然後顯示於前端,而不重新整理頁面,只做部分的更新。

在這樣的情況下,就不能直接從後端程式 print 或 echo 資料出來看,所以就會選擇寫到 log 裡。

另外,在整個操作過程中,需要設斷點,也就是想看的地方比較多,直接顯示在畫面上會有點亂。

直接操作一次,然後查看詳細的 log 紀錄,可能會更好些。

再講下去要變程式教學了,先這樣。

案例

像這次是想透過取號查詢某一個公文,可是一直查不到,但資料庫確定有這個公文。

在查詢的過程中,因為有很多查詢的條件,各種條件的組合,所以要查問題,沒有那麼單純。

總結一下,目前的狀況,在一個檔案中,修改了函數,這段程式需要保留。

但後續又留下了一些臨時寫入 log 的程式碼,已經查到問題後,就想刪除他們。可是,東加西加的,已經不確定哪邊有這些臨時的程式碼了。

這些都在同一個檔案,這樣該怎麼辦?

狀態

先確認一下目前 git 的狀態:

$ git status

On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   sys/models/documentModel.php

no changes added to commit (use "git add" and/or "git commit -a")

我們看到了一個檔案已經被修改,而且還在工作區,也就是還沒有加到暫存區,果然走得很急。

方法一

那麼,我想要看這個檔案,我改了哪些地方,有兩種方法:

# 方法一,列出所有變更的檔案內容
$ git diff
diff --git a/sys/models/documentModel.php b/sys/models/documentModel.php
index 2184db60..530a4e3f 100644
--- a/sys/models/documentModel.php
+++ b/sys/models/documentModel.php
@@ -23,10 +23,16 @@ class documentModel extends documentSys
 		return $ret;
 	}

-	public function queryAllProcUnit() // 查詢所有派文單位或會辦單位資料(所有現存部門)
+	public function queryAllProcUnit($isActive=true) // 查詢所有派文單位或會辦單位資料(false 是查歷史部門)
 	{
-		$sql  = "select department_ID, department_name, ifnull(upDept, 0) as upDept from department where isActive = true ";
-		$sql .= "order by field(department_name, '總幹事', '副總幹事', '行政部', '資源處', '早療部', '職重部', '萬華中心', '教材中心', '音樂中心', '會計組', '教育組', '資訊組'), department_ID asc;";
+		if ($isActive == true) {
+			$order = "field(department_name, '總幹事', '副總幹事', '行政部', '資源處', '早療部', '職重部', '萬華中心', '教材中心', '音樂中心', '會計組', '教育組', '資訊組'), department_ID asc";
+		} else {
+			$order = "department_ID asc";
+			$isActive = 0; // 如果是 false 會被轉成空值
+		}
+		$sql  = "select department_ID, department_name, ifnull(upDept, 0) as upDept from department where isActive = $isActive ";
+		$sql .= "order by $order;";
 		$queryProcUnit = $this->db->query($sql);
 		if ($queryProcUnit->num_rows == 0) {
 			return false;
@@ -2412,6 +2418,7 @@ class documentModel extends documentSys
 		$totalDept = '';
 		if (strlen($dept) > 0 and strlen($delDept) > 0) {
 			$totalDept .= $dept . ',' . $delDept;
+			$this->log->setLog($totalDept);
 		} elseif (strlen($dept) == 0) {
 			$totalDept .= $delDept;
 		} elseif (strlen($delDept) == 0) {
@@ -2441,10 +2448,12 @@ class documentModel extends documentSys
 		while ($row = $obj->fetch_array(MYSQLI_ASSOC)) {
 			$row['att'] = $this->queryDocumentAtt($row['document_sys_ID']);
 			$row['status'] = $this->queryDocumentStatus($row['document_sys_ID']);
+			$this->log->setLog($row['status']);
 			if ($row['status'] == '通過') {
 				$data[] = $row;
 			}
 		}
+		$this->log->setLog(print_r($data, true));
 		return $data;
 	}
 	public function queryAdminDocumentIns($data)

詳細程式的內容,看不懂沒關係,我們知道加號就是新增的,減號就是刪掉的,沒有符號就是原本就有的。

我們看到還有三個地方是寫入 log 的,這些都要刪掉了。

你可能會想,直接開檔案搜尋 $this->log->setLog 就好了啊,可是別忘了,這個檔案原本裡面就有很多需要寫入 log 的程式碼,不是這次臨時加的,這樣搜尋會找到很多,不確定哪些是新的,哪些是原本的。

方法二

假設,我們這次不只修改過一個檔案,而是很多,那麼一次列出全部,可能會太多太雜。

已經知道是哪個檔案需要處理的話,可以直接指定:

# 方法二,直接指定只看某個檔案就好
$ git diff sys/models/documentModel.php
# 內容跟剛剛一樣,就不重複列了

至於檔名的路徑透過 status 就可以看到並複製。

暫存區

那如果昨天為了保險,離開公司前,有把檔案加到暫存區了,該怎麼查看。

# 先加到暫存區
$ git add .
# 再來查查看
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   sys/models/documentModel.php

已經在暫存區了,查看檔案內容,一樣是兩個方法,其實就只是多加了一個參數而已,也就是 --cached

# 以方法二為例來修改
$ git diff sys/models/documentModel.php
# 什麼東西都沒有,因為他是比較工作區修改的檔案,但目前修改的檔案已經被我們推到暫存區了
$ git diff --cached sys/models/documentModel.php
# 內容跟剛剛一樣,就不重複列了

提交

那如果是昨天已經先提交了,或者放到 stash 了呢?

之前都提過了,這邊就不多說了,可以參考兩個 commit 比較的主題,或者是把 commit 退到暫存區或工作區,接著就跟上面的做法一樣囉。

而在 stash 就把他 pop 回來繼續完成囉。

最後

知道改了哪些東西,接下來就簡單了。

用最直接的方式,就是檔案用編輯器打開,搜尋到需要刪掉的行,然後上下確認一下,沒問題就把他刪掉。

最後就是存檔、推到暫存區、提交、寫紀錄的流程。這些我們都會了。

留言

#1

阿慶

阿慶圖像

2023-08-11 10:52:21

From:211.23.21.202

我只看到有2000多行...XD

#2

特種兵

特種兵圖像(預設)

2023-08-12 05:42:33

From:111.249.165.134

一開始都想得比較單純,這就是系統架構的問題
等到一個個系統出來,每個系統又一直增加功能後
過了幾年就變成這樣了