Git提供了多種修復你開發過程中的錯誤的方法. 方法的選擇取決于你的情況: 包含有錯誤的文件是否提交了(commited); 如果你把它已經提交了, 那么你是否把有錯誤的提交已與其它人共享這也很重要。
## 修復未提交文件中的錯誤(重置)
如果你現在的工作目錄(work tree)里搞的一團亂麻, 但是你現在還沒有把它們提交; 你可以通過下面的命令, 讓工作目錄回到上次提交時的狀態(last committed state):
~~~
$ git reset --hard HEAD
~~~
這條件命令會把你工作目錄中所有未提交的內容清空(當然這不包括未置于版控制下的文件 untracked files). 從另一種角度來說, 這會讓"git diff" 和"git diff --cached"命令的顯示法都變為空.
如果你只是要恢復一個文件,如"hello.rb", 你就要使用?[git checkout](http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html)
~~~
$ git checkout -- hello.rb
~~~
這條命令把hello.rb從HEAD中簽出并且把它恢復成未修改時的樣子。
> 譯者:上面二行和原文有出入,經驗證是原文有誤,所以我據正確的重寫了。
## 修復已提交文件中的錯誤
如果你已經做了一個提交(commit),但是你馬上后悔了, 這里有兩種截然不同的方法去處理這個問題:
1. 創建一個新的提交(commit), 在新的提交里撤消老的提交所作的修改. 這種作法在你已經把代碼發布的情況下十分正確。
2 你也可以去修改你的老提交(old commit). 但是如果你已經把代碼發布了,那么千萬別這么做; git不會處理項目的歷史會改變的情況,如果一個分支的歷史被改變了那以后就不能正常的合并。
### 創建新提交來修復錯誤
創建一個新的,撤消(revert)了前期修改的提交(commit)是很容易的; 只要把出錯的提交(commit)的名字(reference)做為參數傳給命令:?[git revert](http://www.kernel.org/pub/software/scm/git/docs/git-revert.html)就可以了; 下面這條命令就演示了如何撤消最近的一個提交:
~~~
$ git revert HEAD
~~~
這樣就創建了一個撤消了上次提交(HEAD)的新提交, 你就有機會來修改新提交(new commit)里的提交注釋信息。
你也可撤消更早期的修改, 下面這條命令就是撤消“上上次”(next-to-last)的提交:
~~~
$ git revert HEAD^
~~~
在這種情況下,git嘗試去撤消老的提交,然后留下完整的老提交前的版本. 如果你最近的修改和要撤消的修改有重疊(overlap),那么就會被要求手工解決沖突(conflicts), 就像解決合并(merge)時出現的沖突一樣。
> 譯者注: git revert 其實不會直接創建一個提交(commit), 把撤消后的文件內容放到索引(index)里,你需要再執行git commit命令,它們才會成為真正的提交(commit)。
### 修改提交來修復錯誤
如果你剛剛做了某個提交(commit), 但是你又想馬上修改這個提交;?[git commit](http://www.kernel.org/pub/software/scm/git/docs/git-commit.html)?現在支持一個叫**--amend**的參數,它能讓你修改剛才的這個提交(HEAD commit)。 這項機制能讓你在代碼發布前,添加一些新的文件或是修改你的提交注釋(commit message)。
如果你在老提交(older commit)里發現一個錯誤, 但是現在還沒有發布到代碼服務器上. 你可以使用?[git rebase](http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html)命令的交互模式, "git rebase -i"會提示你在編輯中做相關的修改. 這樣其實就是讓你在rebase的過程來修改提交。
- 1. 介紹
- 歡迎使用Git
- GIT對象模型
- Git目錄 與 工作目錄
- Git索引
- 2. 第一步
- 安裝Git
- 安裝與初始化
- 3. 基本用法
- 獲得一個Git倉庫
- 正常的工作流程
- 分支與合并@基礎
- 查看歷史 -Git日志
- 比較提交 - Git Diff
- 分布式的工作流程
- Git標簽
- 4. 中級技能
- 忽略某些文件
- rebase
- 交互式rebase
- 交互式添加
- 儲藏
- Git樹名
- 追蹤分支
- 使用Git Grep進行搜索
- Git的撤消操作 - 重置, 簽出 和 撤消
- 維護Git
- 建立一個公共倉庫
- 建立一個私有倉庫
- 5. 高級技能
- 創建新的空分支
- 修改你的歷史
- 高級分支與合并
- 查找問題的利器 - Git Bisect
- 查找問題的利器 - Git Blame
- Git和Email
- 定制Git
- Git Hooks
- 找回丟失的對象
- 子模塊
- 6. Git生態體系
- Git 與之 Windows
- 使用Git進行系統部署
- 與 Subversion 集成
- 從其他代碼管理工具遷移到Git
- 圖形化的Git
- Git倉庫托管
- Git的其它用法
- Git的腳本支持
- Git 與編輯器
- 7. 原理解析
- Git是如何存儲對象的
- 查看Git對象
- Git引用
- Git索引
- 打包文件
- 更底層的Git
- 傳輸協議
- 術語表