
今天跟大家分享一個比較有意思的網站 - Oh shit, git!。
這個網站整理了一些 Git 新手在使用 Git 時常會遇到的各種突發狀況,并貼心的給出了應對方案。
我大緻瞄了一眼,文章裡面提到的一些問題,大部分新手确實會經常遇到,是以我在這裡簡單的整理一下,把這些應對方案分享給大家。
你們可以把這篇文章馬住或分享給同僚,以備不時之需,畢竟不怕神對手,就怕豬隊友~
下面切入正題,跟大家聊下在 Git 的使用過程中,經常會出現哪些問題,以及應該對應使用哪種解決方案。
注:為了使場景描述更加生動,是以加入了新手女神與進階舔狗兩個角色來配合講解女神:哎呀,剛剛有個地方搞錯了,怎麼重新來過呢?
女神莫慌,Git 的牛逼之處,在于它自帶時光機效果,能讓你在項目的曆史代碼中任意穿梭。
如果項目的某一處地方它自己不小心壞掉了,不妨試下下面的這行指令:
$ git reflog
這條指令能列出你在 Git 上的所有操作記錄,你隻要找到
[email protected]{index}
前面所對應的操作索引,并使用下面指令即可:
$ git reset [email protected]{index}
注:使用時需将 [email protected]{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 [email protected]{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/questions/tagged/git
GitHubDaily - 挖掘開源的價值。
- 微網誌: @GitHubDaily
- 公衆号:GitHubDaily