之前看過一個特別有趣的網(wǎng)站 - Oh shit, git!
這個網(wǎng)站上面整理了一些 Git 新手在使用 Git 時常會遇到的各種突發(fā)狀況泛释,并貼心的給出了應(yīng)對方案滤愕。
我大致瞄了一眼,文章里面提到的一些問題怜校,大部分新手確實會經(jīng)常遇到间影,我簡單翻譯了一下,希望對你有所幫助茄茁。
注:為了使場景描述更加生動魂贬,因此加入了新手女神與高級舔狗兩個角色來配合講解
女神:哎呀,剛剛有個地方搞錯了裙顽,怎么重新來過呢付燥?
女神莫慌,Git 的牛逼之處愈犹,在于它自帶時光機效果键科,能讓你在項目的歷史代碼中任意穿梭。
如果項目的某一處地方它自己不小心壞掉了漩怎,不妨試下下面的這行命令:
$ git reflog
這條命令能列出你在 Git 上的所有操作記錄勋颖,你只要找到 HEAD@{index} 前面所對應(yīng)的操作索引,并使用下面命令即可:
$ git reset HEAD@{index}
注:使用時需將HEAD@{index}替換為對應(yīng)索引勋锤。
女神:想改個小東西饭玲,但代碼不小心提交(commit)了,這可咋整叁执?
這個簡單茄厘,首先,添加下當前已改動的代碼:
$ git add .
然后谈宛,運行下面這條命令次哈,它就會把你剛剛添加的代碼合并到最后一次提交上了:
$ git commit --amend
女神:哼!剛剛寫的提交歷史寫得不夠好吆录,我想重寫一下窑滞!
好的,還是上面提到過的那條代碼,運行一下葛假,就可以重寫提交歷史啦:
$ git commit --amend
女神:這下慘了障陶,我剛剛不小心把新分支的代碼提交到主分支上了!
女神別著急聊训,我們一步步來抱究,你先創(chuàng)建個新分支(some-new-branch-name):
$ git branch some-new-branch-name
然后把剛才的提交從主分支中移除:
$ git reset HEAD~ --hard
需要注意的是,上面的代碼只會切換到最后一條提交記錄上带斑,如果你已跑到其它提交記錄上怎么辦鼓寺?沒關(guān)系,你可以用 git reset HEAD@{number} 再跑回來勋磕。
等你跑回來之后妈候,我們再切換到新分支上:
$ git checkout some-new-branch-name
好了,完成啦挂滓,現(xiàn)在主分支干干凈凈苦银,剛剛不小心提交的代碼也被移到新分支上了。
需要注意的是赶站,上面的代碼只對本地倉庫有效幔虏,如果你已經(jīng)把代碼提交到遠程倉庫上,那就得跟隊友商量下解決方案了贝椿。
啥想括?我就是你隊友?這可真讓我受寵若驚?? 不過沒事烙博,等下我?guī)湍阍诰€上主分支上 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 后啥都沒有肝陪?
遇到這種情況驳庭,應(yīng)該是文件沒有加入到暫存區(qū)的緣故。解決方案很簡單,咱們要么把文件加入到暫存區(qū)饲常,要么就直接使用下面這條命令:
$ git diff --staged
這樣蹲堂,就可以看到未存入暫存區(qū)文件的 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 備胎沉眶,從頭再來茸苇。
女神:好啦,我沒什么問題了沦寂,謝謝你哦~
不不不学密,這塊問題還多著呢?你打開下面這個網(wǎng)站传藏,聽我跟你細細道來…
https://stackoverflow.com/questions/tagged/git
歡迎關(guān)注公眾號:GitHubDaily腻暮,發(fā)現(xiàn)更多好玩的 GitHub 項目。
作者:GitHub Daily
鏈接:https://www.zhihu.com/question/20866683/answer/711725573
來源:知乎