你的git專案不小心commit了別人的git該怎麼辦

前言

git是一項非常好用的版本控制工具,可是其背後的運作原理可是複雜得很,要如何用的好又是一門學問了。

有時候我們git化一個專案的時候,很有可能你使用的一些模組、library已經有被版本控制了,這個時候我們將整個資料夾git化之後很開心的就推上了自己的git repository去了

會發生什麼事情?

當你的同事將git專案clone下來之後繼續工作,直到他發現了某個重要的資料夾消失了,這位可憐的同事一頭霧水的開始去找git repository發現那個資料夾內根本是空的!!最後才發現自己的專案內還有另一個git存在

為何會這樣?

首先你必須要知道git的 子模組 (Submodules) 以下我引述git的文件

這裡有一個例子。假設你在開發一個網站,並提供 Atom 訂閱(Atom feeds)。你不想自己編寫產生 Atom 的程式,而是決定使用一個 Library。你可能必須從 CPAN install 或者 Ruby gem 之類的共用庫(shared library)將那段程式 include 進來,或者將原始程式碼複製到你的專案樹中。如果採用包含程式庫的辦法,那麼不管用什麼辦法都很難對這個程式庫做客製化(customize),部署它就更加困難了,因為你必須確保每個客戶都擁有那個程式庫。把程式碼包含到你自己的專案中帶來的問題是,當上游被修改時,任何你進行的客製化的修改都很難歸併(merge)。

來源

所以git偵測到資料夾內還有其他的git專案就會將他認定為submodule所以不會將他加進stage內被commit起來。

該如何解決

  • 加入submodule
  • 自己掌控 // 反正我只是要他現在被我加入整個git專案內

submodule教學就不在此討論,網路上就已經有很詳細的教學了

此時我們只要將資料夾內的.git資料夾刪除

rm -rf /project/example/.git

將資料夾從stage移除

git rm --cached /project/example

重新加入stage

git add --all

commit

git commit

如此一來我就將沒被commit的資料夾重新commit進我們的專案了