From 1293ff1d51d1c345cba9ababb05d8f12e0d2a807 Mon Sep 17 00:00:00 2001 From: Will Date: Sat, 18 Nov 2023 22:20:17 +0800 Subject: [PATCH] fixes #29 --- zh-cn/18.md | 100 ++++++++++++++++++---------------------- zh-cn/figures/18/04.png | Bin 14010 -> 6361 bytes zh-tw/18.md | 100 ++++++++++++++++++---------------------- zh-tw/figures/18/04.png | Bin 14010 -> 6361 bytes 4 files changed, 92 insertions(+), 108 deletions(-) diff --git a/zh-cn/18.md b/zh-cn/18.md index 1ec84d9..01245f7 100644 --- a/zh-cn/18.md +++ b/zh-cn/18.md @@ -1,26 +1,22 @@ -第 18 天:修正 commit 过的版本历史记录 Part 1 -============================================================= +# 第 18 天:修正 commit 过的版本历史记录 Part 1 当你使用 Git 进行版本控制时,我们会利用 `git commit` 建立许多版本,由于 Git 属分布式版本控制机制,对于版本控制方面没有太多的权限设计,跟其他如 Subversion 或 TFVC 这类版控系统相比,Git 提供更多「修正版本记录」的机制,让你在「分享」版本给其他人的时候,能够预先做个整理。 -版本控制的基本原则 -------------------- +## 版本控制的基本原则 我们在进行版本控制时,无论是 Git, Subversion 或 TFVC 都一样,维持一个良好的版本记录有助于我们追踪每个版本的更新历程 (当有需要做这件事的时候)。以我个人的经验,我们很难有机会,也不太想去追踪我们某个项目中软件开发的进程,我们许多项目累积的版本记录数量有多达数千笔,谁会有这种闲工夫去追查历史呢? -然而实际上,当软件的臭虫(Bug)发生的时候,我们会需要去追踪特定臭虫的历史记录,以查出该臭虫真正发生的原因,这个时候就是版本控制带来最大价值的时候。 +然而实际上,当软件的臭虫 (Bug) 发生的时候,我们会需要去追踪特定臭虫的历史记录,以查出该臭虫真正发生的原因,这个时候就是版本控制带来最大价值的时候。 也因此,要怎样维持一个好的「版本记录」也是非常重要的,这边有一些控制原则可以分享给大家: * 做一个小功能修改就建立版本,这样才容易追踪变更 * 千万不要累积一大堆修改后才建立一个「大版本」 -* 有逻辑、有顺序的修正功能,确保相关的版本修正可以按顺序提交(commit),这样才便于追踪 +* 有逻辑、有顺序的修正功能,确保相关的版本修正可以按顺序提交 (commit),这样才便于追踪 不过,人非圣贤、孰能无过,哪个人能确保团队所有人都能时时刻刻照着上述原则进行版控?哪个人不是「想到哪改到哪」呢?这样的要求变得有点緣木求魚、不切实际。所以,我们需要有一套「修改版本」的机制,让版本提交到远端服务器上的时候,就已经是完美的版本状态。 - -修正 commit 历史记录的理由 ---------------------------- +## 修正 commit 历史记录的理由 到目前为止,我还没提到关于「远端仓库」的细节,所以大部分的 Git 操作都还专注在本地端,也就是在工作目录下的版本管控,这个仓库就位于你的 `.git/` 目录下。然而,之后我们即将提到「远端仓库」的应用,到时就不只一个人拥有仓库,所需要注意的细节也就更多。 @@ -30,17 +26,16 @@ 所以,到底什么样的使用情境会需要去修改版本记录呢?以下几点各位可以参考看看。 -假设我们现在有 [A] -> [B] -> [C] 三个版本: +假设我们现在有 \[A] -> \[B] -> \[C] 三个版本: -* 可能 [C] 版本你发现 commit 错了,必须删除这一版本所有变更 -* 你可能 commit 了之后才发现 [C] 这个版本其实只有测试代码,你也想删除他 +* 可能 \[C] 版本你发现 commit 错了,必须删除这一版本所有变更 +* 你可能 commit 了之后才发现 \[C] 这个版本其实只有测试代码,你也想删除他 * 其中有些版本的记录消息有错字,你想修改消息文字,但不影响文件的变更历程 -* 你可能想把这些版本的 commit 顺序调整为 [A] -> [C] -> [B],让版本演进更有逻辑性 -* 你发现 [B] 这个版本忘了加入一个重要的文件就 commit 了,你想事后補救这次变更 +* 你可能想把这些版本的 commit 顺序调整为 \[A] -> \[C] -> \[B],让版本演进更有逻辑性 +* 你发现 \[B] 这个版本忘了加入一个重要的文件就 commit 了,你想事后補救这次变更 * 在你打算「分享」分支出去时,发现了代码有瑕疵,你可以修改完后再分享出去 -修正 commit 历史记录的注意事项 ------------------------------ +## 修正 commit 历史记录的注意事项 Git 保留了「修改版本历史记录」的机制,主要是希望你能在「自我控制版本」到了一定程度后,自己整理一下版本记录的各种信息,好让你将版本「发布」出去后,让其他人能够更清楚的理解你对这些版本到底做了哪些修改。 @@ -51,28 +46,29 @@ Git 保留了「修改版本历史记录」的机制,主要是希望你能在 * 你可以任意修改某个支线上的版本,只要你还没「分享」给其他人 * **当你「分享」特定分支给其他人之后,这些「已分享」的版本历史记录就別再改了!** -准备本日练习用的版本库 ----------------------- +## 准备本日练习用的版本库 之前我们曾在【第 04 天:常用的 Git 版本控制指令】学过 `git reset` 的用法,主要用来 **重置目前的工作目录**。不过,相同的指令,也可以用来修正版本历史记录。 在开始说明前,我们一样先用以下指令建立一个练习用的工作目录与本地仓库: - mkdir git-reset-demo - cd git-reset-demo - git init +```sh +mkdir git-reset-demo +cd git-reset-demo +git init - echo. > a.txt - git add . - git commit -m "Initial commit (a.txt created)" +echo. > a.txt +git add . +git commit -m "Initial commit (a.txt created)" - echo 1 > a.txt - git add . - git commit -m "Update a.txt!" +echo 1 > a.txt +git add . +git commit -m "Update a.txt!" - echo 1 > b.txt - git add . - git commit -m "Add b.txt!" +echo 1 > b.txt +git add . +git commit -m "Add b.txt!" +``` ![image](figures/18/01.png) @@ -80,17 +76,19 @@ Git 保留了「修改版本历史记录」的机制,主要是希望你能在 ![image](figures/18/02.png) - -删除最近一次的版本 -------------------- +## 删除最近一次的版本 我们参考上图,用文字表达这三个版本的顺序如下: - [83a841] > [0576e0] > [aef2a5] +```txt +[83a841] > [0576e0] > [aef2a5] +``` 现在,我想把最后一个版本删除,变成: - [83a841] > [0576e0] +```txt +[83a841] > [0576e0] +``` 那么,你可以执行 `git reset --hard "HEAD^"` 即可删除 `HEAD` 这个版本: **请注意**:在「命令提示字元下」 `^` 是特殊符号,所以必须用雙引号括起来! @@ -99,12 +97,11 @@ Git 保留了「修改版本历史记录」的机制,主要是希望你能在 此时你可以看见,原本的最新版被删除了,那是因为刚刚我们执行 `git reset --hard "HEAD^"` 这个动作,把 `HEAD` 指向的位址改到了前一个版本 ( `HEAD^` ),所以你打 `git log` 就看不到这个版本了。 -事实上,原本你感觉被删除的版本,其实一直储存在 Git 的物件储存区(object storage)里,也就是这笔资料一直躺在 `.git\objects\` 目录下。我们还是可以用 `git show 83a841` 取得该版本 ( 即 commit 物件 ) 的详细资料: +事实上,原本你感觉被删除的版本,其实一直储存在 Git 的物件储存区 (object storage) 里,也就是这笔资料一直躺在 `.git\objects\` 目录下。我们还是可以用 `git show aef2a5` 取得该版本 (即 commit 物件) 的详细资料: ![image](figures/18/04.png) -删除最近一次的版本,但保留最后一次的变更 ------------------------------------- +## 删除最近一次的版本,但保留最后一次的变更 还记得吗?无论你对 Git 仓库做了什么事,都是可以还原的,只要执行 `git reset --hard ORIG_HEAD` 即可。 @@ -116,8 +113,7 @@ Git 保留了「修改版本历史记录」的机制,主要是希望你能在 这代表着,你可以保留最后一次的变更,再加上一些变更后,重新执行 `git commit` 一次,并重新设定一个新的记录消息。 -重新提交一次最后一个版本 (即 `HEAD` 版本) ------------------------------------------ +## 重新提交一次最后一个版本 (即 `HEAD` 版本) 如果你发现不小心执行了 `git commit` 动作,但还有些文件忘了加进去 (`git add [filepath]`) 或只是记录消息写错,想重新補上的话,直接执行 `git commit --amend` 即可。这个动作,会把目前记录在索引中的变更文件,全部添加到当前最新版之中,并且要求你修改原本的记录消息。 @@ -129,38 +125,34 @@ Git 保留了「修改版本历史记录」的机制,主要是希望你能在 我把记录消息修改成以下文字,并且存档后退出,版本就会建立完成: - Add b.txt! - Add c.txt! +```txt +Add b.txt! +Add c.txt! +``` 执行的结果如下,但最值得注意的是,最新版的 `HEAD` 已经是完全不同的 commit 物件了,所以用 `git log` 所看到的 commit 物件绝对名称跟之前已经不一样了。 ![image](figures/18/08.png) -今日小结 -------- +## 今日小结 -今天简单的学到如何对【最新版】(`HEAD`)进行版本的变更,大多用在不小心 `git commit` 错的情況,事实上还会有更多调整版本历史记录的方式,这些会在之后的文章中出现。 +今天简单的学到如何对【最新版】(`HEAD`) 进行版本的变更,大多用在不小心 `git commit` 错的情況,事实上还会有更多调整版本历史记录的方式,这些会在之后的文章中出现。 我重新整理一下本日学到的 Git 指令与参数: * git reset --hard "HEAD^" * git reset --soft "HEAD^" -* git reset --hard ORIG_HEAD +* git reset --hard ORIG\_HEAD * git commit --amend -参考连结 -------- +## 参考连结 * [git-reset(1) Manual Page](https://www.kernel.org/pub/software/scm/git/docs/git-reset.html) +--- - - -------- * [回目录](README.md) * [前一天:关于合并的基本观念与使用方式](17.md) * [下一天:设定 .gitignore 忽略清单](19.md) -------- - - +--- diff --git a/zh-cn/figures/18/04.png b/zh-cn/figures/18/04.png index a0772595123e8c5e67841c09770daa8c3a1d16c0..600febf4925e232b2b0eee44da7c39b4e133e3cc 100644 GIT binary patch literal 6361 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 XPCCvkH3xo^CSr2a;zsFj_n-d{phJqr diff --git a/zh-tw/18.md b/zh-tw/18.md index 734f16c..c0d9cdf 100644 --- a/zh-tw/18.md +++ b/zh-tw/18.md @@ -1,26 +1,22 @@ -第 18 天:修正 commit 過的版本歷史紀錄 Part 1 -============================================================= +# 第 18 天:修正 commit 過的版本歷史紀錄 Part 1 當你使用 Git 進行版本控管時,我們會利用 `git commit` 建立許多版本,由於 Git 屬分散式版本控管機制,對於版本控管方面沒有太多的權限設計,跟其他如 Subversion 或 TFVC 這類版控系統相比,Git 提供更多「修正版本記錄」的機制,讓你在「分享」版本給其他人的時候,能夠預先做個整理。 -版本控管的基本原則 -------------------- +## 版本控管的基本原則 我們在進行版本控管時,無論是 Git, Subversion 或 TFVC 都一樣,維持一個良好的版本紀錄有助於我們追蹤每個版本的更新歷程 (當有需要做這件事的時候)。以我個人的經驗,我們很難有機會,也不太想去追蹤我們某個專案中軟體開發的進程,我們許多專案累積的版本紀錄數量有多達數千筆,誰會有這種閒工夫去追查歷史呢? -然而實務上,當軟體的臭蟲(Bug)發生的時候,我們會需要去追蹤特定臭蟲的歷史紀錄,以查出該臭蟲真正發生的原因,這個時候就是版本控管帶來最大價值的時候。 +然而實務上,當軟體的臭蟲 (Bug) 發生的時候,我們會需要去追蹤特定臭蟲的歷史紀錄,以查出該臭蟲真正發生的原因,這個時候就是版本控管帶來最大價值的時候。 也因此,要怎樣維持一個好的「版本紀錄」也是非常重要的,這邊有一些控管原則可以分享給大家: * 做一個小功能修改就建立版本,這樣才容易追蹤變更 * 千萬不要累積一大堆修改後才建立一個「大版本」 -* 有邏輯、有順序的修正功能,確保相關的版本修正可以按順序提交(commit),這樣才便於追蹤 +* 有邏輯、有順序的修正功能,確保相關的版本修正可以按順序提交 (commit),這樣才便於追蹤 不過,人非聖賢、孰能無過,哪個人能確保團隊所有人都能時時刻刻照著上述原則進行版控?哪個人不是「想到哪改到哪」呢?這樣的要求變得有點緣木求魚、不切實際。所以,我們需要有一套「修改版本」的機制,讓版本提交到遠端伺服器上的時候,就已經是完美的版本狀態。 - -修正 commit 歷史紀錄的理由 ---------------------------- +## 修正 commit 歷史紀錄的理由 到目前為止,我還沒提到關於「遠端儲存庫」的細節,所以大部分的 Git 操作都還專注在本地端,也就是在工作目錄下的版本管控,這個儲存庫就位於你的 `.git/` 目錄下。然而,之後我們即將提到「遠端儲存庫」的應用,到時就不只一個人擁有儲存庫,所需要注意的細節也就更多。 @@ -30,17 +26,16 @@ 所以,到底甚麼樣的使用情境會需要去修改版本紀錄呢?以下幾點各位可以參考看看。 -假設我們現在有 [A] -> [B] -> [C] 三個版本: +假設我們現在有 \[A] -> \[B] -> \[C] 三個版本: -* 可能 [C] 版本你發現 commit 錯了,必須刪除這一版本所有變更 -* 你可能 commit 了之後才發現 [C] 這個版本其實只有測試程式碼,你也想刪除他 +* 可能 \[C] 版本你發現 commit 錯了,必須刪除這一版本所有變更 +* 你可能 commit 了之後才發現 \[C] 這個版本其實只有測試程式碼,你也想刪除他 * 其中有些版本的紀錄訊息有錯字,你想修改訊息文字,但不影響檔案的變更歷程 -* 你可能想把這些版本的 commit 順序調整為 [A] -> [C] -> [B],讓版本演進更有邏輯性 -* 你發現 [B] 這個版本忘了加入一個重要的檔案就 commit 了,你想事後補救這次變更 +* 你可能想把這些版本的 commit 順序調整為 \[A] -> \[C] -> \[B],讓版本演進更有邏輯性 +* 你發現 \[B] 這個版本忘了加入一個重要的檔案就 commit 了,你想事後補救這次變更 * 在你打算「分享」分支出去時,發現了程式碼有瑕疵,你可以修改完後再分享出去 -修正 commit 歷史紀錄的注意事項 ------------------------------ +## 修正 commit 歷史紀錄的注意事項 Git 保留了「修改版本歷史紀錄」的機制,主要是希望你能在「自我控管版本」到了一定程度後,自己整理一下版本紀錄的各種資訊,好讓你將版本「發布」出去後,讓其他人能夠更清楚的理解你對這些版本到底做了哪些修改。 @@ -51,28 +46,29 @@ Git 保留了「修改版本歷史紀錄」的機制,主要是希望你能在 * 你可以任意修改某個支線上的版本,只要你還沒「分享」給其他人 * **當你「分享」特定分支給其他人之後,這些「已分享」的版本歷史紀錄就別再改了!** -準備本日練習用的版本庫 ----------------------- +## 準備本日練習用的版本庫 之前我們曾在【第 04 天:常用的 Git 版本控管指令】學過 `git reset` 的用法,主要用來 **重置目前的工作目錄**。不過,相同的指令,也可以用來修正版本歷史紀錄。 在開始說明前,我們一樣先用以下指令建立一個練習用的工作目錄與本地儲存庫: - mkdir git-reset-demo - cd git-reset-demo - git init +```sh +mkdir git-reset-demo +cd git-reset-demo +git init - echo. > a.txt - git add . - git commit -m "Initial commit (a.txt created)" +echo. > a.txt +git add . +git commit -m "Initial commit (a.txt created)" - echo 1 > a.txt - git add . - git commit -m "Update a.txt!" +echo 1 > a.txt +git add . +git commit -m "Update a.txt!" - echo 1 > b.txt - git add . - git commit -m "Add b.txt!" +echo 1 > b.txt +git add . +git commit -m "Add b.txt!" +``` ![image](figures/18/01.png) @@ -80,17 +76,19 @@ Git 保留了「修改版本歷史紀錄」的機制,主要是希望你能在 ![image](figures/18/02.png) - -刪除最近一次的版本 -------------------- +## 刪除最近一次的版本 我們參考上圖,用文字表達這三個版本的順序如下: - [83a841] > [0576e0] > [aef2a5] +```txt +[83a841] > [0576e0] > [aef2a5] +``` 現在,我想把最後一個版本刪除,變成: - [83a841] > [0576e0] +```txt +[83a841] > [0576e0] +``` 那麼,你可以執行 `git reset --hard "HEAD^"` 即可刪除 `HEAD` 這個版本: **請注意**:在「命令提示字元下」 `^` 是特殊符號,所以必須用雙引號括起來! @@ -99,12 +97,11 @@ Git 保留了「修改版本歷史紀錄」的機制,主要是希望你能在 此時你可以看見,原本的最新版被刪除了,那是因為剛剛我們執行 `git reset --hard "HEAD^"` 這個動作,把 `HEAD` 指向的位址改到了前一個版本 ( `HEAD^` ),所以你打 `git log` 就看不到這個版本了。 -事實上,原本你感覺被刪除的版本,其實一直儲存在 Git 的物件儲存區(object storage)裡,也就是這筆資料一直躺在 `.git\objects\` 目錄下。我們還是可以用 `git show 83a841` 取得該版本 ( 即 commit 物件 ) 的詳細資料: +事實上,原本你感覺被刪除的版本,其實一直儲存在 Git 的物件儲存區 (object storage) 裡,也就是這筆資料一直躺在 `.git\objects\` 目錄下。我們還是可以用 `git show aef2a5` 取得該版本 (即 commit 物件) 的詳細資料: ![image](figures/18/04.png) -刪除最近一次的版本,但保留最後一次的變更 ------------------------------------- +## 刪除最近一次的版本,但保留最後一次的變更 還記得嗎?無論你對 Git 儲存庫做了什麼事,都是可以還原的,只要執行 `git reset --hard ORIG_HEAD` 即可。 @@ -116,8 +113,7 @@ Git 保留了「修改版本歷史紀錄」的機制,主要是希望你能在 這代表著,你可以保留最後一次的變更,再加上一些變更後,重新執行 `git commit` 一次,並重新設定一個新的紀錄訊息。 -重新提交一次最後一個版本 (即 `HEAD` 版本) ------------------------------------------ +## 重新提交一次最後一個版本 (即 `HEAD` 版本) 如果你發現不小心執行了 `git commit` 動作,但還有些檔案忘了加進去 (`git add [filepath]`) 或只是紀錄訊息寫錯,想重新補上的話,直接執行 `git commit --amend` 即可。這個動作,會把目前紀錄在索引中的變更檔案,全部添加到當前最新版之中,並且要求你修改原本的紀錄訊息。 @@ -129,38 +125,34 @@ Git 保留了「修改版本歷史紀錄」的機制,主要是希望你能在 我把紀錄訊息修改成以下文字,並且存檔後退出,版本就會建立完成: - Add b.txt! - Add c.txt! +```txt +Add b.txt! +Add c.txt! +``` 執行的結果如下,但最值得注意的是,最新版的 `HEAD` 已經是完全不同的 commit 物件了,所以用 `git log` 所看到的 commit 物件絕對名稱跟之前已經不一樣了。 ![image](figures/18/08.png) -今日小結 -------- +## 今日小結 -今天簡單的學到如何對【最新版】(`HEAD`)進行版本的變更,大多用在不小心 `git commit` 錯的情況,事實上還會有更多調整版本歷史紀錄的方式,這些會在之後的文章中出現。 +今天簡單的學到如何對【最新版】(`HEAD`) 進行版本的變更,大多用在不小心 `git commit` 錯的情況,事實上還會有更多調整版本歷史紀錄的方式,這些會在之後的文章中出現。 我重新整理一下本日學到的 Git 指令與參數: * git reset --hard "HEAD^" * git reset --soft "HEAD^" -* git reset --hard ORIG_HEAD +* git reset --hard ORIG\_HEAD * git commit --amend -參考連結 -------- +## 參考連結 * [git-reset(1) Manual Page](https://www.kernel.org/pub/software/scm/git/docs/git-reset.html) +--- - - -------- * [回目錄](README.md) * [前一天:關於合併的基本觀念與使用方式](17.md) * [下一天:設定 .gitignore 忽略清單](19.md) -------- - - +--- diff --git a/zh-tw/figures/18/04.png b/zh-tw/figures/18/04.png index a0772595123e8c5e67841c09770daa8c3a1d16c0..600febf4925e232b2b0eee44da7c39b4e133e3cc 100644 GIT binary patch literal 6361 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 XPCCvkH3xo^CSr2a;zsFj_n-d{phJqr