Oh shit, Git! 快速解決Git最常見問題
不得不承認,Git很難:把事情搞砸超容易,但要糾正錯誤,真他媽不可能(fucking impossible)。Git的官方文檔很操蛋,跟「先有雞還是先有蛋」一樣,本來你遇到問題,需要靠搜索來找出靈丹妙藥,但你壓根兒不知道關鍵詞是什麼,很多時候只能默默吞下這坨翔。
下面是我平時經常遇到的一些坑,我最後怎麼出來的,都寫在下面了,希望對你有幫助。
Oh shit,我犯了嚴重的錯誤,Git魔法怎麼讓我回到過去?
git reflogn
# 你會看到你過去在所有分支上做的所有事情!n# 每一個動作都有一個目錄編號:HEAD@{index}n# 找到你犯錯之前的那條記錄n
git reset HEAD@{index}n
# 這就是黑魔法,你已經回到犯錯之前了n
你可以用這個恢復誤刪的文件,或者,你做了一些修改,結果事情搞得一團糟,你可以秒回之前的狀態。如果你做了一次不爽的合併(merge),也可以這樣反悔,總之你能瞬間回到事情都還OK的時候。我經常用reflog, 多虧了很多很多很多很多人強烈要求,Git才有了這個功能,向他們致敬一百萬次!
Oh shit, 我提交了,但立馬想要做一個很小的修改!
# 沒問題,你直接先修改好,然後:n
git add . # 或添加特定文件ngit commit --amendn
# 在出現的窗口裡,編輯提交說明,或者維持不變n# 現在你最新的提交里已經包含了這個小修改n
這種事經常發生,當我提交後,再進行測試或格式檢查時,日了狗了(Fuck my life),我在一個等號後面少了一個空格⊙﹏⊙b...其實你也可以把小修改當作一次新的提交,然後用rebase -i把它們合到一塊兒,但上面的方法要快一百萬倍。
Oh shit, 剛才的提交說明寫錯了,怎麼修改?!
git commit --amendn
# 在出現的窗口裡編輯提交說明n
Git愚蠢的提交說明格式要求。
Oh shit, 我把應該提交給新分支的東西,提交給了主分支!
# 從當前狀態的主分支上新建一個分支n
git branch the-new-branch-namen
# 取消主分支上最新的一次提交n
git reset HEAD~ --hardngit checkout the-new-branch-namen
# 好了,你的提交現在就只在這個新分支上n
注意:如果你已經推送到了遠程分支,那一切都晚了。無盡的憂桑...另外,如果你已經胡亂做了其他事情,那第二行應該是git reset HEAD@{number},而不是HEAD~,以回到最初犯錯的時間和地點。很多很多人推薦了這個簡單的方法,感謝你們!
Oh shit, 我居然提交到了錯誤的分支上!
# 取消最新的提交,然後保留現場原狀n
git reset HEAD~ --softngit stashn
# 切換到正確的分支n
git checkout name-of-the-correct-branchngit stash popngit add . # 或添加特定文件ngit commit -m "你的提交說明"n
# 現在你已經提交到正確的分支上了n
遇到這種情況,很多人會說用cherry-pick(摘櫻桃),像下面這樣。不過你自己看吧,哪個舒服用哪個。
git checkout name-of-the-correct-branchn
# 把主分支上的最新提交摘過來,嘻嘻~~n
git cherry-pick mastern
# 再刪掉主分支上的最新提交n
git checkout masterngit reset HEAD~ --hardn
Oh shit, 我想用diff檢查差別,但什麼也沒有?
git diff --stagedn
如果你的文件已經添加到 ˉ_(ツ)_/ˉ(stage, 舞台?)上,diff命令不會發現任何不同,除非你加上--staged這個小旗子(flag)。這是特別設計的,不是bug,但第一次遇到可能覺得很怪異。
Fuck!草泥馬,我放棄,不玩了。。。
cd ..nsudo rm -r fucking-git-repo-dirngit clone https://some.github.url/fucking-git-repo-dir.gitncd fucking-git-repo-dirn
哼哼哈嘿,想回到過去,試著抱你在懷裡,羞怯的臉。。。
編譯自:
Oh, shit, git!
推薦閱讀:
※Git 初學者攻略
※Git由淺入深之存儲原理
※如何搭建私有可協作的 Git 伺服器
※一個奇怪的git問題,求大家幫忙分析一下?