幫你做版本控制的程式
什麼是版本控制/為什麼使用版本控制
- 用來管理不同版本的同個檔案,優點:可以查看修改的歷史紀錄。
- 同個檔案可以有不同的分支(branch),分支也可互相合併,適合團隊中使用。
- 概念如下:
- 需要新版本即開資料夾(裡面檔案不一定全部都是更新版)
- 不想被加入版本控制:不要加入資料夾
- 用亂數當資料夾名稱避免版本號衝突(當有兩位使用者在同時新增檔案時,如果用流水號,可能會新增到相同檔案名稱的資料夾)
- 知道最新版本:用一個檔案來存
- 知道歷史紀錄:用一個檔案來存
如何安裝 Git
- Mac
打開 terminal,輸入 git-version,系統即會指引安裝
- Windows
點此安裝,安裝完輸入 git--version
即可知是否成功
Git 指令說明
git init
- 代表 initialize 的意思,即開始使用在這個資料夾使用 Git
ls -al
可以找到隱藏資料夾 <.git>rm -r .git
可以刪除版本控制功能
git status
版本控制狀態
git add
- 加入版本控制,狀態為 staged,已被加入版本控制(有被修改過但還沒正式建立新版本)
- untracked files ,代表沒有被加入(add)版本控制
- 若要從staged移回untracked flies:用
git rm --cached <file>
- 若要將所有檔案都加入版本控制:
git add .
git commit -m"<enter commit name>"
- 新建一個版本:輸入後,會開啟一個編輯器,跳出後會顯示 Aborting commit due to empty commit message. 代表 commit 沒有成功,因為 message 是空的故,先用 git commit -m "" (m 代表 message)
- 概念:新增 commit,就像是新增一個資料夾,資料夾名稱為 commit 編號,add 為新增檔案進去。
- git commit -am "“:將所有(am 代表 all) 修改過 的檔案加入 staged 區,再加入 commit 中。如果是新增的檔案則不適用。
git log
- 查看歷史紀錄
git log --online
可以顯示較短的歷史紀錄
git checkout
- 回到某一個版本的狀態
git checkout <commit name>
查看該版本狀態git checkout master
回到 master 這個 branch 的最新版本
.gitignore
- 不想被加入版本控制的檔案
touch .gitignore
建立檔案後,vim .gitignore
將不想要被版本控制的檔案(通常為使用者個人資料或作業系統的紀錄檔案)數入到到 <.gitignore> 裡面
基本指令複習
git init
讓資料夾有 Git 的功能touch .gitignore
將不想被加入版本控制的檔案寫進 .gitignore 裡面git add
將檔案加入版本控制把檔案加入暫時的資料夾
- 新建版本
git commit -m"enter commit name"
正式給予暫時的資料夾版本名稱
- 切換版本
git checkout <commit name>
去到某個資料夾底下
- 專案建立後,有新檔案要記得加入版本控制裡(資料夾裡)
- 接下來想要新版本的話,使用
git commit -am'<enter commit name>'
加入所有檔案(到新資料夾裡) git diff
可以查看這次版本跟上一個版本的差別
概念類似:
- 加入add版本控制 = 把東西放入temporary資料夾
- 新建版本
git commit
= 把temporary資料夾複製改名為版本名稱 - 切換版本
git checkout
= 去到某個資料夾底下
branch
為什麼需要 branch?
有別於一條線式的開發模式,用分支可以讓開發者在平行時空裡各做各的事情,最後再將結果合併在一起。這樣的優點是,若分支出問題時,不會互相影響,
一條線式開發
分支式開發
可以同時開發新功能、作 bug fix
怎麼實作 branch?
用資料夾來舉例:
- 建一個 main 資料夾,然後裡面新增子資料夾 commit 1 & commit
- 再複製 main 並建一個資料夾叫做 new ,這時new 資料夾裡面也會有子資料夾 commit 1 & commit 2
- 繼續在 new 裡面新增 new commit 3 & new commit 4
- 最後將 new commit 3 & new commit 4 移過去到 main 資料夾裡面,即可合併 main 和 new。
- 若 main 也有新增 commit 並且不小心和 new 改到同個檔案,那有可能會產生 conflicts。
git branch -v
- 可以看目前有哪一些 branch,
git init
後的所預設的 branch 名稱為 main (master)。
git branch
- 新增一個新的 branch
git branch <new branch name>
git branch -d
- 刪除 branch
git checkout
- 切換到不同的 branch
git checkout <branch name>
git merge
- 合併 branch
git merge <branch to be merged into>
- 若現在在 branch master,然後要將 master 和 yay 這個 branch 合併在一起,使用
git merge yay
則表表將 yay 這個 branch 合併到 master 裡面
conflict
開發者不小心改到同一個檔案時,git 在合併檔案時無法分辨哪一個才是正確的版本,這時 git 會跳出 conflict 的訊息。
如何解決 conflict?
git status
查看哪個檔案有 conflictvim <file with conflict>
修改內容,Head 下方顯示的內容為現在所在的 branch 的內容- 改完後
git commit -am "<enter commit name>"
Git & Github
Github
- Git 可以讓大家多人協作,大家共用的 git project 就是 repository (資料庫、倉庫),而 github 即是放 git repository 的地方。
- github 能夠讓 repository 具現化。
怎麼將 new repository 放到 github 上?
- 點右上角 + new repositoy
- 輸入 repository 名稱
- 去 terminal 輸入
git remote add origin http://github.com/blahblahblah
- origin 代表 github 遠端repository的代號
- 網址為 github 提供
- 去終端機輸入
git push -u origin master
- -u = set upstream 要將檔案推到哪
- master 是 branch 名稱,通常會 push branch 的預設值 master,這樣和遠端 branch 預設值的名稱相符
- origin 指 Github
指令介紹
git push origin <branch name>
- 將資料同步到 Github 上
git pull origin <branch name>
- 當其他人更動 repository 的資料時,須將最新版本 pull 到 local 端
- 當 pull 下來的 master 和原本的版本有 conflict 時,要手動 resolve conflict,解決完衝突再 push 回到 Github 上
- 也可以直接在 Github 上改資料
git clone
- 想要下載別人的 repository 時可用
- 點 clone or download
- 複製 clone with SSH 的網址 git clone,到 terminal 輸入
git clone <網址>
- 下載後不能 push 回到遠端上,因為是別人的 repository,可以先用 fork 將 repository 下載到自己的帳號,再 clone 一次,即可和遠端同步。
Github flow
建議該怎麼管理專案的 branch
- Create a branch on terminal
git push origin <branch name>
- Creat new pull request
- 提供介面合併檔案;優點為可清楚看到檔案新增了什麼
- 若在這個階段重新從 local 端 push 上來,會直接更新到 pr 那個頁面
- Click Merge pull request
- Delete the branch
git pull origin master
- Delete the branch which already being merged on terminal
Reference:
git 其他狀況
git commit --amend
- 改 commit message
git reset HEAD^
- commit 了,但想反悔時用
- HEAD 代表最新的 commit;^代表前一個,所以是回到上一個 commit 狀態
git reset HEAD^ --hard
:整個 commit 刪掉,檔案也不要了git reset HEAD^ --soft
:上一個 commit 不要,但檔案還是要git reset HEAD^ --mixed
:上一個 commit 不要,檔案被移除 staged 標記,變成 modified or untracked
git checkout --
- 還沒 commit,但改的檔案不想要了
- -- 後面可接
.
,代表全部檔案都要執行此指令
git branch -m
- 改 branch 名稱
git checkout
- 會自動把遠端的 branch 抓下來
git hook
- 發生某件事情的時候通知我,commit 或 push 之前檢查
- .git 資料夾裡有一個資料夾叫 hook,從裡面拉出來用