使用 Git 來管理程式碼(上)
關於我的程式碼倉庫
如果你關注我的 Github,那你應該知道,我最近新建了一個倉庫,專門用來存放我平常在OJ上刷的題的程式碼,地址在這裡:
https://github.com/dong628/OhMyCodes(求star啊啊啊)
這個倉庫使用 MIT 協議開源,意味著任何人都可以複製、修改、分發(商業或非商業),並且不需要使用相同的協議。
目前位置,一共有67次 commit ,記錄著我從2020年5月的刷題記錄。
為什麼使用 Git
我每天上午會去學校機房刷題,下午有時間會接著刷,於是,在這兩個地方管理程式碼就顯得很麻煩。
一個樸素的策略是,用一個可移動儲存介質(比如U盤)在家和學校之間拷貝程式碼。U盤,機房和家中的電腦同時存放著一份我刷過所有題的程式碼,每次我在家或學校更新,都將最新的版本拷貝到U盤上,再帶到另一個地方更新那邊的檔案。
但是這樣做有許多問題:
- 用U盤一個個拷貝太麻煩了
- 萬一哪天存著最新版本的裝置壞了怎麼辦,難道要用另一個U盤備份?
- 哪天我程式碼寫錯了,沒有辦法退回到上一個版本
插上U盤 -> 拖動滑鼠拷貝檔案 -> 拔出U盤 這個操作太不(mei)優(you)雅(bi)了(ge)
Linux 的創始人——Linus Torvalds 早就意識到了這個問題,於是用一個星期的時間寫出了 Git,並且把它用在了 Linux 核心原始碼的版本控制上,真正的詮釋了那句他自己說的千古名句:
Talk is cheap, show me the code! --Linus Torvalds
說來這是個版本控制系統,但其實我使用它回退版本的次數非常少,更多的是用來配合 Github 來遠端協作的。
所以說,如果沒有更復雜的需求的話,Git 需要記的命令是非常少的,更重要的是對這個系統的理解。
再說,作為一個學計算機的,Git 也是未來做專案時必備的生存技能。
安裝
本來,我認為幾乎所有的 Linux 發行版會自帶 Git,但事實上很多發行版並不會自帶。
但是,我相信絕大部分發行版的 軟體倉庫/預設軟體源 中都會有git,所以你可以用自己發行版的包管理器來安裝 Git。
如果你是 Windows,那麼 快去用 Linux ! 可以在 https://git-scm.com/download/windows 這個地址下載。
Mac 可以在 https://git-scm.com/download/mac 這裡下載。
基本命令
由於 Windows 下自帶的那個 Git GUI 對我來說就是個廢物,作為每天用命令列 Git 的我上手後根本不知道如何使用,說是 GUI ,但對新手非常不友好。
再加上 Windows 下的 Git Bash 是 Windows 下 Bash 模擬器的典範,所以這個系列只有命令列,沒有 GUI。
使用者配置
即使 Git 只有你一個人離線使用,你也要首先告訴 Git 你是誰,所以就有了下面這兩句:
git config --global user.name "dong628" #名稱
git config --global user.email [email protected] #郵箱
建立一個倉庫
倉庫(Repository),可以看作是一個由 Git 管理的資料夾,有了倉庫,Git 就可以跟蹤其中的檔案,記錄版本變化。
要想把一個資料夾變成一個 Git 倉庫,只需要在這個資料夾中鍵入以下命令:
git init
在 Windows 下,如果打開了顯示隱藏檔案,那麼在那個資料夾中應該可以看到 .git 目錄,這是 Git 用來存放歷史版本的地方。對於 GNU/Linux 系統,可以使用 ls -a
命令查詢到這個資料夾
當你建立好倉庫後,使用 git status
命令可以檢視這個倉庫的狀態
新增追蹤檔案
並不是資料夾中所有的檔案都要被 Git 跟蹤。事實上,即使你在這個資料夾中寫了一堆檔案,如果不執行任何命令,Git 是不會注意到這些檔案的任何變化的,倉庫也會是空空如也。
當這個資料夾中新增了檔案,Git 就會檢測到這個檔案沒有被跟蹤,從而在執行 git status
命令後給出這樣的提示:
就像這段文字的提示一樣, git add
命令主要有兩個作用:
- 將未跟蹤的檔案新增跟蹤
- 將工作區的修改提交到暫存區
其實1和2本質上是一樣的,為此,要先來介紹一下 Git 中的暫存區域。
暫存區,顧名思義,暫時存放檔案的區域。一個 Git 倉庫中有三個區域,分別時工作區、暫存區、版本庫。其中,只有版本庫存放了所有版本,工作區和暫存區都是隻會存放一個版本的。其中,暫存區可以看作是一個存放著所有你 add 過的檔案,並且可以隨時把這些檔案一次性打包,作為一個新版本放入版本庫的。
所以,當執行了 git add <檔名>
後,執行 git status
就會有這樣的輸出:
可以看到,檔案已經被 Git 追蹤,如果不信,可以修改這個檔案,再執行 git status
試試:
可以看到,Git 已經檢測到了檔案的更改。
當工作區和暫存區出現偏離
當提交到暫存區的檔案在工作去被修改時,Git 會檢測到檔案被修改了,並且給使用者兩個選擇
- 將工作區的新檔案提交到暫存區 (
git add
命令) - 將暫存區的檔案恢復到工作區 (
git restore
命令)
如果工作區的這個修改是你不小心改掉了一些什麼東西,那就可以使用第二條命令來恢復工作區。
如果這是一個正確的改動,並且你想要更新暫存區裡的檔案,那麼可以使用第一條命令。
但其實這兩個命令都是具有危險性的,因為它們都會刪除一些版本呢,那麼有沒有什麼方法可以同時保留這兩個版本呢?
將暫存區的檔案提交到倉庫
當你認為暫存區裡的這些檔案已經是一個成型的版本,需要儲存起來以便回溯時,就需要將暫存區中的檔案打包成一個版本,放入版本倉庫。
當遇到上面的情況,也就是工作區和暫存區發生了偏離,Git 只告訴你可以儲存一個,但沒有告訴你兩個都要的方法。
為此,我們可以使用下面的命令:
git commit -m "<本次提交的註釋>"
git add test.cpp
這樣,我們成功地將暫存區裡的版本提交到了版本庫中,為此,你可以使用 git log
來檢視版本庫中存放的版本資料:
-> to be continued...