[Git101] 版本控制


Posted by yymarlerr on 2021-04-16

幫你做版本控制的程式

什麼是版本控制/為什麼使用版本控制

  • 用來管理不同版本的同個檔案,優點:可以查看修改的歷史紀錄。
  • 同個檔案可以有不同的分支(branch),分支也可互相合併,適合團隊中使用。
  • 概念如下:
  1. 需要新版本即開資料夾(裡面檔案不一定全部都是更新版)
  2. 不想被加入版本控制:不要加入資料夾
  3. 用亂數當資料夾名稱避免版本號衝突(當有兩位使用者在同時新增檔案時,如果用流水號,可能會新增到相同檔案名稱的資料夾)
  4. 知道最新版本:用一個檔案來存
  5. 知道歷史紀錄:用一個檔案來存

如何安裝 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?

有別於一條線式的開發模式,用分支可以讓開發者在平行時空裡各做各的事情,最後再將結果合併在一起。這樣的優點是,若分支出問題時,不會互相影響,

  • 一條線式開發
    Imgur

  • 分支式開發

可以同時開發新功能、作 bug fix
Imgur

怎麼實作 branch?

用資料夾來舉例:

  1. 建一個 main 資料夾,然後裡面新增子資料夾 commit 1 & commit
  2. 再複製 main 並建一個資料夾叫做 new ,這時new 資料夾裡面也會有子資料夾 commit 1 & commit 2
  3. 繼續在 new 裡面新增 new commit 3 & new commit 4
  4. 最後將 new commit 3 & new commit 4 移過去到 main 資料夾裡面,即可合併 main 和 new。
  5. 若 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查看哪個檔案有 conflict
  • vim <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 上?

  1. 點右上角 + new repositoy
  2. 輸入 repository 名稱
  3. 去 terminal 輸入 git remote add origin http://github.com/blahblahblah
    • origin 代表 github 遠端repository的代號
    • 網址為 github 提供
  4. 去終端機輸入 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 時可用
  1. 點 clone or download
  2. 複製 clone with SSH 的網址 git clone,到 terminal 輸入 git clone <網址>
  • 下載後不能 push 回到遠端上,因為是別人的 repository,可以先用 fork 將 repository 下載到自己的帳號,再 clone 一次,即可和遠端同步。

Github flow

建議該怎麼管理專案的 branch

  1. Create a branch on terminal
  2. git push origin <branch name>
  3. Creat new pull request
    • 提供介面合併檔案;優點為可清楚看到檔案新增了什麼
    • 若在這個階段重新從 local 端 push 上來,會直接更新到 pr 那個頁面
  4. Click Merge pull request
  5. Delete the branch
  6. git pull origin master
  7. 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,從裡面拉出來用









Related Posts

DOM - 事件傳遞機制

DOM - 事件傳遞機制

JAVA筆記_集合物件, 泛型, 序列化

JAVA筆記_集合物件, 泛型, 序列化

[ 筆記 ] 網路基礎 - HTTP, Request, Response

[ 筆記 ] 網路基礎 - HTTP, Request, Response


Comments