可以直接看實踐
總結自施磊老師課程
Git與SVN對比
svn操作流程
-
寫代碼。
-
從服務器拉回服務器的當前版本庫,并解決服務器版本庫與本地代碼的沖突。
-
將本地代碼提交到服務器。
Git操作流程
-
寫代碼, 然后添加(add)到暫存區。
-
提交(commit)到本地版本庫。
-
從服務器拉取(pull)服務器的當前版本庫,并解決服務器版本庫與本地代碼的沖突。
-
將遠程庫與本地代碼合并結果提交(commit)到本地版本庫。
-
將本地版本庫推送(push)到服務器
注意:推送代碼前一定要拉代碼,不然把別人代碼沖沒了,還要花時間找
對比可以看出:分布式版本管理僅僅是增加了本地庫這個概念,其余的概念與集中管理并無區別。——但是 svn 在與服務器同步之前無法提交代碼,因而本地修改更容易出問題。
Git常用命令
正常流程基本命令
git clone -b master git@github.com:luzhenren/GitLearn.git
? 將遠程倉庫指定分支克隆到本地
? 會自動創建遠程倉庫名稱origin 和 本地倉庫
-
git branch
查看分支
-
git status
查看哪些代碼變化
-
總流程如下
-
git add <要提交的代碼>
將工作區代碼提交到了暫存區
-
git commit -m "feat: 初始化提交代碼"
將暫存區代碼提交到本地倉庫
-
git pull origin <分支名>
拉取遠程倉庫代碼,合并代碼
如果有沖突,則需要重新處理代碼,使其能夠編譯過,此時處理過后的代碼又是新代碼,需要再一次 add commit pull。
確認本地倉庫代碼一定是最新的了再push,不然會導致別人代碼被沖掉。
-
git push origin <本地倉庫分支>:<遠程倉庫分支>
倉庫分支名一致,則可以
git push origin <分支名>
將本地倉庫推送到遠程倉庫
重要!!!
**提交之前一定要確定代碼編譯沒問題提交之前一定要確定代碼編譯沒問題
提交之前一定要確定代碼編譯沒問題**
異常流程版本回退命令
-
未使用
git add
的時候----在工作區git checkout -- <filepathname> # 放棄修改某個文件 例如: git checkout -- readme.md git checkout . # 放棄所有修改的文件 git restore . # 放棄所有修改的文件
-
已經使用
git add
的時候----在暫存區git reset HEAD <filepathname> # 恢復某個文件到工作區 例如: git reset HEAD readme.md git reset HEAD . # 恢復所有文件到工作區 git reset # 恢復所有文件到工作區
注意:這里只是恢復到了工作區,如果想放棄修改的代碼還需要執行上述(放棄工作區)中的操作
-
已經使用
git commit
提交的了代碼----在本地倉庫git log
查看本地倉庫提交記錄,記錄會帶有每次提交的版本號(commit id)git reset --hard <commit id>
退到暫存區 -
已經
git push
到了遠程分支----在遠程倉庫git push -f origin <分支名>
確認只有自己更新了,先回退本地倉庫,然后強制更新(本地落后于遠程只能強制)遠程倉庫即可
(如果此期間別人提交了代碼,需要協商處理,所以意識到問題后立即告知大家)
代碼沖突處理
沖突發生在兩個人操作同一個文件的時候
gut pull后文件就會變成如下
<<<<<<<<<<<<<<<<<< HEAD (當前更改)
我的代碼
=====================
你的代碼
>>>>>>>>>>>>>>>>>>>>>> dsfahowihowqerhqoir2143 (傳入更改)
就是看采用你的代碼還是我的代碼、或者兩個人的都要一部分(溝通!!!)
Git分支管理
總結:對于開發,本地分支數與遠程分支數一一對應,可以避免很多問題,開發很可靠
本地分支管理
git本地創建多個分支,互不干擾。
情景:在做某個需求a時,先需要修改緊急bug b;發版時發的是遠程dev的代碼。
方式一(推薦):
(1)本地已有分支dev,寫了需求a,先commit,即將工作區的內容提交到版本庫中,否則切換到其他分支時,就會覆蓋當前工作區的代碼。(這步很重要)
(2)在本地創建dev_bug分支,從遠程dev分支中check(git checkout -b dev_bug origin/dev)
(3)在本地dev_bug上修改bug,并commit、push到遠程dev上
(4)在本地變換到dev,繼續做需求a
為了開發新功能不影響master穩定的代碼,創建一個新分支來開發
19393@LAPTOP-L9L4QE0T MINGW64 /d/code/github/GitLearn (master)
$ git checkout -b sortdev
Switched to a new branch 'sortdev'19393@LAPTOP-L9L4QE0T MINGW64 /d/code/github/GitLearn (sortdev)
$ git branchmaster
* sortdev
git checkout -b sortdev
創建并切換分支sortdev,我在這個分支開發排序功能
使用git pull origin master 指定此分支的遠程倉庫,并拉取代碼
開發完成后,發現推送不成功
解決方案:
將sortdev分支,合并到master分支
git checkout master
git merge sortdev
PS D:\code\github\GitLearn> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS D:\code\github\GitLearn> git merge sortdev
Updating 4e9ad19..db08cf8
Fast-forwardmain.cpp | 13 +++++++++++++1 file changed, 13 insertions(+)
繼續推送
PS D:\code\github\GitLearn> git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 510 bytes | 510.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:luzhenren/GitLearn.git4e9ad19..db08cf8 master -> master
合并分支后,刪除原有分支
PS D:\code\github\GitLearn> git branch -d sortdev
Deleted branch sortdev (was db08cf8).
PS D:\code\github\GitLearn> git branch
* master
合并分支沖突
1. 確保工作目錄干凈
在合并分支之前,確保當前分支的工作目錄是干凈的(沒有未提交的更改),以免產生額外的合并問題。你可以使用以下命令查看當前工作目錄狀態:
git status
2. 切換到 master
分支(或目標分支)
切換到你希望合并到的目標分支(通常是 master
):
git checkout master
3. 合并 dev
分支到 master
分支
使用以下命令將 dev
分支合并到 master
分支中:
git merge dev
如果 dev
和 master
分支有沖突,Git 會提示你沖突的文件和位置。
4. 解決沖突
編輯沖突的文件,手動解決沖突部分。沖突的代碼塊通常格式如下:
<<<<<<< HEAD
內容來自當前分支(master)
=======
內容來自合并分支(dev)
>>>>>>> dev
你需要根據實際情況,決定保留哪一部分,或者手動合并它們的內容。修改后的文件可能是這樣:
合并后的最終代碼內容
完成每個沖突文件的修改后,保存文件并退出編輯器。
5. 標記沖突已解決并提交
解決所有沖突后,執行以下命令將修改添加到暫存區(staging area):
git add <沖突文件1> <沖突文件2> ...
然后提交解決沖突后的更改:
git commit -m "解決 dev 與 master 的沖突"
6. 繼續合并或推送
完成合并后,你可以將 master
分支推送到遠程倉庫:
git push origin master
遠程分支管理
版本迭代結束后開啟新迭代時,需要新開一個分支作為新版本開發分支
一般做法:我本地也創建一個新分支,追蹤遠程的新分支
PS D:\code\github\GitLearn> git checkout -b dev origin/dev1.01.00
Switched to a new branch 'dev'
branch 'dev' set up to track 'origin/dev1.01.00'.
指定了遠程倉庫后,以后git pull和push就不用使用origin指定遠程倉庫了
可以看到追蹤關系很明確
如果創建分支時沒有設置追蹤的遠程倉庫分支,使用git branch -u <遠程倉庫名>/<遠程分支名>
補救
Tag處理
如何使用Git將標簽推送到遠程倉庫|極客筆記
Git工作流實踐(!!!)
項目代碼遠程倉庫分支:
- master主分支
- dev開發分支
- release:發布分支
個人開發分支
- feature特性分支
- bugfix缺陷修改分支
- hotfix熱更新分支
開發階段流程總結
- 創建個人本地開發分支:
git checkout -b feature/add_new_line origin/dev
- 個人本地分支推送到遠程分支:
git push origin feature/add_new_line:feature/add_new_line
- 提交個人遠程代碼分支和目標代碼合入分支的MR,相關負責人進行CR
- 相關負責人提出意見,本地修改相應的代碼,推送到對應的遠程代碼分支上
- 代碼CR意見處理完,相關負責人進行代碼merge,代碼修改從feature/add_new_line合入dev分支完成
- 刪除個人遠程代碼分支
bug回歸階段操作同上