標籤:

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問題,求大家幫忙分析一下?

TAG:Git | GitHub | 编程 |