當前位置: 華文問答 > 數位

如何優雅地使用Git?

2020-01-25數位

之前看過一個特別有趣的網站 - Oh shit, git!

這個網站上面整理了一些 Git 新手在使用 Git 時常會遇到的各種突發狀況,並貼心的給出了應對方案。

我大致瞄了一眼,文章裏面提到的一些問題,大部份新手確實會經常遇到,我簡單轉譯了一下,希望對你有所幫助。

註:為了使場景描述更加生動,因此加入了新手女神與高級舔狗兩個角色來配合講解

女神:哎呀,剛剛有個地方搞錯了,怎麽重新來過呢?

女神莫慌,Git 的牛逼之處,在於它內建時光機效果,能讓你在計畫的歷史程式碼中任意穿梭。

如果計畫的某一處地方它自己不小心壞掉了,不妨試下下面的這行命令:

$ git reflog

這條命令能列出你在 Git 上的所有操作記錄,你只要找到 HEAD@{index} 前面所對應的操作索引,並使用下面命令即可:

$ git reset HEAD@{index}

註:使用時需將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 計畫。