之前看過一個特別有趣的網站 - Oh shit, git!
這個網站上面整理了一些 Git 新手在使用 Git 時常會遇到的各種突發狀況,並貼心的給出了應對方案。
我大致瞄了一眼,文章裏面提到的一些問題,大部份新手確實會經常遇到,我簡單轉譯了一下,希望對你有所幫助。
註:為了使場景描述更加生動,因此加入了新手女神與高級舔狗兩個角色來配合講解女神:哎呀,剛剛有個地方搞錯了,怎麽重新來過呢?
女神莫慌,Git 的牛逼之處,在於它內建時光機效果,能讓你在專案的歷史程式碼中任意穿梭。
如果專案的某一處地方它自己不小心壞掉了,不妨試下下面的這行命令:
$ git reflog
這條命令能列出你在 Git 上的所有操作記錄,你只要找到 HEAD@{index} 前面所對應的操作索引,並使用下面命令即可:
$ git reset HEAD@{index}
女神:想改個小東西,但程式碼不小心送出(commit)了,這可咋整?
這個簡單,首先,添加下當前已改動的程式碼:
$ git add .
然後,執行下面這條命令,它就會把你剛剛添加的程式碼合並到最後一次送出上了:
$ git commit --amend
女神:哼!剛剛寫的送出歷史寫得不夠好,我想重寫一下!
好的,還是上面提到過的那條程式碼,執行一下,就可以重寫送出歷史啦:
$ git commit --amend
女神:這下慘了,我剛剛不小心把新分支的程式碼送出到主分支上了!
女神別著急,我們一步步來,你先建立個新分支(some-new-branch-name):
$ git branch some-new-branch-name
然後把剛才的送出從主分支中移除:
$ git reset HEAD~ --hard
需要註意的是,上面的程式碼只會切換到最後一條送出記錄上,如果你已跑到其它送出記錄上怎麽辦?沒關系,你可以用 git reset HEAD@{number} 再跑回來。
等你跑回來之後,我們再切換到新分支上:
$ git checkout some-new-branch-name
好了,完成啦,現在主分支幹幹凈凈,剛剛不小心送出的程式碼也被移到新分支上了。
需要註意的是,上面的程式碼只對本地倉庫有效,如果你已經把程式碼送出到遠端倉庫上,那就得跟隊友商量下解決方案了。
啥?我就是你隊友?這可真讓我受寵若驚☺️ 不過沒事,等下我幫你線上上主分支上 reset 然後 push -f 一下就好啦~
女神:完蛋了,我把程式碼送出到錯誤的分支上了!
別怕別怕,有我在呢。
我們先撤銷最後一次送出,但保留變更程式碼:
$ git reset HEAD~ --soft
$ git stash
再切到你想要送出的正確分支(name-of-the-correct-branch)上,並把變更程式碼送出上去:
$ git checkout name-of-the-correct-branch
$ git stash pop
$ git add .
$ git commit -m "your message here"
OK,到這裏就搞定了。
如果想要逼格高點,也可以用 cherry-pick 這個命令來完成上面那些操作。具體的操作步驟如下。
首先,切換到正確的分支上:
$ git checkout name-of-the-correct-branch
然後使用 cherry-pick 來獲取最新一條送出記錄:
$ git cherry-pick master
最後再把主分支上那條送出錯誤的記錄刪除:
$ git checkout master
$ git reset HEAD~ —-hard
女神:咦?為啥我執行 diff 後啥都沒有?
遇到這種情況,應該是檔沒有加入到暫存區的緣故。解決方案很簡單,咱們要麽把檔加入到暫存區,要麽就直接使用下面這條命令:
$ git diff --staged
這樣,就可以看到未存入暫存區檔的 diff 效果啦。
女神:這專案怎麽這麽亂!好煩吶!我不玩了!
別氣別氣,別氣壞了身子就不好了,麽麽噠
如果本地程式碼倉庫把自己折騰得亂七八糟,不用怕,用下面這招,一擊必殺:
$ cd ..
$ sudo rm -r fucking-git-repo-dir
$ git clone https://some.github.url/fucking-git-repo-dir.git
$ cd fucking-git-repo-dir
是的,這就是備胎(線上倉庫)的強大之處,只要你備胎尚在,你就可以大大方方的把本地倉庫刪了,clone 備胎,從頭再來。
女神:好啦,我沒什麽問題了,謝謝你哦~
不不不,這塊問題還多著呢?你開啟下面這個網站,聽我跟你細細道來…
https:// stackoverflow.com/quest ions/tagged/git
歡迎關註公眾號:GitHubDaily,發現更多好玩的 GitHub 專案。