iT邦幫忙

3

Git 綜合筆記

  • 分享至 

  • xImage
  •  

1. 推資料進新分支 (建立新分支 + 推資料進新分支)

(1)建立新專案
命名新專案,並記錄網址
https://github.com/xxxxx/gittest.git

(2)新增資料夾,並移動進去

mkdir '資料夾名稱'
cd '資料夾名稱'

(3)將該資料夾與github專案連結(clone)

git clone https://github.com/xxxxx/gittest.git
目前為空,因為github上沒資料

(4)進入github(gittest)資料夾

cd gittest

(5)加入檔案or編輯檔案
touch > git add . > git commit -m '備註'

(6)第一次推

git remote add '數據庫名稱'
git branch -M 分支名稱
git push -u 數據庫名稱 分支名稱

(7)更新資料(推送數據庫到 Github)

git push
要輸入帳號密碼,確認是本人

建立分支
(8)建立分支

git branch '分支名稱'
https://ithelp.ithome.com.tw/upload/images/20220101/20137684l3oSkR5cHK.png

(9) 瀏覽目前分支

git branch

(10) 移動到該分支

git checkout '分支名稱'

(11) 進入該分支後,才能編輯分支內的資料、並查看更新

git status

(12) add + commit

git add .
git commit -m '備註'
https://ithelp.ithome.com.tw/upload/images/20220105/20137684EPPGG9wm9c.png

此時瀏覽分支有2,內容不同,push需要指定remote及branch
之所以會這樣的緣故是因有非常多的數據庫(有正式的或是測試用的),
那他第一個預設通常都是 origin 就像 master 一樣
https://ithelp.ithome.com.tw/upload/images/20220105/20137684DivPfIrijg.png

(13) push
查詢有多少個遠端數據庫

git remote
git push '數據庫名稱' '分支名稱'
https://ithelp.ithome.com.tw/upload/images/20220105/20137684SelifNwx0m.png


2. 合併與衝突時

(1)兩分支於同一線上且無衝突:

(2)兩分支於不同線上且無衝突:

案例:
沒變更主要branch,變更 更新branch:
主要branch(main)與更新branch(feature1)同時更新,無衝突時:
(a)先把HEAD移動到主要專案上

git checkout 'main(分支名稱)'

(b)接著合併想合併的版本(兩版本皆須已commit完成)

git merge 'feature1(分支名稱)'

(c)此時主要分支就會有全部的資料

(3)兩分支於不同線上且衝突:

案例:
主要branch(main)與更新branch(feature1)同時更新,有衝突時:
(a) 先把HEAD移動到主要專案上

git checkout 'main(分支名稱)'

(b) 接著合併想合併的版本(兩版本皆須已commit完成)

git merge 'feature1(分支名稱)'

(c) 解決上圖問題,無法自動合併故改為 手動合併
(d) add . + commit -m '備註'

(4)遠端衝突(github)

(a) 檔案拉下來

git pull

(b) 解決問題,無法自動合併故改為 手動合併
(d) add . + commit -m '備註'
實務上會使用git pull + git merge 先將同事資料拉下來
git push 到 github 會保留本地數據庫commit


3. 補充常見指令

1.reset (版本還原)

(1)尚未push把commit還原(仍保留檔案在工作目錄)

git reset HEAD^

(2)尚未push把commit還原(檔案刪除)

git reset HEAD^ —hard

(3)還原所有,還原工作目錄與索引,會與最後一次commit保持一樣

git reset —hard

(4)尚未commit 索引檔案退到工作目錄

git reset HEAD

2.rebase

使用 rebase 合併

git rebase 'branch名稱'
https://ithelp.ithome.com.tw/upload/images/20220105/20137684gzb67CrbNO.png

rebase vs merge

merge:
分支在同一條線上時,merge會快轉
但分支在不同線上時,不會快轉此時branch(main)內已經包含更新branch(feature1)
但更新branch(feature1)仍為原更新branch(feature1)
(git checkout feature1)
https://backlog.com/git-tutorial/tw/stepup/stepup1_4.html
rebase:雖然但分支在不同線上,但有快轉效果(使分支在同一條線上),並有完整歷史紀錄

git reflog

3.remote (有關數據庫)

(1) 遠端版本庫不止一個,這個命令會將它們全部列出來。

git remote -v
git2 https://github.com/xxxxx/tryconnect.git (fetch)
git2 https://github.com/xxxxx/tryconnect.git (push)
git3 https://github.com/xxxxx/text-1.git (fetch)
git3 https://github.com/xxxxx/text-1.git (push)
origin https://github.com/xxxxx/tryconnect.git (fetch)
origin https://github.com/xxxxx/tryconnect.git (push)

(2) 查詢有多少個遠端數據庫

git remote

(3) 推資料進github
a. 將github與本地資料夾連結
git remote add '遠端數據庫名稱' https://github.com/xxxxx/tryconnect.git
b. 新增branch main
git branch -M '分支名稱'
c. 資料推到branch
git push -u '遠端數據庫名稱' '分支名稱'

4.cherry-pick

只挑自己想要的commit合併到其他branch
(1) 到該分支挑選想要的commit

git checkout '分支名稱'
git log

https://ithelp.ithome.com.tw/upload/images/20220105/20137684ajR1BduZHl.png
(2) 回主要分支,抓取

git checkout '分支名稱'
git cherry-pick 'log版本號'

https://ithelp.ithome.com.tw/upload/images/20220105/20137684Ig0kY5c9x2.png

5.reflog (查看歷史紀錄)

ex:還原不小心刪除檔案,救回來
(1) 查詢歷史紀錄

git reflog

(2) 還原commit

git reset '想還原的編號'

(3) 查看commit(此時檔案還沒復原,僅復原commit)

git log

(4) 還原commit + 檔案

git reset '想還原的編號' —hard

6.stash (暫存檔案)

情境:資料寫到一半做別的事情,很快就要回來繼續寫
(之前有commit過,但目前無需再更新commit)
(1)暫時儲存當前目錄

git stash

此時 git status 不會有東西(因非commit)
(2)瀏覽 git stash 列表

git stash list

(3)還原暫存

git stash pop

step1.回之前暫存過的分支
step2.還原 暫存檔案(git stash)
(4)清除最新暫存

git stash drop

(5)清除全部暫存

git stash clear

(6)把暫存紀錄帶到其他branch作法:

git stash
git checkout '其他branch名稱'
git stash pop

7.tag

標籤是用於標記特定的點/提交的歷史
通常會用來標記發布版本的名稱/號碼(如:v1.0)。
(1)新增輕量標籤( 只新增標籤 )

git tag '標籤名稱'

(2)新增標示標籤( 新增標籤 + 標籤詳細資料 )

git tag -am ''詳細資料'' '版本名稱'

(3)查詢標籤

git tag

(4)切換到該標籤的commit

git checkout '版本名稱'

切換回原本的

git checkout '分支名稱'

(5)查詢詳細標籤

git tag -n

(6)刪除標籤
刪除標籤不會影響commit的內容

git tag -d '標籤名稱'

8.status

git status用來看有init的資料夾內,檔案情形
(1) modified file
如果更動任何一個project file,那隻檔案的狀態就會變成modified。
(2) Changes to be committed
(將要提交的檔案)
(3) Changes not staged for commit
(被更動但尚未要提交的檔案)
(4) untracked file (未被追蹤檔案)
所有新增出來、還沒用git add的檔案
(5) new file
untracked file被git add之後,狀態就會變成new file,commit之後就變成project file。
https://ithelp.ithome.com.tw/upload/images/20220117/20137684wo3FIEZwEg.png

9.revert

再做一個新的 Commit
來取消不要的 Commit

(1) git log 查看欲恢復的commit
(2) git revert ‘版本號’
此時 log 會多一個 commit
(3) git push
推到遠端資料庫
https://ithelp.ithome.com.tw/upload/images/20220117/20137684OHFPAfEdZ2.png
盡量不要一起做多個commit
因revert會恢復到該commit的全部狀態
個別檔案不好追歷史紀錄,會因此遺失


4.GIT步驟筆記

https://www.youtube.com/playlist?list=PLYrA-SsMvTPOZeB6DHvB0ewl3miMf-2tj

1. 有.git的隱藏檔,開始版本控制

git init

2. Git log時才知道是誰製作

git config --global user.email "你的mail"
git config --global user.name "你的名字"

3. 查看git資料(內有姓名)

git config --list

4. 製作 + 索引 + 提交

mkdir '資料夾名稱'
touch '檔案名稱'

git add .
git commit -m '備註'

檢查

git status

5. 製作github專案

https://github.com/xxxxx/tryconnect.git

6. 讓本地資料夾與 github 連結 使用token

*remote非branch名稱
*可在config檔案內看到remote資料

(1)將github與本地資料夾連結
git remote add '遠端數據庫名稱' https://github.com/xxxxx/tryconnect.git
(2) 新增branch main
git branch -M '分支名稱'
(3) 資料推到branch
git push -u '遠端數據庫名稱' '分支名稱'

此時檔案config內會顯示連結的git網址
url = https://github.com/xxxxx/tryconnect.git

7. 更新github(遠端數據庫)

git add .
git commit -m '備註'
git push
git push '數據庫名稱remote' '分支名稱branch'

8. HEAD指標使用checkout回去以前commit觀看

HEAD預設都會指向最新的commit

git log
git checkout '前四碼'
git checkout "master or main...(看要回去哪個分支)“

9. 分支branch

branch就像是便利貼,會貼在commit位置上
前述6.將github與本地資料夾連結時有建立分支

(1) 開新分支

git branch '分支名稱'

(2) 瀏覽目前分支

git branch

(3) 切換分支
會去到該branch的最新commit處,HEAD也會過去

git checkout '分支名稱'

(4) 合併分支

A.合併分支
僅有更新branch(feature1)時

a. 先把HEAD移動到主要專案上

git checkout 'main(分支名稱)'

b. 接著合併想合併的版本(兩版本皆須已commit完成)

git merge 'feature1(分支名稱)'

c. 此時主要分支就會有全部的資料

B.自動合併
(1)主要branch(main)與更新branch(feature1)同時更新,無衝突時:
(a)先把HEAD移動到主要專案上

git checkout 'main(分支名稱)'

(b)接著合併想合併的版本(兩版本皆須已commit完成)

git merge 'feature1(分支名稱)'

(2)主要branch(main)與更新branch(feature1)同時更新,有衝突時:
同一行不同內容

(a) 先把HEAD移動到主要專案上

git checkout 'main(分支名稱)'

(b) 接著合併想合併的版本(兩版本皆須已commit完成)

git merge 'feature1(分支名稱)'

(c) 解決上圖問題,無法自動合併故改為 手動合併

(d) add . + commit -m '備註'

https://backlog.com/git-tutorial/tw/stepup/stepup1_4.html

  1. 如果源頭一樣就會快轉branch(main)=原更新branch(feature1)
    https://ithelp.ithome.com.tw/upload/images/20220116/201376840dPfkgru7h.png
  2. 源頭不同時,不會快轉
    https://ithelp.ithome.com.tw/upload/images/20220116/20137684wVkt7fPfLr.png
    https://ithelp.ithome.com.tw/upload/images/20220116/20137684yFGZs4JF41.png
    此時branch(main)內已經包含更新branch(feature1)
    但更新branch(feature1)仍為原更新branch(feature1)
    (git checkout feature1)

10. git Reset 版本還原

reset可以帶著HEAD及branch到別處的commit
(1)把commit還原(仍保留檔案在工作目錄)

git reset HEAD^

(2)把commit還原(檔案刪除)

git reset HEAD^ —hard

(3)還原不小心刪除檔案,救回來
a. 查詢歷史紀錄

git reflog

b. 還原commit

git reflog ’想還原的編號’

c. 查看commit(此時檔案還沒復原,僅復原commit)

git log

d. 還原commit + 檔案

git reflog ’想還原的編號’ —hard


5.其他技巧

A. 開啟資料夾

open .

B. 偷懶設定縮寫指令
Git 縮寫:

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.ci commit

C. 觀看所有 config (檔案)的設定:
Mac:~/.gitconfig
Win:C:\Users$USER

D. 尚未add(索引)的檔案,刪除
查看

git clean -n
刪除
git clean -f

E. 索引檔案退到工作目錄

git reset HEAD

F. Github只有一個分支時可直接用git push會推到Github,
若有新增其他分支則使用git push -u ’遠端數據庫名稱’ ‘分支名稱’

G. Github的Source 要對外給人家看的branch

H. 實務上要 推資料 時
1.git checkout 分支
2.git pull 先將同事資料拉下來
3.git merge 或手動修改衝突合併
4.git push 再推上資料

I. 作業時,先將檔案更新至最新(pull)再作業


6. 分支圖觀看

VScode 安裝 Git Graph 選支線
https://ithelp.ithome.com.tw/upload/images/20220105/20137684cZqDG3AvxP.png


7. Git Flow (分支應用情境)

Master 以及 Develop > 長期分支

Master:

主要是用來放穩定、隨時可上線的版本。來源只能從別的分支合併(merge)過來,tag版本。

Develop:

所有開發的基礎分支,當要新增功能的時候,所有的 Feature 分支都是從這個分支切出去的。而 Feature 分支的功能完成後,也都會合併回來這個分支。

Hotfix:

當線上產品發生緊急問題的時候,會從 Master 分支開一個 Hotfix 分支出來進行修復,Hotfix 分支修復完成之後,會合併回 Master 分支,也同時會合併一份到 Develop 分支。

Release:

Develop 分支夠成熟了,就可以把 Develop 分支合併到 Release 分支,上線前的最後測試。測試完成後,Release 分支將會同時合併到 Master 以及 Develop 這兩個分支上

Feature:

新增功能時使用,Feature 分支都是從 Develop 分支來的,完成之後會再併回 Develop 分支。
https://ithelp.ithome.com.tw/upload/images/20220117/20137684DsZNf4rjVE.png


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言