最近剛換新公司,重新準備自己的開發環境。以前被圖形化介面慣壞了,日常操作都是在Sourcetree介面上滑鼠點一點就可以完事,只有遇到特殊的狀況才會找指令解。
現在的公司用的是TortoiseGit,除了解衝突、看分支差異比對方便以外,我反而寧可回歸下指令。
本篇就記錄一下在Git Bash上的入門操作,加深理解對這套工具的認識。
以方格子來說,每一段時間系統會自動幫你的文章做存檔,避免編輯資料遺失,並且以時間戳記作為版本命名。因此,我隨時都可以回復到以前暫存時間點,再次接續進行編輯。
Repository有被翻譯為程式庫、倉庫、儲存庫,具體一點可以是電腦上的某個資料夾。我們可以透過git來追蹤控管這個資料夾內所有文件的變化,就如同方格子對這篇文章的編輯時間點作紀錄一樣。
首先,建立一個git-demo的資料夾作為repository,並且切換路徑位置到資料夾內。
注意這時候還只是一般的資料夾(目錄),裡面什麼都沒有
執行git init
,讓git初始化該資料夾,變成repository。
git完成初始化的作業,產生預設的主分支(master),同時生成一個.git
資料夾,裡面存放所有控管的資料參考。
到這裡為止可以先歸納幾件事:
.git
檔,用來追蹤文件變化,如果被刪除就會變回一般資料夾.
開頭命名的檔案是隱藏檔,需要變更資料夾的顯示設定才能看到每一筆commit(提交紀錄)可以理解為一次的存檔,作為範例我會新增一個檔案,並且把它紀錄下來。不過在這之前可以先使用git status
查看當前狀態。
建立檔案後,再查看一下git status -s
,只看縮寫版的狀態。
執行git add .
將所有檔案加入至暫存區。其中.
代表當前資料夾,也可以各別指定加入的檔案名稱。
使用git commit
提交本次所有的異動,描述一下這次改了哪些東西。沒有帶-m
的指令會開啟編輯器。或者使用git commit -m "<提交訊息描述>"
編輯器預設使用vim,可以另外修改成自己習慣的編輯器
完成提交後可以再查看一下狀態,確認沒有新的異動。
在眾多圖形化介面,最方便的就是可以看到美美的線圖,尤其是越大型的專案,亂七八糟的紀錄完全是門藝術。透過指令同樣可以做到簡易版的呈現,明確來說是照自己的意思只顯示必要的項目,例如git log --oneline --graph -5
寫到這裡差不多要做結尾了,也許會有初學者問:github呢?
蠻意外的是,還真有不少人分不太清楚兩者間的關係,但在工作上一樣知道怎麼走完流程。有些公司用的是gitlab,一樣都是git開頭,難道不都是git嗎?
前面我們已經會在自己電腦建立git repository了,而且進行修改紀錄追蹤,直白一點說就是進行存檔。
今天如果需要多人協作,分別在不同的電腦一起編輯這個專案資料夾,就會需要在遠端的伺服器上也建立一個git repository,隨時與自己電腦的repository進行同步(push/pull),確保狀態的一致。
遠端伺服器常見的方案有Github、Gitlab、Bitbucket等等,除了可以在上面進行git相關功能操作外,額外多了權限控管、CI/CD流程等串接,因此跟純粹只有版本控制概念的git工具來說是兩回事。
git init
git status
git log
git add
git commit
工作上從遠端的master clone下來整包專案的一周後,git status
告訴我commit點落後400多項更新,於是照以往習慣定期同步遠端master。怪了,竟然連master 都可以pull失敗,究竟是發生了什麼事? 只好上stackoverflow找找可行的解法。
執行git pull origin master
error: cannot lock ref 'refs/remotes/origin/xxx': ref xxx is at OOO expected XXX
git gc --prune=now
git remote prune origin
git pull origin master
只知道遠端其實有很多沒砍掉的分支,大多數人處理方式也直接-f
(--force)了事,因此才會需要下prune
相關指令去更新這些分支的本地及遠端的ref
,也算是學到了一課。