一、Git簡介
1. Git與SVN的主要區別
- Git是分布式倉庫,與SVN等中心倉庫相比最明顯的區別是:
- SVN采用集中式的版本控制,由一個集中管理的服務端保存所有修改歷史記錄;客戶端只需下載出最新或指定提交的文件,不包據完整的歷史記錄。
2. git的開發模式
- fork 開發模式:Fork 開發模式是一種社交編程,是利用群體的智慧來進行合作編程的一種工作模式,采用派生/合並請求方式,讓任何一個開發者都可以方便的向開源項目貢獻代碼。
- 分支開發模式:分支開發模式是采用直接 clone 源項目中心倉的方式,由新建分支向目標分支發起合並請求提交代碼,讓任何一個開發者都可以方便的向開源項目貢獻代碼。這種模式沒有代碼評審的機制,使得開發者之間的協作與交流變得少而且不順暢,這樣就不能很好的保證中心倉的代碼質量。這種模式比較適合幾個人的小團隊,對於較大的團隊,建議使用fork 開發模式。
- Omega 開發模式:集中式的代碼倉庫管理
二、fork開發模式
1.fork
Fork一個項目時,可以選擇項目 Fork 到組織還是個人名下。點擊·Fork·按鈕后,根據頁面彈出窗口提示選擇相應組織名還是個人名下即可。
- 主干倉是Public 類型, fork 后的倉庫是Public ,fork 倉可以更改類型;Public、Internal、Private;
- 主干倉是Internal 類型,fork 后的倉庫是Internal ,fork 倉可以更改類型;Private、Internal;
- 主干倉是Private 類型,fork 后的倉庫是Private ,fork 倉不能更改類型;
2.git clone
(1)方式:1:使用 TortoiseGit 進行 clone
- 在本地文件夾空白處右擊 -> 選擇Git Clone
- 將剛剛copy的git倉地址,添加到URL處,確認無誤后點擊“OK”進行克隆
(2)方式2:使用 git bash 進行 clone
- 在本地文件夾空白處右擊 -> 選擇Git Bash Here
- 執行克隆命令:git clone xxxxxx.git
3.本地修改代碼、提交代碼
本地修改的代碼需要提交並push到平台
(1)方式1:使用 TortoiseGit 提交、push代碼
- 在本地項目根目錄下,右鍵選擇Git Commit -> “masterXX”…
- 在Message欄填寫提交信息->勾選需要提交的文件->點擊“OK”
- 完成commit之后會出現提示框,點擊Push將本次提交推送到遠端
(2)方式2:使用 git bash 提交、push代碼
- 查看當前代碼的修改狀態,git status
- 將修改的文件提交到本地暫存區,git add filename或者將所有修改過的工作文件提交暫存區,執行命令:git add .
- 將暫存區的修改文件提交到本地git庫中,git commit后輸入commit message,或者git commit -m "引號內輸入commit message"
- 將提交的修改推送到遠端,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 // 從暫存區移除所有沒有提交的修改
- 在本地修改與遠程代碼無沖突的情況下,優先使用:pull->commit->push
- 在本地修改與遠程代碼有沖突的情況下,優先使用: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)代碼未提交時
使用以下命令即可解決。
- git add . (把所有改動暫存)
- git stash (把暫存的文件提交到git的暫存棧)
- git checkout 本該提交代碼的分支
- git stash pop (將暫存棧中的代碼放出來)
(2)代碼已提交
- git checkout 不該提交代碼提交了代碼的分支
- git reset HEAD~1 (最近一次提交放回暫存區, 並取消此次提交)
- git stash (把暫存的文件提交到git的暫存棧)
- git checkout 應該提交代碼的分支
- git stash pop
- git checkout 不該提交代碼提交了代碼的分支 (等你把代碼提交到了正確的分支后,再次切到剛剛錯的分支)
- git push origin 錯誤的分支 -f (把不該上去的文件回退掉)
參考文獻: