現在日常開發中都使用 git 作爲源碼管理工具,git 功能非常強大,但是對於研發不熟悉導致的問題也非常多,問題很多通常出現在使用 idea、eclipse 等開發工具操作 git 的時候,工程師還是需要對 git 的運行機制深入瞭解一下。本文主要敘述使用 git 命令來工作,熟練使用這些命令,足以應付日常開發了。
git 介紹
Git 是一套內容尋址文件系統,git本地保存快照和更新歷史。對於任何一個文件,在 Git 內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經被安全地保存在本地數據庫中了;已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中。
由此我們看到 Git 管理項目時,文件流轉的三個工作區域:Git 的工作目錄,暫存區域,以及本地倉庫。
基本的 Git 工作流程如下:
- 在工作目錄中修改某些文件。
- 對修改後的文件進行快照,然後保存到暫存區域。
- 提交更新,將保存在暫存區域的文件快照永久轉儲到 Git 目錄中。
另一種開發模式,類似於 github 的開發模式:
- 創建一個主倉庫
- 每個人開發者fork一份開發庫
- 開發者在自己fork出的代碼裏做開發
- 開發完後 pull request ,等待code review 審覈合併代碼
- 如果主倉庫有更新,先fetch,然後合併到自己的倉庫裏
下面會詳細敘述 git flow 開發模式,如果需求頻繁,又多人協作開發,而且需求發版和開發週期又很不固定的話,建議使用此模式。
git flow研發模式:
- 創建develop分支
git branch develop
git push -u origin develop
- 克隆中央倉庫,建好develop分支的跟蹤分支
git clone ssh://user@host/path/to/repo.git
git checkout -b develop origin/develop
- 基於develop建一個開發分支
git checkout -b some-feature develop
git push --set-upstream origin test-feture 把創建的分支上傳
- 開發完成後,合併到 develop 分支
git pull origin develop 合併功能前確保develop分支是最新的 git fetch --all
git checkout develop
git merge some-feature 合併
git push
git branch -d some-feature 刪除功能分支
//開發命令
git status 查看狀態
git add . 添加所有
git commit -a -m "描述"
git push 分支提交
- 準備發佈:從develop拉一個release分支
git checkout -b release-0.1 develop
- 發佈完成後,合併到master、develop,刪除release分支:
git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1
- 給master打tag:
git tag -a 0.1 -m "Initial public release" master
git push --tags 或者 git push origin 0.1
- 如果發現bug,要從master拉一個hotfix分支,修復bug,合併到master:
git checkout -b issue-#001 master
# Fix the bug
git checkout master
git merge issue-#001
git push
- 合併到develop:
git checkout develop
git merge issue-#001
git push
git branch -d issue-#001
其他命令
- git log 查看日誌
- 已經commit的回退到指定版本號:
git reset --hard commit_id
git push origin HEAD --force
- 撤銷文件等
//撤銷所有的已經add的文件
git reset HEAD .
// 撤銷某個文件或文件夾:
git reset HEAD -filename
// 撤銷對所有已修改但未提交的文件的修改,但不包括新增的文件
git checkout .
// 撤銷對指定文件的修改,[filename]爲文件名
git checkout [filename]
- git 更改遠程倉庫地址:
origin 是默認的指向遠程代碼庫的名稱,可以更改; 也可以通過添加新的指向來指定到多個遠程代碼庫
git remote 可以列出當前的倉庫名稱
git remote -v 列出當前倉庫列表
git remote rm origin 先刪除
git remote add origin [email protected]:lemall-frd-activity/activityops.git 再添加
- git fetch:相當於是從遠程獲取最新版本到本地,不會自動merge
- git pull:相當於是從遠程獲取最新版本並merge到本地
- git checkout -f branchname 強制覆蓋本地文件
- 刪除遠程分支:
git push origin :branch-name
- 打tag相關:
git tag -a master-2018-01-25 -m 'message'
git push origin master-2018-01-25
// 刪除本地標籤:
git tag -d 標籤名
// 刪除遠程標籤:
git push origin :refs/tags/標籤名
- 出現have diverged的情況下,處理方式:
git fetch origin
git reset --hard origin/test
- 將本地倉庫同中央倉庫同步
git remote show origin 查看中央倉庫信息
git remote prune origin 刪除本地的已經在遠端不存在的分支
- master 需要回退時,可以執行如下操作
git reflog show <branch name> 顯示本地操作歷史
master回退到指定的tag:
git show tag_name
git reset --hard tag_id
git push -f -u origin master //強制提交,需要確保master沒有被鎖定
多人協作開發時,如果git 合併不當很容易出現代碼衝突、覆蓋別人代碼的問題:
提交順序:提交前先add 然後commit,然後再git pull--> 處理合並 --> 處理了合併之後,再commit --> 然後再push
git fetch --all 並不會把更新的東西在當前展現,git log也看不到,只有執行了 git pull 之後git log才能看到其他人的更改
git rebase —abort 回退到合併前回退到指定提交的commit id
git reset --hard ,是回退到本地commit 的版本
回退到指定commit 版本,git reset --hard commitid
撤銷本地所有修改:git reset --hard hash 或者git checkout <sha1-of-a-commit 歷史版本>
git reset --hard HASH #返回到某個節點,不保留修改。
git reset --soft HASH #返回到某個節點。保留修改
git rebase —abort 回退到合併前
git checkout . #本地所有修改的。沒有的提交的,都返回到原來的狀態
git stash #把所有沒有提交的修改暫存到stash裏面。可用git stash apply恢復。
開發分支操作
git branch -d **** 刪除本地分支
git branch -a 查看遠程分支
git branch 查看本地分支
git branch test 本地創建分支
git push origin test 把分支推到遠程
git push origin :br-1.0.0 刪除遠程版本
- 本地更換git遠程地址:
git remote rm origin
git remote add origin [email protected]:mp/sq-usercenter.git