Table of Contents
學習 ↵
理解版本管理的流程
Git 作業流程
sequenceDiagram
box Local
participant WD as Working Directory<br/>(工作目錄)
participant SA as Staging Area<br/>(暫存區)
participant LR as Local Repository<br/>(本地儲存庫)
end
box Remote
participant RR as Remote Repository<br/>(遠端儲存庫)
end
RR-->>WD: git clone <repository_url>
WD->>SA: git add
SA->>LR: git commit
LR->>RR: git push
RR-->>LR: git fetch
RR-->>WD: git pull
LR-->>WD: git checkout <branch_name>
LR-->>WD: git merge <branch_name>
- Working Directory (工作目錄): 是指包含您當前工作項目的目錄。當您在編輯文件、新增、修改或刪除文件時,這些更改都發生在工作目錄中。
- 當您執行
git add
指令時,將會將工作目錄中的更改添加到暫存區。
- 當您執行
- Staging Area (暫存區): 是一個暫存文件更改的區域,用於準備將要提交的更改。
- 在暫存區中的更改可以通過
git commit
指令提交到本地儲存庫。
- 在暫存區中的更改可以通過
- Local Repository (本地儲存庫): 是指包含您項目完整歷史記錄的本地數據庫。
- 本地儲存庫保存了您所有提交的快照,您可以通過
git log
查看提交歷史記錄。 - 當您準備將更改從本地提交到遠端時,您可以使用
git push
將本地儲存庫中的提交推送到遠端儲存庫。
- 本地儲存庫保存了您所有提交的快照,您可以通過
- Remote Repository (遠端儲存庫): 是指位於遠端的服務器上的數據庫,它與本地儲存庫相對應。
- 您可以使用
git pull
從遠端儲存庫拉取最新的更改到本地儲存庫。這等同於運行git fetch
來取回遠端儲存庫中的所有分支,然後再執行git merge
來合併所取回的分支到您的當前分支。 - 初次取得遠端儲存庫中的所有內容通常是通過
git clone
來完成的。這個操作會將遠端儲存庫克隆到本地,包括所有歷史記錄和分支。
- 您可以使用
Git 初始設定
建立一個Git庫
初始化一個全新的 Git 儲存庫(repository),追蹤和管理專案的版本控制歷史。
列出 Git 的配置信息
更多config資訊: https://git-scm.com/docs/git-config/en
git status, git log
graph LR
WD[Working Directory<br/>工作目錄] -- git add --> SA[Staging Area<br/>暫存區]
SA -- git commit --> LR[Local Repository<br/>本地儲存庫]
文件狀態檢查(git status)
檢查當前目錄的狀態,查看哪些更改已暫存、哪些未暫存。
執行腳本 輸出狀態 —> 未追蹤 (Untracked files)
我們建立新的檔案,或是更改檔案時,都會執行 git add指令將檔案加至暫存區(Staging Area)
執行腳本 輸出狀態 —> 等待提交(Changes to be committed)
我們再次改變 Lesson03.md
內容,並查看git status 的狀態
執行腳本 輸出狀態 —> 已更改 (Changes not staged for commit)
將暫存區的檔案提交到儲存庫永久儲存
查看現在文件狀態
執行腳本 輸出狀態 —> 無任何提交資訊,已提交(Committed)
查看提交歷史 (git log)
git log
會列出提交歷史,包括每次提交的作者、日期、提交消息等信息。
取消文件修改的 Git 操作練習
以下流程主要是在演示如何使用 Git 來取消暫存和恢復文件的操作。
graph TD
A[選擇文件並進行修改] --修改文件--> A1[git add 將文件添加到暫存區]
A1 --2.git add file--> B[運行 git status 檢查文件狀態]
B --3. 查看文件狀態--> C[是否需要取消暫存文件]
C -- Yes --> D[運行 git restore --staged file 取消暫存]
D --4. 取消暫存文件--> E[再次運行 git status 檢查文件狀態]
E --5. 檢查文件狀態--> F[是否需要恢復文件]
F -- Yes--> G[運行 git restore file 恢復文件]
G --6. 恢復文件--> H[再次運行 git status 檢查文件狀態]
H --7. 確認文件恢復--> I[操作完成]
F -- No --> I
C -- No --> I
比較修改內容 git diff
git diff
用於比較文件之間的差異。這個命令通常用於檢查修改的內容,並確定要提交的更改。
常見用法:
比較工作目錄和暫存區
比較暫存區和最後一次提交
比較工作目錄和最後一次提交
比較兩個特定提交之間
.gitignore Documentation
用於指定 Git 忽略某些文件或目錄的配置文件。當 Git 檢查文件更改時,Git 將忽略它們,不會將它們包含在版本控制中。
更新最後的提交 阿們
git commit --amend
修改最後一次提交的命令。
使用情況:
- 修改最後一次提交的提交訊息
- 添加新的更改:修改最後一次提交內容,而無需創建一個新的提交。
請注意,當您使用 git commit --amend 時,它將修改最後一次提交的內容。
因此,如果您的提交已經被推送到遠端儲存庫,並且其他人已經基於該提交進行了工作,則修改最後一次提交可能會導致歷史的重新編寫,這可能會對其他人的工作產生影響。因此,請在確定沒有其他人基於您的提交進行工作時使用此命令。
返回過去版本 git reset, git revert
git reset
指令時,--soft、--mixed 和 --hard 參數可以控制重置的範圍以及對暫存區和工作目錄的影響程度。
- 影響程度:
選項 | 歷史 | 暫存區 | 工作目錄 |
---|---|---|---|
--soft |
✔ | ||
--mixed (預設) |
✔ | ✔ | |
--hard |
✔ | ✔ | ✔ |
具體操作:
回復到上一個(或更前的)版本。
小知識
HEAD 是什麼 ? HEAD 是一個指標,通常指向某一個分支,通常你可以把 HEAD 當做「目前所在分支」看待。
我們也可以用以下方法,讓HEAD 從 branch中分離出來
revert
假設你回覆之前的版本後,又想回復到最新提交的版本,就可以用:
貼心提示
如果一開始沒有記下來 Commit 的 hash id 值也沒關係,Git 裡有個 reflog
指令有保留一些紀錄。
當 HEAD 有移動的時候(例如切換分支或是 reset 都會造成 HEAD 移動),Git 就會在 Reflog 裡記上一筆。
小提示
git log -g
也可以看到 Reflog 喔!
branch 分支
%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
'git0': '#00ff00','gitBranchLabel0': '#ffffff',
'git1': '#ff0000','gitBranchLabel1': '#ffffff',
'git2': '#ffff00','gitBranchLabel2': '#000000',
'git3': '#0000ff','gitBranchLabel3': '#ffffff',
'git4': '#ff00ff','gitBranchLabel4': '#ffffff',
'git5': '#ff00ff','gitBranchLabel5': '#ffffff',
'git6': '#ff00ff','gitBranchLabel6': '#ffffff',
'git7': '#00ffff','gitBranchLabel7': '#ffffff'
} } }%%
gitGraph TB:
commit tag: "v1.0.0"
branch develop order: 3
commit
branch feature order: 4
commit
branch feature2 order: 5
commit
checkout feature
commit
checkout develop
commit
branch release order: 2
commit
commit
checkout develop
merge feature
merge release
merge feature2
checkout main
merge release tag: "v2.0.0"
branch hotfix order: 1
commit
checkout develop
merge hotfix
checkout main
merge hotfix tag: "v2.0.1"
分支(branch)
- 一條獨立的開發線。
- 在處理新功能或bug 修補時,創建新的分支來獨自工作。
- 分支不會相互干擾。
常用的分支指令
合併分支
使用Tag標籤 git tag
%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
'tagLabelFontSize': '16px'
} } }%%
gitGraph
commit tag: "v1.0.0"
branch develope
commit
checkout main
merge develope tag: "v2.0.0"
git tag
是用來在 Git 中標記特定的提交(commit)的工具。它可以用來標記發布版本、重要的里程碑或任何您認為有意義的提交。標記通常用於標識軟體版本號或重要的發布日期。
例如:
1.1.4
NNN.abc.xxx
NNN
: 大版本號abc
: 每次做出小更新時,發布的版本號xxx
: 每次bug修正時發佈的版本號
你可以使用 git tag 命令來創建、列出、刪除和顯示標記。以下是一些常見的 git tag 使用案例:
- 創建標籤: 使用
git tag <tag_name>
創建一個標籤,例如 git tag v1.0.0。 - 列出標籤: 使用
git tag
命令列出所有的標籤。 - 顯示標籤信息: 使用
git show <tag_name>
來顯示特定標籤的詳細信息。 - 刪除標籤: 使用
git tag -d <tag_name>
來刪除指定的標籤。
標籤通常用於管理軟體版本和發布。當您準備好發布新版本時,您可以使用標籤來標識這個特定版本的提交。
Ended: 學習
遠端 ↵
Local 到 Remote
git clone
從遠端倉庫克隆一份完整的 Git 倉庫到本地。複製所有的歷史記錄、分支和文件,以便在本地進行開發或操作。
git remote
git remote指令用於管理Git 倉庫中的遠端倉庫。git remote指令提供了一些用於查看、新增、重新命名和刪除遠端倉庫的功能。
以下是git remote 指令的常見用法:
- git remote:列出目前倉庫中已設定的遠端倉庫。
- git remote -v:列出目前倉庫中已配置的遠端倉庫,並顯示它們的URL。
- git remote add
:新增一個新的遠端倉庫。指定一個遠端倉庫的名稱和URL,將其新增至目前倉庫。 - git remote rename
:將已設定的遠端倉庫重新命名。 - git remote remove
:從目前倉庫中刪除指定的遠端倉庫。 - git remote set-url
:修改指定遠端倉庫的URL。 - git remote show
:顯示指定遠端倉庫的詳細信息,包括URL 和追蹤分支。
git fetch
獲取遠端的修改但又不想將它們合併到您目前的本地分支中
git fetch
執行了兩個主要步驟,包含:
- 下載 remote 有的 commit,但是在我們的 local repository 是沒有該 commit。
- 更新我們 remote branch 所指向的地方(例如, o/main)
git pull
從遠端倉庫拉取(git fetch)更新並將它們合併(git merge)到當前本地分支。這個命令叫作 git pull
。
或者
git push
將本地提交推送到遠端倉庫。當本地做了修改並且希望將這些更改分享給其他協作者時。
.gitignore?
專案中每個文件都需要push至repo? 看看甚麼是 .gitignore
使用 git stash 暫存
暫存工作目錄與索引的變更狀態
事件:當您在進行某項工作時,突然需要切換到其他分支處理緊急任務或者需要檢查其他分支的內容時
建立暫存
git stash
指令,可以自動幫你把改寫到一半的那些檔案建立一個「特殊的版本」,我們稱這些版本為 stash 版本,或你可以直接稱他為「暫存版」。
用法:
git stash list
列出目前所有的 stash 清單
取回暫存版本
建立多重暫存版
事件:上一個緊急任務還沒結束又來更緊急的任務
直接執行 git stash apply
的話,他會取回最近的一筆暫存版,也就是上述例子的 stash@{0}
如果想取回「特定一個暫存版」,必須在最後指名 stash id,如下範例:
-
刪除 stash@{1} 暫存版,可以透過
git stash drop "stash@{1}"
將特定暫存版刪除。 -
清理掉所有的暫存版,直接下達
git stash clear
即可全部刪除。
Ended: 遠端
解決合併衝突 ↵
本地分支合併衝突
發生衝突前:在main分支延伸出兩個分支
合併
Merge conflict