更多內容,訪問 github
本週四分享會主題:__git在工做中的一些用處__。
git內容有很是多,若是要每一個命令都去熟悉和記憶的話,我以爲是沒有必要的,掌握基本的用法,在團隊合做中能快速定位問題和解決纔是重要的。基本的概念不會多說,都能在入門教程那些學習到。接下來會說下git在工做中比較經常使用的功能,會發現,其實git能作的事情仍是很是多的。javascript
編輯和代碼提交html
# 爲git初始化一個代碼庫 git init # 將目錄的全部文件提交到暫存區 git add . # 提交暫存區到代碼倉庫區,並添加提交信息 git commit -m "commit message"
分支處理java
# 列出本地全部的分支 git branch # 列出遠程倉庫的全部分支 git branch -r # 列出倉庫的全部分支(包含遠端和本地分支) git branch -a # 切換到指定分支,並更新工做區 git checkout [branchName] # 新建一個分支並切換到該分支 git checkout -b [branchName] # 刪除一個分支 git branch -d [branchName] # 強制刪除一個分支 git branch -D [branchName]
查看狀態信息node
# 查看變動的文件,可多用這個命令查看當前文件改動狀態 git status # 查看當前分支提交歷史,能夠獲得加密的commit_id git log # 查看暫存區和工做區的對比 git diff
同步遠程倉庫git
# 同步遠程倉庫的全部更新 git fetch [remote] # 顯示全部遠程倉庫 git remote -v # 增長一個新的遠程倉庫,並定義一個遠程倉庫名,shortName經常使用origin,固然可自定義 git remote add [shortName] url # 拉取遠端分支,並與本地分支合併 git pull [remote] [branchName] # 上傳本地分支到遠端 git push [remote] [branchName]
撤銷操做github
# 恢復暫存區的指定文件到工做區 git checkout [file] # 恢復暫存區的全部文件到工做區 git checkout .
git工做中經常使用命令基本能夠上圖歸納。
__web
其它經常使用的命令
單獨拿出來講是由於日常知道用的可能不會不少,但實際用起來會很是有用。bash
git stash
當你在工做的時候,累計了比較多的改動,可是忽然間須要臨時切換到其它分支工做,但是又很差把中途工做的內容提交,那怎麼辦?這時候git stash就有用了。服務器
# 查看文件變動狀態 git status # 儲藏變動,這時候會提示已儲藏變動 git stash # 當在其它分支工做完回到原來分支的時候,能夠查看儲藏列表 git stash list # 恢復儲藏,這時候文件變動就回來了,listNum爲列表序號 git stash apply stash@{listNum}
git rebase
通常咱們完成代碼後,須要將分支的改動進行整合,會用到合併(merge)操做,但這不是惟一的方式,Rebase就是其中的代替方式。
先來講說merge。咱們在須要合併的時候,會有以下的兩種基本狀況: app
其中一個分支沒有新的改動,而另外一個分支卻有改動。這個時候進行整合的話,git僅僅只是添加全部改動的分支的新提交便可。
第二種就是咱們開發過程常常遇到的狀況,兩個分支都有不一樣的開發軌跡。爲了完成合並,git會建立一個新的提交來涵括它們之間的差別,這就是整合提交。
有人不喜歡這個合併的方式,但願項目有一個單一的開發軌跡,在流程上是一條直線,不但願在開發歷史記錄上看到被分紅過多個分支。這時候就能夠用到rebase操做了。
咱們仍是看第一個例子:
若是咱們想合併分支B到A分支上,能夠用到下面這個命令:
git rebase branchB
git會進行這樣的操做:
「撤銷」全部分支A上與分支B開發分叉後的更改,這並非真的checkout掉更改,後面還會用到。
而後它將整合分支B上的提交到A上,這要看,分支A和分支B就會像一條線同樣。
最後,在分支A上的那些新的提交會被從新應用回來。
git reset
和git revert
開發期間不免會有提交出錯代碼的狀況,如何進行版本回退呢?git reset命令就派上用場了.
區別:
默認參數 -soft,全部commit的修改都會退回到git暫存區。
參數--hard,全部commit的修改直接丟棄,當心用。
git reset --hard commit_id git push origin [branchName] --force
固然若是--hard錯了,也還有救,git reflog
命令記錄你的全部git操做,能獲取到原有的移除掉的commit_id。
# 某個commit的文件a增長兩行文字 git revert commit_id # 執行該命令後,還原了這個commit文件a的更改,新增一個revert的commit,更改成增長的兩行文字被移除。
這裏只說下最普遍應用的git工做流,也就是git flow。
在開發的初期,咱們定兩個分支:
規定,master分支爲版本發佈的分支,提供上線的版本。develop分支爲平常開發分支,存放最新的開發版本。通常的develop分支會切出以下的三個短時間分支:
還有其它工做流?
固然有!下面就繼續說一個挺不錯的工做流:
功能分支工做流
這個工做流的核心思路是全部的功能開發都應該獨立一個分支,而主分支同樣是master。這樣的隔離開發不會擾亂主分支上的代碼,也能保證主分支的代碼準確無誤。
這種方式讓pull request變得更加有效果。過多的就不解釋,經過一個例子看看這個工做流究竟是如何工做的。
小紅開始開發一個新功能
理所固然,從master切出一個獨立功能分支:
git checkout -b feature-new master
持續打碼,中途完成部分:
git status git add [file] git commit -m 'xxx'
中午去吃個飯
在吃午餐前,小紅把本身的功能分支推到了遠端倉庫。好習慣,多學習。
git push origin feature-new
小紅完成開發
在合併以前,小紅保證遠端倉庫有本身功能分支的最新代碼。
git push origin feature-new
接下來,能夠發起一個合併請求,在github或者gitlab都有快捷的合併請求操做。合併功能分支feature-new到master。發起後,團隊均可以收到合併請求的通知。
這時候團隊能夠code review,有問題就能夠繼續提示小紅去修正。
修正後小紅能夠持續推代碼到功能分支,commit記錄也會一併出如今pull request處。
小紅髮布功能
通過緊張的討論修改,終於完成功能開發,要發佈功能:
git checkout master git pull git pull origin feature-new git push
完畢。
webhooks
根據github的介紹,webhooks能夠經過使用github的事件被觸發時經過http post的形式調用服務器上的接口,服務器接受到推送事件以後就能夠執行構建,更新項目代碼,進而部署生產服務器等等。
這一切能限制的只有你的想象力。
通常而言,好比說我部署一個node程序到服務器上須要怎麼操做?
而我經過webhooks以後,這些操做獲得很大的簡化。
deploy.sh
。#!/bin/bash echo 'enter project' cd [your project dir] echo 'pull code' git pull origin master echo 'deploy' pm2 start deploy.js pm2 logs deploy echo 'deploy finished'
const createHandler = require('node-github-webhook') const config = { path: '/hook', secret: 'your srcret' } const handler = createHandler(config) ... handler.on('push', function (event) { execFunc('sh ./deploy.sh') })
這裏的path和secret都須要在github webhooks那邊對應配置上。
有幾個我的認爲不錯的git工具或者項目能夠提升git的使用。
.gitignore
文件,將不須要提交到git上的文件路徑添加到這個文件。在這個項目中能夠快速找到本身所屬項目的通用gitignore文件
VS Code
] gitignore。能夠右鍵將文件夾或者文件添加到.gitignore文件中。
VS Code
] GitLens。可讓每一行代碼都顯示歷史記錄等。
Chrome
] octotree。瀏覽github上的代碼更加輕鬆便捷。
分享內容大概如此了,歡迎補充,也但願內容有些幫助。😄
參考
Rebase 代替合併
git 工做流-阮老師的
git 工做流