回顧
之前,我們已經分享過比較兩個 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 回來繼續完成囉。
最後
知道改了哪些東西,接下來就簡單了。
用最直接的方式,就是檔案用編輯器打開,搜尋到需要刪掉的行,然後上下確認一下,沒問題就把他刪掉。
最後就是存檔、推到暫存區、提交、寫紀錄的流程。這些我們都會了。