Git 是一種分散式版本控制系統,主要用於追蹤文件變更。讓多位開發者能夠協同工作,有效管理和記錄每次專案的修改。Git 允許每位開發者擁有整個版本庫的本地副本,開發者可以在無網路的情況下進行提交和查看歷史紀錄,提升了工作的靈活性。
透過 Git,開發者可以輕鬆追蹤文件變更,隨時回溯到過去的版本檢查或恢復檔案,助於錯誤檢查和修復。Git 的分支功能使開發者能夠在不影響主分支的情況下,創建和管理多個開發線,以便於開發新功能或修復 bug。此外,Git 提供了拉取請求和合併請求的機制,增強團隊的效率。以下提及常見的指令:
1. git add
:將變更加入暫存區,準備提交
用於將檔案的變更暫存到 Git 的暫存區。當在專案中進行檔案修改、添加或刪除時,這些變更並不會立 即保存到版本歷史中,而是需要通過 git add
指令選擇性地將它們加入暫存區。這樣可以讓開發者在 提交時,精確控制哪些變更會被納入到下一次的提交中。
再修改一個檔案後,如果只想提交這個檔案的變更,可以使用 git add <file-name>
來指定單一檔案。
若要一次性將所有修改的檔案都加入暫存區,可以使用git add .
,這會將當前目錄下的所有變更檔案加入暫 存區。
2. git commit
:提交變更,並將其保存到Git歷史中
git commit
指令用於將暫存區的變更正式提交到 Git 的版本歷史中。每次提交都會生成一個唯一的 hash 值,並與提交者的資訊、提交時間及提交訊息一起保存。提交訊息應簡潔明瞭,通常描述此次變更的目的,方便 日後查找。
在進行多次修改後,使用 git commit -m "Your commit message"
將暫存區的變更提交並附上說明。
對於需要更詳細提交訊息的情況,可以僅輸入 git commit
,然後在編輯器中撰寫詳細的提交訊息。
3. git push
:將本地的提交推送到遠端儲存庫
git push
用於將本地的提交推送到遠端儲存庫,確保遠端儲存庫的更新與本地保持同步,讓其他開發者能夠 看到最新的變更。
完成一個功能後,使用git push origin 將當前分支的變更推送到遠端。
如果是第一次推送新分支,可能需要使用git push -u origin 來將本地分支與遠端分支關 聯,以便於未來的推送與拉取操作。
4. git pull
:從遠端儲存庫拉取最新的變更並合併到本地分支
git pull
是用於從遠端儲存庫獲取最新的提交並將其合併到當前本地分支的指令。這是一個非常重要的操` 作,能夠確保你的本地環境始終保持更新,並與團隊的變更保持一致。
使用 git pull
確保當前分支是基於最新的遠端版本,以避免合併衝突。當其他團隊成員推送變更後,git pull
獲取這些更新,並即時將其合併到本地分支中。
5. git clone
:從遠端複製整個儲存庫到本地
用於從遠端儲存庫創建一個完整的本地副本,這包括了所有的版本歷史、分支和標籤。這是新開發者加入專案的 第一步,獲得整個專案的環境和歷史紀錄。
當你需要開始參與一個開源專案或團隊專案時,可以使用 git clone <repository-url>
將遠端儲存庫複 製到本地。
想要查看專案歷史訊息或過去被修改的檔案,這時候 Git 的進階指令便能派上用場。我們可以通過 Git 來檢視專案的歷史,查找隱藏的變更。
1. git log
- 檢查提交歷史
查看專案的提交歷史,顯示每次提交的 hash 值、提交者、日期和提交訊息。在 CTF 中,可能將關鍵的線索藏 於某次提交中,通過檢視提交訊息或過去的變更,可能會發現隱藏的資訊。
2. git show
- 查看具體提交內容
用來檢視某次提交的詳細變更內容,特別是用於查看最新提交的變更。不僅顯示提交訊息,還會顯示具體變更的 檔案內容。可以還原被刪除或修改的檔案,發現被隱藏的訊息。
3. git branch
與 git checkout
- 探索不同的分支
通過 git branch
查看專案中的所有分支,再用 git checkout <branch-name>
切換到具體的分支,可 能會發現不同分支中藏有資訊。
Lab_1 - Time Machine
將題目提供的 source 下載並且解壓縮後,使用 la -a
指令後會發現,有 .git
與 message.txt
,txt 檔打開後並不是 flag。那剩下 git 可以查看,使用 git log
指令查看紀錄,flag 被寫在紀錄中
Lab_2 - Commitment Issues
將題目提供的 source 下載並且解壓縮後,使用 la -a
指令後會發現跟上一題一樣有 .git
與 message.txt
,txt 檔給我們這個 TOP SECRET 線索。使用 git show HEAD
顯示當前分支的最新提交,會發現最新變動的地方有 flag
Lab_3 - Collaborative Development
再次使用相同招數 。不過這次有一個 flag.py,打開後的程式碼是git show HEAD
跟 git log
都不會成功
print("Printing the flag...")
那試試看有沒有分支 git branch
,現在我們在 main
,還有另外三個分支。
使用 git checkout [分支]
切換到另外三個分支,cat flag.py
可以看到 flag.py 這個檔案內容有變化。將三個分支的 flag 碎片拼起來就是答案惹
今天的練習就到這邊,以下是參考資料,請搭配服用:
Git 介紹與安裝
新手也能懂的 Git 教學
git-branch 教學
內文如有錯誤,還請不吝指教~