2023年9月7日 星期四

【Git】GitHub 與 Git (筆記整理)


在 GitHub 建立儲存庫


建立沒有 commit 的空白 Git 儲存庫

  1. 切換到 Repositories 頁面
  2. 點選 New
  3. 不要勾選nitialize this repository with: 的 Add a README file ,Add .gitignore 、 Choose a license 都選擇 None
  4. 跟隨教學指令操作

建立有初始化版本的 Git 儲存庫

  1. 切換到 Repositories 頁面
  2. 點選 New
  3. 勾選nitialize this repository with: 的 Add a README file

與遠端儲存庫互動指令

  •  git clone 
    將遠端儲存庫複製到本地,並建立工作目錄與本地儲存庫(.git資料夾)
  • git pull
    將遠端儲存庫的最新版下載回來(透過 refspec 的定義,找來源參照規格的那些遠端分支,取回後放入目的參照規格的那些本地追蹤分支 (在不特別加參數的情況下,Git 默認情況下都是使用當origin生成最終存儲庫時,並使用origin的引用規格。)),下載內容包含完整的物件儲存庫( object storage ) (如同 git fetch ) 。並且將遠端分支合併到本地分支 (如同 git merge origin/master ,將 origin/master 遠端分之合併到 master 本地分支))。
    用例 : git pull origin master
  • git remote
    註冊遠端儲存庫(加入一個「最後儲存庫」)。可以註冊多個,不過很少這樣用,除非你想抓其他團隊成員的版本庫回來看內容。執行 git remote -v  會列出註冊在工作目錄裡的遠端儲存庫資訊。
    比如 :
    • git remote add origin https://github.com/...
      (這個 origin 名稱是在 Git 版本控管中慣用的預設遠端分支的參照名稱,主要目的是用來代表一個遠端儲存庫的 URL 位址。)
    • git remote add jquery https://github.com/...
        這些註冊進工作目錄的外部存儲庫設置信息,都存儲在.git\config設置檔中(可以用記事本打開修改),其內容示例如下:
[remote "origin"]
	url = https://github.com/doggy8088/sandbox-empty2.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[remote "jquery"]
	url = https://github.com/jquery/jquery.git
	fetch = +refs/heads/*:refs/remotes/jquery/*

這個[remote "origin"]決定的設定,名稱包含了最終存儲庫的代表origin,還有兩個重要的參數,分別是urlfetch這兩個,所代表的意思是:「最終存儲庫 URL 位址在https://github.com/doggy8088/sandbox-empty2.git,然後fetch所指定的一個參照名稱對應規格(refspec)。」

  • git push
    將本地儲存庫目前分支所有相關物件推送到遠端儲存庫中。默認參考引用 :  push = +refs/heads/*:refs/heads/*
  • git ls-remote git lis-remote origin
    查詢端點儲存庫有哪些分支

參照名稱對應規格 (refspec)

+refs/heads/*:refs/remotes/origin/*  大略可以分為四區塊,如下 :
  • +
    設定 +加號,代表傳輸資料時,不會特別使用安全性確認機制。
  • refs/heads/*
    來源參照規格」,代表一個位於遠端儲存庫的遠端分支,而 * 星號代表 refs/heads/ 這個路徑下「所有的遠端參照」。
  • :
    用來區隔「來源分支」與「目的分支」
  • refs/remotes/origin/* 
    目的參照規格」,代表一個位於本地儲存庫的本地追蹤分支,而 * 星號代表工作目錄的 refs/remotes/origin/ 這個路徑下「所有的本地參照」。

設定僅下載遠端儲存庫部分分支

如果你把 fetch 的 refspec 修改成以下這樣,那麼除了master以外的終點分支,就不會被下載了!:

fetch = +refs/heads/master:refs/remotes/origin/master

如果你想明確下載特定的幾個分支就好,你可以重複定義幾個不同的fetch引用規格(refspec),例如:

[remote "origin"]
       url = https://github.com/doggy8088/sandbox-empty2.git
       fetch = +refs/heads/master:refs/remotes/origin/master
       fetch = +refs/heads/TestBranch:refs/remotes/origin/TestBranch

設定「本地分支」與「最終存儲庫」之間的默認情況

以在執行 git push 時,自動將分支 push 到遠端儲存庫。

    🔎為什麼需要?

    👀 因為預設只會建立 master (或 main)  與 遠端儲存庫之間的關係 (詳見.git\config設定檔),只會將 master 分支  push  上去。若想將比如 branch1 push 上去,需要輸入 git push origin branch1  這樣完整的指令。

    🎯解決方式 :

     在git push的時候加上--set-upstream參數,即可將本地分支註冊進.git\config設定檔,之後再用就git push可以順利的自動進行上去。實例如下 :
    執行git push --set-upstream origin FixForCRLF的同時,會在.git\config設定檔增加以下內容:

[branch "FixForCRLF"]
	remote = origin
	merge = refs/heads/FixForCRLF

多人在同一個終端儲存庫中進行版本控制

如果 push 的時候,origin/master 沒有得到終端儲存庫的最新版本,就會失敗。解決方法如下: 先透過 git fetch 取回終端資料庫中的最新版本,然後使用 git merge origin/master 合併回自己的 master 本地分支 (上述兩個指令可以使用 git pull 代替) (若發生衝突就解決衝突),然後再用 git push 進終端儲存庫。

如果你今天發生了衝突狀況,平衡不知道如何解決,因為版本尚未被成功合併,所以你可以執行以下指令「重置」到目前的版本HEAD:
git reset --hard HEAD 
如果你今天成功的合併了,但又想反悔這次的合併動作,那麼你還是可以執行以下指令「重置」到合併前的版本狀態,否則重置到ORIG_HEAD這個版本:
git reset --hard ORIG_HEAD


常見的分支名子

  • 建立 Git 儲存庫時,默認會有的 master 分支 : 做為系統的穩定版本。
    • 趨於穩定版本會,可以給它一個標記標籤。比如 : git tag 1.0.0-beta1 -a -m "V1.0.0-beta1 created"
  • 從 master 建立 develop 分支 : 做為開發分支,大家一起使用。
  • 從 develop建立 feature/[branch_name] 分支 : 自己開發新功能用。
  • 從 master 建立 hotfix/[branch_name] 分支 : 正式機率(生產環境)出現問題時,緊急修 bug 用。

將分支送上遠端儲存庫與取回

上傳 :
  • git push --all 
  • git push --tag : 將標註標籤實例到初始儲存庫(遠端儲存庫)。
取回:
  • git fetch --all --tags: 將所有對象取回,包含所有對象引用與標籤引用。

取回分支後進行開發

應該將本地追蹤分支視為唯讀,不過 Git 有其他方法。
如被指派 hotfix/bugs_in_membership分支進行修復任務,可以執行git checkout hotfix/bugs_in_membership ,Git 會自動創建一個同名本地分支,如下圖。然後你就可以在該分支提交新版本,最後 git push origin hotfix/bugs_in_membership

GitHub的fork與pull request版控流程

權限管控

個人帳號 :
只能設定合作者,合作者可以自由 push 、 pull 專案原始碼。

組織帳戶:
可設定不同人員全組,設定他們:
  • 僅拉(唯讀)
  • 推&拉 (引人注目可寫)
  • 推送、拉取和管理(搶可寫以及專案管理權限)

fork

把別人的專案 git clone 到自己帳戶之下 (方可擁有完整權限,也不會影響原主)。像是把別人的菜叉到自己盤子裡一般。
可以在作變更後對原主發 pull request 請求合併 (請對方拉過去)。

資料來源

  • https://github.com/doggy8088/Learn-Git-in-30-days/tree/master/zh-tw

0 comments:

張貼留言