關於 Git 進階使用


Posted by hoyi-23 on 2021-10-01

Git就是透過數據庫來記錄我們專案上所做的所有修改、更新、狀態、版本 等等。
數據庫又分為 遠端數據庫 與 本地端數據庫。
遠端數據庫通常是在多人一起合作時,會配一個專用的伺服器,讓大家一起使用的。而本地端數據庫就是我們自己的機器上配置的數據庫。
多人合作的情境,基本上就是拉取(pull)遠端數據庫的資料來做修改與更新等等,然後再推回去(push)遠端數據庫。

Commit 提交修改

在每一次新增或修改後,若想要將這些變動紀錄到數據庫中,需要commit上去。透過commit,數據庫會依時間記錄更動的內容等等。建議每個不同目的,例如:新增、修復... 都可以分開提交。

關於基本的數據庫設定與運用可以參考:
終端機 & Git 指令


關於共享數據庫與分支

前面我們大致上知道這些指令

  • 送入暫存 Staged:git add
  • 提交 Committed:git commit
  • 查看檔案庫的狀況: git status(看看檔案庫內有幾個沒追蹤的檔案...等等)
  • 查看提交歷史記錄: git log
  • 註冊遠端儲存庫:git remote add origin 遠端儲存庫網址
  • 更新資料到遠端 master 分支:git push -u origin master
  • 將遠端檔案庫合併至本地檔案庫:git pull

那麼在和多人一起工作時,還會再有哪些常用的指令呢?

git clone 網址

若是使用SSH的話就需要另外做設定。
補充: 關於http和ssh兩種協議

git branch 分支

預設的branch就是master(main),而若是多人合作,同時有人修改、有人添加新功能...,全部都在master上作業的話,應該就會大亂了吧!而且master通常會是正式版資料,為了不影響正式版,我們需要透過再開分支來測試或開發。

branch 就是指向某個 commit 的 reference, branch 其實就是在說:「我想要包含這一次的 commit 以及它的所有 parent 的 commit。」

  • 新增分支: git branch 分支名稱
  • 查看分支: git branch
  • 切換分支: git checkout 分支名稱
  • 刪除分支: git branch -d 分支名稱 (-D 是強制刪除)
  • 還原上個版本: git reset HEAD^
  • 合併分支: git merge 分支名稱
    (可以合併多個分支後建立一個新的分支,再回併回main)

rebasing 類似 merge 的另一種用法

rebasing 就是取出一連串的 commit,"複製"它們,然後把它們接在別的地方。

不同於merge的地方是,rebasing比較線性,也可以更明確看到修改歷程。
假設有一個feature分支 與 main分支
我要將feature和main合併了,可以將branch移到feature分支上然後輸入git rebase bugFix

分支命名

通常預設分支就是 master
開發分支 develop
開發新功能分支 feature (feature/01、feature/xxx)

Commit Tree 在git中移動

首先要先了解 HEAD。

HEAD

HEAD 是一個指標,指向某一個分支,通常你可以把 HEAD 當做「目前所在分支」看待。
假如說我有三次Commit,現在我的HEAD應該會在我的第三次Commit上,如果我想要回去看我的第一次Commit,我可以輸入git checkout 第一次Commit的編號git checkout HEAD~2(回兩步)。這時候我的HEAD就會指向在第一次Commit的地方。

HEAD 預設會一直跟著 master/main分支。


小技巧/小知識

學習自: youtube channel 高見龍

使用 Git Push 指令只 Push 部份的進度?

只 Push 部份的進度是什麼意思呢? 假設今天你想每日上傳一直影片,為了保險起見,你可能預先多拍了好幾隻。今天只是Day4,但你已經拍到Day8。
如果直接使用git push origin master,會將全部都推上去。
所以要怎麼只推Day4的就好了?
首先可以要先理解一下 git push origin master 的概念。
這個指令的完整版其實是: git push origin master: master
解構來看: git推送master這個分支到origin節點,並產生新的master分支。
所以:git push origin master: new
就是:git推送master這個分支到origin節點,並產生新的new分支。

Ok! 那麼如果只要推Day4上去呢?
git push origin Day4: master or git push origin Day4
這個 Day4 其實會是Commit的編號

"~" 跟 "^" 有什麼不同?

這兩個符號都是幫助我們在reset或是checkout時,作相對位置的移動。
範例:

  1. git checkout HEAD^ :我要將現在的HEAD移動到(現在HEAD的)前一個地方
  2. git checkout HEAD^^ :我要將現在的HEAD移動到(現在HEAD的)前兩步地方
  3. git checkout HEAD~3:我要將現在的HEAD移動到(現在HEAD的)前三步地方
    所以結果是相等於git checkout HEAD^^^

但是這兩者上又有些不同。假設現在這個HEAD它是合併來的,它有兩個parent node。這樣他的上一步要回去哪個呢?
如果是使用git checkout HEAD^,它會回到第一個Parent,因為它的完整其實是git checkout HEAD^1
如果要回到第二個Parent呢? 要輸入git checkout HEAD^2

要特別注意是跟git checkout HEAD~2不一樣喲!
git checkout HEAD~2是回兩步,但是不管它每一步有沒有多個Parent,都是回到第一個Parent。


#Git







Related Posts

Day 45 - Beautiful Soup & Web scraping & robots.txt

Day 45 - Beautiful Soup & Web scraping & robots.txt

認識資料庫的推薦閱讀

認識資料庫的推薦閱讀

程式導師實驗計畫 Week6 作業與解答

程式導師實驗計畫 Week6 作業與解答


Comments