1. 程式人生 > >6種常見的Git錯誤以及解決的辦法

6種常見的Git錯誤以及解決的辦法

我們都會犯錯誤,尤其是在使用像Git這樣複雜的東西時。如果你是Git的新手,可以學習如何在命令列上開始使用Git。下面介紹如何解決六個最常見的Git錯誤。

1. 最後一次程式碼提交時有拼寫錯誤

經過幾個小時的編碼後,拼寫錯誤很容易帶到你的提交訊息裡面。 幸運的是,有一個簡單的解決方案。

git commit --amend

這會開啟編輯器,並允許你更改最後一次提交訊息。 沒有人知道你把“addded”單詞多加了一個字母“d”的拼寫錯誤。

2. 忘了在最後一次提交中新增檔案

另一個常見的Git陷阱是過早提交。 你少添加了一個檔案,忘了儲存它,或者需要對最後一次提交做一個小改動才有意義。 --amend

再次成為你的朋友。

新增錯過的檔案然後執行該命令。

git add missed-file.txt
git commit --amend

此時,可以修改提交訊息,也可以只儲存它以使其保持不變。

3. 在程式碼庫中添加了一個不想要的檔案

但如果你的做法的正好相反呢?如果添加了不想提交的檔案怎麼辦?一個環境檔案,一個構建目錄,或者是一張圖片不小心儲存到錯誤的目錄?這都是可以解決的。
如果你所做的只是對檔案進行了stage操作放入了暫存區,還沒有commit原生代碼倉庫,那麼只需重新設定暫存區的檔案即可:

git reset /assets/img/misty-and-pepper.jpg

如果已經提交了更改,那麼需要先執行一個額外的步驟:

git reset --soft HEAD~1
git reset /assets/img/misty-and-pepper.jpg
rm /assets/img/misty-and-pepper.jpg
git commit

這將撤銷提交,刪除圖片檔案,然後在其位置新增一個新的提交。

4. 提交了所有的修改到 master 分支

你正在開發一個新特性,在匆忙之中,忘記為它開啟一個新的分支。已經提交了一堆檔案,現在它們都位於主分支(master)上。幸運的是,GitLab可以防止你直接推到master 主分支上。因此,我們可以使用以下三個命令將所有這些更改回滾到一個新分支:

Note
確保首先commit或stash更改,否則所有更改都將丟失!

git branch future-brunch
git reset HEAD~ --hard
git checkout future-brunch

這會建立一個新分支,然後將主分支回滾到進行更改之前的位置,然後最終檢出新分支,並保留所有先前的更改。

5. 分支名稱出現了拼寫錯誤

對錯誤分支進行重新命名的方式與用mv命令重新命名檔案的方式類似:將它移動到一個新的位置,並使用正確的名稱。例如把future-brunch分支名稱更改為feature-branch。

git branch -m future-brunch feature-branch

如果已經push了這個分支到遠端程式碼倉庫,那麼還需要一些額外的步驟。需要從遠端程式碼倉庫刪除舊的分支,將新分支 push 上去:

git push origin --delete future-brunch
git push origin feature-branch

6. 重複操作

這個命令適用於一切都出錯的地方。 當從Stack Overflow複製貼上一個太多的解決方案時,
程式碼倉庫處於比你一開始時更糟糕的狀態。
git reflog向你顯示所有的事情列表。然後,它允許你使用Git的神奇時間旅行技巧,回退到過去的任何時間點。這裡應該指出,這是最後的手段,不應該輕易使用。要得到這個列表,輸入:

git reflog

我們採取的每一步,我們所做的每一個動作,Git都有記錄。 在我們的專案上執行該命令得到以下列表:

3ff8691 (HEAD -> feature-branch) [email protected]{0}: Branch: renamed refs/heads/future-brunch to refs/heads/feature-branch
3ff8691 (HEAD -> feature-branch) [email protected]{2}: checkout: moving from master to future-brunch
2b7e508 (master) [email protected]{3}: reset: moving to HEAD~
3ff8691 (HEAD -> feature-branch) [email protected]{4}: commit: Adds the client logo
2b7e508 (master) [email protected]{5}: reset: moving to HEAD~1
37a632d [email protected]{6}: commit: Adds the client logo to the project
2b7e508 (master) [email protected]{7}: reset: moving to HEAD
2b7e508 (master) [email protected]{8}: commit (amend): Added contributing info to the site
dfa27a2 [email protected]{9}: reset: moving to HEAD
dfa27a2 [email protected]{10}: commit (amend): Added contributing info to the site
700d0b5 [email protected]{11}: commit: Addded contributing info to the site
efba795 [email protected]{12}: commit (initial): Initial commit

記下最左邊的列,因為這是索引。 如果要返回歷史記錄中的任何一點,請執行以下命令,將{index}替換為該引用,例如dfa27a2

git reset [email protected]{index}