-
1. 開始
-
2. Git 基礎
- 2.1 取得一個 Git 倉儲
- 2.2 紀錄變更到版本庫中
- 2.3 檢視提交的歷史記錄
- 2.4 復原
- 2.5 與遠端協同工作
- 2.6 標籤
- 2.7 Git Aliases
- 2.8 總結
-
3. 使用 Git 分支
-
4. 伺服器上的 Git
- 4.1 通訊協定
- 4.2 在伺服器上佈署 Git
- 4.3 產生你的 SSH 公鑰
- 4.4 設定伺服器
- 4.5 Git 常駐程式
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第3方 Git 託管方案
- 4.10 總結
-
5. 分散式的 Git
-
6. GitHub
- 6.1 建立帳戶及設定
- 6.2 參與一個專案
- 6.3 維護專案
- 6.4 Managing an organization
- 6.5 Scripting GitHub
- 6.6 總結
-
7. Git 工具
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 總結
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 Summary
-
A1. 附錄 A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Summary
-
A2. 附錄 B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. 附錄 C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
2.4 Git 基礎 - 復原
復原
在任何一個過程中,你都可能想要復原某些內容, 在這裡我們會回顧一些基本的工具用來復原你做過的修改內容; 小心!因為復原操作不是永遠都可逆的, 這是少數在使用 Git 時,執行錯誤的動作會遺失資料的情況。
一個常見的復原操作發生在當你太早提交(commit),接著才發現忘了加入某些檔案,或者寫錯了提交訊息;
如果你想要重新提交,你可以在提交命令上使用 --amend
選項:
$ git commit --amend
這個命令會再次把預存區(staging area)拿來提交, 如果自從上次提交以來你沒有做過任何檔案修改(例如:在上一次提交後,馬上執行此命令),那麼整個快照看起來會與上次提交的一模一樣,唯一有可能更動的是提交訊息。
同樣用來提交訊息的文字編輯器會先啟動,並且已填好上一次提交的訊息內容; 你可以像往常一樣編輯這些訊息,接著它會覆蓋掉上一次的提交。
例如:如果你提交後才意識到你想要把某些忘記預存(stage)的修改也一併加入到上一個提交中,你可以這樣做:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
最終只會得到一個提交——第二次的提交取代了第一次提交的結果。
將已預存的檔案移出預存區
接下來的兩節會展示如何操作預存區和工作目錄中已修改的檔案;
用來顯示這二個區域狀態的命令也會好心地提示你如何做復原操作,
例如:假設你已經修改了二個檔案,並且想要分別提交它們,但是你卻意外地使用 git add *
把它們二個都預存了,
要如何將其中一個「移出預存區(unstage)」呢?
git status
命令提示你:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
在「Changes to be committed」文字正下方,說明了使用 git reset HEAD <file>...
將檔案移出預存區;
因此,讓我們依循該建議將 CONTRIBUTING.md
檔案移出預存區:
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
這個命令有一點奇怪,不過它的確可行;
CONTRIBUTING.md
檔案現在又回到了「修改」但「未預存(unstaged)」的狀態。
筆記
|
雖然 |
關於 git reset
命令,到目前為止所有你需要知道的就只有這個神奇用法;
我們將在 Reset Demystified 中深入了解 reset
更多的細節,包括「它可以做什麼」以及「如何操控它做一些真正有趣的事情」。
復原被修改的檔案
當你不想要保留 CONTRIBUTING.md
檔案的修改時該怎麼辦?
你如何才能輕易地復原它——將它還原到上次提交時的樣子(或最初克隆時、或當初放到工作目錄時的版本)?
很幸運的,git status
也告訴你該如何做;
在上一個範例的輸出中,有修改而未預存的內容長得像這樣:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
它相當明確地提示你如何捨棄工作目錄所做的修改, 讓我們跟著提示做:
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
你可以看到那些修改已經被還原了。
重要
|
你必需明瞭一件很重要的事: |
如果你仍然想保留那個檔案所做的修改,但是某個當下需要先復原檔案,我們將會在 [ch03-git-branching] 中介紹「收藏(stashing)」和「分支(branching)」,一般而言它們是比較好的做法。
切記,在 Git「已提交」的任何東西幾乎總是能夠被復原的,
即使是在被刪除的分支上曾經出現過的提交,或者因為 --amend
而被覆蓋掉的提交,它們都是可以被復原的(詳見 Data Recovery 以了解資料復原);
然而,從來沒被提交過的內容,失去後大概就沒辦法再救回來了。