Git在專案中的那些實操(持續更新...)

飛飛魚發表於2023-09-05

前言

Git是一個分散式版本控制系統,用於跟蹤和管理專案的程式碼變化。它最初由Linus Torvalds開發,用於管理Linux核心的程式碼。Git具有以下特點:

  1. 分散式:每個開發者都可以擁有完整的程式碼倉庫副本,包括完整的歷史記錄。這使得團隊成員可以在沒有網路連線的情況下獨立工作,並且更容易處理分支和合並操作。

  2. 高效效能:Git設計簡潔,執行速度快。它使用了一種稱為”快照”的機制來儲存檔案的狀態,而不是儲存檔案的差異。這使得Git在處理大型專案和大量檔案時表現出色。

  3. 強大的分支和合並功能:Git鼓勵頻繁地建立和合並分支,使得團隊可以同時進行多個任務和實驗性開發。合併操作也相對簡單,可以輕鬆地將不同分支的更改合併到一起。

  4. 完整的歷史記錄:Git記錄了每次提交的詳細資訊,包括作者、日期、提交訊息等。這使得團隊可以追溯程式碼的演變歷史,並輕鬆地回滾到之前的版本。

  5. 支援多種協作方式:Git支援多種協作方式,包括透過遠端倉庫進行協作、透過郵件列表或社交平臺進行程式碼審查等。

Git已成為廣泛使用的版本控制系統,被許多開發者和團隊用於管理各種型別的專案。它提供了強大的工具和功能,使得程式碼的版本控制和協作變得更加高效和可靠。

一:下面呢是團隊中協作開發時一些常見的Git入門操作

  1. 初始化倉庫:使用git init命令在當前目錄初始化一個新的Git倉庫。

  2. 克隆倉庫:使用git clone <repository>命令克隆一個遠端倉庫到本地。

  3. 新增檔案:使用git add <file>命令將檔案新增到暫存區,準備提交。

  4. 提交更改:使用git commit -m "commit message"命令將暫存區的更改提交到本地倉庫。

  5. 檢視狀態:使用git status命令檢視當前倉庫的狀態,包括已修改、已暫存和未跟蹤的檔案。

  6. 檢視歷史:使用git log命令檢視提交歷史記錄,包括提交者、日期和提交訊息。

  7. 建立分支:使用git branch <branch-name>命令建立一個新的分支。

  8. 切換分支:使用git checkout <branch-name>命令切換到指定的分支。

  9. 合併分支:使用git merge <branch-name>命令將指定分支的更改合併到當前分支。

  10. 拉取更新:使用git pull命令從遠端倉庫拉取最新的更改。

  11. 推送更改:使用git push命令將本地的更改推送到遠端倉庫。

以上操作就是開發過程中的基本流程了,但???



例1:本該出現在新分支的程式碼改動,卻在廢棄的分支上開發半天!

假設現在你的a分支功能開發完成,合併到master分支後。master分支又有團隊成員更新了很多程式碼。其實這時你應該在本地更新(git pullmaster分支並且git checkout到一個新的分支(b)繼續開發新功能。但你並沒有,繼續留在了a分支繼續開發,這可能導致程式碼差異過大而產生程式碼衝突!

解決方法:

1.先將a分支的程式碼提交到暫存區
> git add .
> git commit -m'fix'

2.提交之後會有一個提交記錄,檢視提交記錄,並將剛才提交的這個commit號複製下來
> git log 

3.更換到master切一個最新分支出來(b)
> git checkout master && git pull
> git checkout -b <新分支名>
> git cherry-pick <剛才複製的commit號>

操作之後你會發現a分支的更改內容被複制了一份到b分支,這樣就可以繼續開發了~

關於git cherry-pick

git cherry-pick 是 Git 中的一個命令,用於選擇性地將其他分支上的單個或多個提交應用到當前分支。它的應用場景和用法如下:

應用場景:

  1. 合併特定提交:當你只需要合併其他分支上的某個或某幾個提交到當前分支時,可以使用 git cherry-pick
  2. 修復 bug:當你在其他分支上修復了一個 bug,並且希望將該修復應用到當前分支上時,可以使用 git cherry-pick

用法:

  1. 單個提交的 cherry-pick:

    git cherry-pick <commit>

    這將會將指定的 <commit> 應用到當前分支上。

  2. 多個提交的 cherry-pick:

    git cherry-pick <commit1> <commit2> ...

    這將會按照指定的順序將多個提交應用到當前分支上。

  3. 跨分支的 cherry-pick:

    git cherry-pick <commit>..<commit>

    這將會將兩個提交之間(包括這兩個提交)的所有提交應用到當前分支上。

需要注意的是,git cherry-pick 可能會引入衝突,因為它將其他分支上的提交應用到當前分支上。如果發生衝突,你需要手動解決衝突並提交修改。此外,git cherry-pick 會生成新的提交,這些提交與原始分支上的提交具有不同的 SHA 標識。



例2:推送程式碼到master後忘記切換分支直接在主分支上開發了

開發完之後,一頓操作猛如虎提交到master之後,卻沒有切換到開發分支~ 直接在master分支開發了一堆新程式碼,你們會怎麼解決?全部複製下來,然後把檔案刪除,最後切到新分支貼上上去麼?我相信一定有人這麼幹過:joy:

解決方法:

1.第一步直接將修改過的程式碼都掛載
> git stash 

2.切換到新分支 ,將掛載的程式碼 【pop】 出來,就可以重新應用修改過的程式碼了!
> git checkout <分支名>
> git stash pop stash@{0}

關於git stash:

git stash命令用於臨時儲存你在工作目錄中所做的更改,但是你暫時不想提交。它允許你在切換到其他分支或處理其他任務時,不必提交尚未完成的更改。

當你執行git stash時,Git會儲存你的本地修改,並將工作目錄恢復到最後一次提交的狀態。儲存的更改被儲存在一個新的stash中,你可以隨後根據需要應用或丟棄它們。

以下是使用git stash的基本工作流程:

  1. 在工作目錄中對檔案進行一些修改。
  2. 執行git stash來儲存你的更改。
  3. Git會將工作目錄恢復到最後一次提交的狀態。
  4. 現在你可以切換分支或執行其他任務。
  5. 當你準備繼續處理已儲存的更改時,使用git stash apply來重新應用最近的stash。
  6. 如果你有多個stash,可以透過提供stash引用來指定要應用的stash。
  7. 或者,你可以使用git stash pop來應用最近的stash並從stash列表中刪除它。
  8. 如果你不再需要某個stash,可以使用git stash drop加上stash引用來刪除它。

記得使用git stash list來檢視所有stash及其引用的列表。

請注意,git stash是一個強大的工具,但是使用時要謹慎,並理解其影響。



例3:提交了致命錯誤到master分支

舉個例子,情況可能什麼都有:本地composer一個新包時,不小心把其他包的版本更改了!而且未經過任何測試就提交到master!! 這東西上線想想就害怕~(可能版本不相容,導致服務直接崩掉)

解決方法:

1.將最近的一次提交從當前分支中移除,並將修改保留在工作區
> git reset HEAD~

2.如果你提交多次..那就將指定的提交及其之後的所有提交從當前分支中移除,並將修改保留在工作區
> git reset <commit號>

關於git reset

git reset 是 Git 中的一個命令,用於撤銷提交、移動分支指標或重置工作區到指定狀態。它的應用場景和用法如下:

1. 撤銷提交:

  • git reset HEAD~:將最近的一次提交從當前分支中移除,並將修改保留在工作區。
  • git reset <commit>:將指定的提交及其之後的所有提交從當前分支中移除,並將修改保留在工作區。

2. 移動分支指標:

  • git reset <commit>:將當前分支的指標移動到指定的提交,丟棄該提交之後的所有提交。預設情況下,使用 --mixed 選項,修改會保留在工作區。
  • git reset --soft <commit>:與上述相同,但修改也會保留在暫存區。
  • git reset --hard <commit>:與上述相同,但修改會被完全丟棄,恢復到指定提交的狀態。

3. 重置工作區:

  • git reset:不帶任何引數時,預設為 --mixed,將工作區和暫存區回滾到上一次提交的狀態。
  • git reset --soft:將工作區保持不變,只重置暫存區到上一次提交的狀態。
  • git reset --hard:將工作區和暫存區都重置到上一次提交的狀態,丟棄所有未提交的修改。

需要注意的是,git reset 是一個潛在危險的命令,因為它會改變 Git 的歷史記錄。在使用之前,請確保瞭解其影響,並謹慎操作。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Reality

相關文章