6.git的fork開發模式


一、Git簡介

1. Git與SVN的主要區別

  • Git是分布式倉庫,與SVN等中心倉庫相比最明顯的區別是:
  • SVN采用集中式的版本控制,由一個集中管理的服務端保存所有修改歷史記錄;客戶端只需下載出最新或指定提交的文件,不包據完整的歷史記錄。

2. git的開發模式

  1. fork 開發模式:Fork 開發模式是一種社交編程,是利用群體的智慧來進行合作編程的一種工作模式,采用派生/合並請求方式,讓任何一個開發者都可以方便的向開源項目貢獻代碼。
  2. 分支開發模式:分支開發模式是采用直接 clone 源項目中心倉的方式,由新建分支向目標分支發起合並請求提交代碼,讓任何一個開發者都可以方便的向開源項目貢獻代碼。這種模式沒有代碼評審的機制,使得開發者之間的協作與交流變得少而且不順暢,這樣就不能很好的保證中心倉的代碼質量。這種模式比較適合幾個人的小團隊,對於較大的團隊,建議使用fork 開發模式。
  3. Omega 開發模式:集中式的代碼倉庫管理

二、fork開發模式

1.fork

Fork一個項目時,可以選擇項目 Fork 到組織還是個人名下。點擊·Fork·按鈕后,根據頁面彈出窗口提示選擇相應組織名還是個人名下即可。

  1. 主干倉是Public 類型, fork 后的倉庫是Public ,fork 倉可以更改類型;Public、Internal、Private;
  2. 主干倉是Internal 類型,fork 后的倉庫是Internal ,fork 倉可以更改類型;Private、Internal;
  3. 主干倉是Private 類型,fork 后的倉庫是Private ,fork 倉不能更改類型;

2.git clone

(1)方式:1:使用 TortoiseGit 進行 clone

  1. 在本地文件夾空白處右擊 -> 選擇Git Clone
  2. 將剛剛copy的git倉地址,添加到URL處,確認無誤后點擊“OK”進行克隆

(2)方式2:使用 git bash 進行 clone

  1. 在本地文件夾空白處右擊 -> 選擇Git Bash Here
  2. 執行克隆命令:git clone xxxxxx.git

3.本地修改代碼、提交代碼

本地修改的代碼需要提交並push到平台

(1)方式1:使用 TortoiseGit 提交、push代碼

  1. 在本地項目根目錄下,右鍵選擇Git Commit -> “masterXX”…
  2. 在Message欄填寫提交信息->勾選需要提交的文件->點擊“OK”
  3. 完成commit之后會出現提示框,點擊Push將本次提交推送到遠端

(2)方式2:使用 git bash 提交、push代碼

  1. 查看當前代碼的修改狀態,git status
  2. 將修改的文件提交到本地暫存區,git add filename或者將所有修改過的工作文件提交暫存區,執行命令:git add .
  3. 將暫存區的修改文件提交到本地git庫中,git commit后輸入commit message,或者git commit -m "引號內輸入commit message"
  4. 將提交的修改推送到遠端,git push origin master(例子中使用的是默認的遠端origin,分支master)

注意:將新創建的分支推送到遠端倉:git push origin 分支名

4.創建合並請求

當fork庫更改了內容,需要合並到主庫,需要向主庫發起 “合並請求”。

點擊 “Compare branches and continue” 按鈕出現如下界面:

5.代碼檢視

提交MR 后,進行代碼檢視

6.合並MR

注意:如果此合並請求有沖突,需要解決合並沖突。首先要把遠程倉庫的最新數據拉到本地倉庫,再從本地倉庫的分支合並,解決沖突。

7.總結

常用命令:

分支:
git branch // 顯示分支列表,左側有*的表示當前所在的分支
git branch 新分支名稱 // 創建新分支
git checkout 分支名稱 // 切換分支
git branch + git checkout test = git checkout -b //創建分支並切換到test分支
git branch --delete --force <branchName> // 刪除本地分支,或者使用選項-D作為簡寫:git branch -D
git push origin --delete <branchName> // 刪除遠程分支
合並分支:
git merge 合並分支名稱:現在在A分支上,輸入git merge B,就會把B分支合並到A分支上,合並后的結果會存儲在A分支上,整個過程對B分支沒有影響。
查看分支:
git log --graph:以圖表形式查看分支

提交:
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”  // 編輯最近一次的提交信息,但是你必須確保沒有對當前的代碼庫(working copy)做修改,否則這些修改也會隨之一起提交。
git commit --amend // 如果commit注釋寫錯了,只是想改一下注釋,此時會進入默認vim編輯器,修改注釋完畢后保存就好了。
git push <remote> <branch> --force // 假如你已經將代碼提交(git commit)推送(git push)到了遠程分支,那么你需要通過下面的命令強制推送這次的代碼提交。
git push -u origin 本地分支名:要創建的新分支名稱 //在遠程倉庫創建新分支
注意:本地分支名和遠程新分支名可以不一樣,但中間一定要注意加":"(冒號)
git checkout -b 本地倉庫新建分支名稱 遠程倉庫名稱/要取回的遠程分支名稱 // 完成遠程分支取回本地的操作
舉例:git checkout -b A origin/B 的執行結果是以名為origin的遠程倉庫(默認遠程倉庫)的B分支為來源,在本地倉庫中創建分支A。
git pull 遠程倉庫名稱 遠程分支名稱 // 從遠程倉庫取回最新版本的分支

遠程倉庫:
git remote -v:查看遠程倉庫(有遠程倉庫remoteService,本地倉庫origin)

暫時不提交:
git stash // 把當前進度保存起來
git stash pop // 恢復最新的進度到工作區

回溯版本:如果在更新代碼之后,忘記更新前應該創建個分支,可以使用如下操作
git log:查看以當前狀態為終點的歷史日志
git reset --hard 目標時間點哈希值:回溯歷史版本
git relog:查看全部時間下的歷史日志,不受當前狀態影響
git reset --hard 最新版本分支:回退到想更新后的分支
現在我們的master分支又回到了開始的最新版本,而以master分支的歷史版本為基礎的B分支也成功建立了,又可以繼續開始多路並行作業了。

撤銷:
git reset <文件名> // 往暫存區(staging area)中加入了一些錯誤的文件,但是還沒有提交代碼。如果只需要移除一個文件
git reset // 從暫存區移除所有沒有提交的修改
  1. 在本地修改與遠程代碼無沖突的情況下,優先使用:pull->commit->push
  2. 在本地修改與遠程代碼有沖突的情況下,優先使用:commit->pull->push

7.1 忽略本地修改,強制拉取遠程到本地

主要是項目中的文檔目錄,看的時候可能多了些標注,現在遠程文檔更新,本地的版本已無用,可以強拉

git fetch --all
git reset --hard origin/dev
git pull

7.2 未commit先pull,視本地修改量選擇revert或stash(pull commit push)

應用場景:同事有新提交

我 沒有pull,修改了文件 -> pull -> 提示有沖突

(1)本地修改量小

方法:如果本地修改量小,例如只修改了一行,可以按照以下流程

-> revert(把自己的代碼取消) -> 重新pull -> 在最新代碼上修改 -> [pull確認最新] -> commit&push

(2)本地修改量大,沖突較多

方法1:-> stash save(把自己的代碼隱藏存起來) -> 重新pull -> stash pop(把存起來的隱藏的代碼取回來 ) -> 代碼文件會顯示沖突 -> 右鍵選擇edit conficts,解決后點擊編輯頁面的 mark as resolved->  commit&push

方法2:-> stash save(把自己的代碼隱藏存起來) -> 重新pull -> stash pop(把存起來的隱藏的代碼取回來 ) -> 代碼文件會顯示沖突 -> 右鍵選擇resolve conflict -> 打開文件解決沖突 ->commit&push

7.3 已commit未push,視本地修改量選擇reset或直接merge(commit pull push)

(1)修改量小,直接回退到未提交的版本(可選擇是否保存本地修改)

應用場景:同事有新提交

我 沒有pull -> 修改了文件 -> commit -> pull -> 提示有沖突

方法:如果本地修改量小,例如只修改了一行,可以按照以下流程

-> reset(回退到未修改之前,選hard模式,把自己的更改取消) -> 重新pull -> 在最新代碼上修改 -> [pull確認最新] -> commit&push

(2)修改量大,直接merge,再提交(目前常用)

方法:-> commit后pull顯示沖突 -> 手動merge解決沖突 -> 重新commit -> push

第一種方式:

git add + 要提交的文件名
git commit:在vim中添加TicketNo
git push origin master:將本地倉庫的master分支提交到fork的個人項目
在gitlab的本地倉庫中新增merge request(MR),點提交的時候如果有沖突執行步驟5,如果沒有沖突,則提交成功
git fetch remoteService:查看遠程倉庫的代碼是否有更新
git merge remoteService/master:將遠程倉庫的代碼與本地倉庫代碼合並,並解決沖突,再執行步驟1,2,3
第二種方式:

git add + 要提交的文件名
git commit:在vim中添加TicketNo
git push origin master:將本地倉庫的master分支提交到fork的個人項目
在gitlab的本地倉庫中新增merge request(MR),點提交的時候如果有沖突執行步驟5,如果沒有沖突,則提交成功
git pull remoteService master // 取回遠程倉庫的變化,並與本地master分支合並,解決沖突,執行步驟1,2,3
第三種方式:

git fetch remoteService:將遠程倉庫的代碼下載到本地倉庫
git merge remoteService/master:將遠程倉庫的代碼與本地倉庫代碼合並,解決沖突
git add + 要提交的文件名
git commit:在vim中添加TicketNo
git push origin master:將本地倉庫的master分支提交到fork的個人項目
在gitlab的本地倉庫中新增merge request(MR)

8. 開發錯分支

(1)代碼未提交時

使用以下命令即可解決。

  1. git add .    (把所有改動暫存)
  2. git stash     (把暫存的文件提交到git的暫存棧)
  3. git checkout 本該提交代碼的分支 
  4. git stash pop (將暫存棧中的代碼放出來)

(2)代碼已提交

  1. git  checkout  不該提交代碼提交了代碼的分支
  2. git reset HEAD~1  (最近一次提交放回暫存區, 並取消此次提交)
  3. git stash                (把暫存的文件提交到git的暫存棧)
  4. git checkout 應該提交代碼的分支
  5. git stash pop
  6. git  checkout  不該提交代碼提交了代碼的分支 (等你把代碼提交到了正確的分支后,再次切到剛剛錯的分支)
  7. git push origin 錯誤的分支 -f  (把不該上去的文件回退掉)

 

 

 

 

參考文獻:

【1】Git Branch —— 實現多路並行作業 - 簡書

【2】七個你必須重視的 Git 使用技巧 – 碼農網

【3】IDEA遇到 git pull 沖突的幾種解決方法_小名同學-CSDN博客

【4】git修改/添加/刪除遠程倉庫_陽水平的博客-CSDN博客_git刪除遠程倉庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM