成爲Git使用高手

現在日常開發中都使用 git 作爲源碼管理工具,git 功能非常強大,但是對於研發不熟悉導致的問題也非常多,問題很多通常出現在使用 idea、eclipse 等開發工具操作 git 的時候,工程師還是需要對 git 的運行機制深入瞭解一下。本文主要敘述使用 git 命令來工作,熟練使用這些命令,足以應付日常開發了。


git 介紹

Git 是一套內容尋址文件系統,git本地保存快照和更新歷史。對於任何一個文件,在 Git 內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged)。已提交表示該文件已經被安全地保存在本地數據庫中了;已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中。
由此我們看到 Git 管理項目時,文件流轉的三個工作區域:Git 的工作目錄,暫存區域,以及本地倉庫。

基本的 Git 工作流程如下:

  1. 在工作目錄中修改某些文件。
  2. 對修改後的文件進行快照,然後保存到暫存區域。
  3. 提交更新,將保存在暫存區域的文件快照永久轉儲到 Git 目錄中。

另一種開發模式,類似於 github 的開發模式:

  1. 創建一個主倉庫
  2. 每個人開發者fork一份開發庫
  3. 開發者在自己fork出的代碼裏做開發
  4. 開發完後 pull request ,等待code review 審覈合併代碼
  5. 如果主倉庫有更新,先fetch,然後合併到自己的倉庫裏

下面會詳細敘述 git flow 開發模式,如果需求頻繁,又多人協作開發,而且需求發版和開發週期又很不固定的話,建議使用此模式。

git flow研發模式:

  1. 創建develop分支
git branch develop
git push -u origin develop
  1. 克隆中央倉庫,建好develop分支的跟蹤分支
git clone ssh://user@host/path/to/repo.git
git checkout -b develop origin/develop
  1. 基於develop建一個開發分支
git checkout -b some-feature develop
git push --set-upstream origin test-feture  把創建的分支上傳
  1. 開發完成後,合併到 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 分支提交
  1. 準備發佈:從develop拉一個release分支
git checkout -b release-0.1 develop
  1. 發佈完成後,合併到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
  1. 給master打tag:
git tag -a  0.1 -m "Initial public release" master
git push --tags 或者 git push origin 0.1
  1. 如果發現bug,要從master拉一個hotfix分支,修復bug,合併到master:
git checkout -b issue-#001 master
# Fix the bug
git checkout master
git merge issue-#001
git push
  1. 合併到develop:
git checkout develop
git merge issue-#001
git push
git branch -d issue-#001

其他命令

  1. git log 查看日誌
  2. 已經commit的回退到指定版本號:
git reset --hard commit_id 
    git push origin HEAD --force
  1. 撤銷文件等
//撤銷所有的已經add的文件
git reset HEAD .  
// 撤銷某個文件或文件夾:
git reset HEAD -filename
// 撤銷對所有已修改但未提交的文件的修改,但不包括新增的文件
git checkout .   
// 撤銷對指定文件的修改,[filename]爲文件名   
git checkout [filename]     
  1. git 更改遠程倉庫地址:
    origin 是默認的指向遠程代碼庫的名稱,可以更改; 也可以通過添加新的指向來指定到多個遠程代碼庫
git remote 可以列出當前的倉庫名稱
git remote -v 列出當前倉庫列表
git remote rm origin 先刪除
git remote add origin [email protected]:lemall-frd-activity/activityops.git   再添加
  1. git fetch:相當於是從遠程獲取最新版本到本地,不會自動merge
  2. git pull:相當於是從遠程獲取最新版本並merge到本地
  3. git checkout -f branchname 強制覆蓋本地文件
  1. 刪除遠程分支:
git push origin :branch-name
  1. 打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/標籤名
  1. 出現have diverged的情況下,處理方式:
git fetch origin
git reset --hard origin/test
  1. 將本地倉庫同中央倉庫同步
git remote show origin 查看中央倉庫信息
git remote prune origin  刪除本地的已經在遠端不存在的分支
  1. master 需要回退時,可以執行如下操作
git reflog show <branch name> 顯示本地操作歷史
master回退到指定的tag:
git show tag_name
git reset --hard  tag_id
git push -f -u origin master  //強制提交,需要確保master沒有被鎖定
  1. 多人協作開發時,如果git 合併不當很容易出現代碼衝突、覆蓋別人代碼的問題:
    提交順序:提交前先add 然後commit,然後再git pull--> 處理合並 --> 處理了合併之後,再commit --> 然後再push
    git fetch --all 並不會把更新的東西在當前展現,git log也看不到,只有執行了 git pull 之後git log才能看到其他人的更改
    git rebase —abort 回退到合併前

  2. 回退到指定提交的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 . #本地所有修改的。沒有的提交的,都返回到原來的狀態
  1. git stash #把所有沒有提交的修改暫存到stash裏面。可用git stash apply恢復。

  2. 開發分支操作

git branch -d **** 刪除本地分支
git branch -a  查看遠程分支
git branch  查看本地分支
git branch test 本地創建分支
git push origin test 把分支推到遠程
git push origin :br-1.0.0 刪除遠程版本
  1. 本地更換git遠程地址:
git remote rm origin
git remote add origin [email protected]:mp/sq-usercenter.git
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章