git在工做中的一些用處

banner

更多內容,訪問 github
本週四分享會主題:__git在工做中的一些用處__。

git內容有很是多,若是要每一個命令都去熟悉和記憶的話,我以爲是沒有必要的,掌握基本的用法,在團隊合做中能快速定位問題和解決纔是重要的。基本的概念不會多說,都能在入門教程那些學習到。接下來會說下git在工做中比較經常使用的功能,會發現,其實git能作的事情仍是很是多的。javascript

git在開發中經常使用的命令

編輯和代碼提交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 .

image

git工做中經常使用命令基本能夠上圖歸納。
__web

其它經常使用的命令
單獨拿出來講是由於日常知道用的可能不會不少,但實際用起來會很是有用。bash

  1. git stash

當你在工做的時候,累計了比較多的改動,可是忽然間須要臨時切換到其它分支工做,但是又很差把中途工做的內容提交,那怎麼辦?這時候git stash就有用了。服務器

# 查看文件變動狀態
git status

# 儲藏變動,這時候會提示已儲藏變動
git stash

# 當在其它分支工做完回到原來分支的時候,能夠查看儲藏列表
git stash list

# 恢復儲藏,這時候文件變動就回來了,listNum爲列表序號
git stash apply stash@{listNum}
  1. git rebase

通常咱們完成代碼後,須要將分支的改動進行整合,會用到合併(merge)操做,但這不是惟一的方式,Rebase就是其中的代替方式。
先來講說merge。咱們在須要合併的時候,會有以下的兩種基本狀況: app

狀況1
其中一個分支沒有新的改動,而另外一個分支卻有改動。這個時候進行整合的話,git僅僅只是添加全部改動的分支的新提交便可。

狀況2
第二種就是咱們開發過程常常遇到的狀況,兩個分支都有不一樣的開發軌跡。爲了完成合並,git會建立一個新的提交來涵括它們之間的差別,這就是整合提交。

有人不喜歡這個合併的方式,但願項目有一個單一的開發軌跡,在流程上是一條直線,不但願在開發歷史記錄上看到被分紅過多個分支。這時候就能夠用到rebase操做了。

咱們仍是看第一個例子:

狀況1
若是咱們想合併分支B到A分支上,能夠用到下面這個命令:

git rebase branchB

git會進行這樣的操做:
「撤銷」全部分支A上與分支B開發分叉後的更改,這並非真的checkout掉更改,後面還會用到。
rebase1

而後它將整合分支B上的提交到A上,這要看,分支A和分支B就會像一條線同樣。
rebase2

最後,在分支A上的那些新的提交會被從新應用回來。
rebase3

  1. git resetgit revert

開發期間不免會有提交出錯代碼的狀況,如何進行版本回退呢?git reset命令就派上用場了.

  • git reset 爲重置提交,能夠將版本回退到某一個commit記錄上。git reset 命令後面是須要加2種參數的:–-hard 和 –-soft。這條命令默認狀況下是 -–soft。

區別:

默認參數 -soft,全部commit的修改都會退回到git暫存區。
參數--hard,全部commit的修改直接丟棄,當心用。

git reset --hard commit_id
git push origin [branchName] --force

固然若是--hard錯了,也還有救,git reflog命令記錄你的全部git操做,能獲取到原有的移除掉的commit_id。

  • git revert 爲還原提交,能夠將某個commit還原而後建立一個新的還原commit。字面意思已經很好理解了。好比:
# 某個commit的文件a增長兩行文字

git revert commit_id

# 執行該命令後,還原了這個commit文件a的更改,新增一個revert的commit,更改成增長的兩行文字被移除。

git工做流

這裏只說下最普遍應用的git工做流,也就是git flow。
在開發的初期,咱們定兩個分支:

  • 主分支master
  • 開發分支develop

規定,master分支爲版本發佈的分支,提供上線的版本。develop分支爲平常開發分支,存放最新的開發版本。通常的develop分支會切出以下的三個短時間分支:

  1. 功能分支(feature)
  2. 修bug分支(hotfix或者fix)
  3. 預發佈分支(release)

還有其它工做流?

固然有!下面就繼續說一個挺不錯的工做流:

功能分支工做流

這個工做流的核心思路是全部的功能開發都應該獨立一個分支,而主分支同樣是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

完畢。

還能怎麼發揮git做用?

webhooks

根據github的介紹,webhooks能夠經過使用github的事件被觸發時經過http post的形式調用服務器上的接口,服務器接受到推送事件以後就能夠執行構建,更新項目代碼,進而部署生產服務器等等。

這一切能限制的只有你的想象力。

通常而言,好比說我部署一個node程序到服務器上須要怎麼操做?

  1. 本地代碼開發完畢,準備上線,上傳本地代碼到git遠端倉庫。
  2. ssh鏈接遠程服務器,登陸管理員帳號密碼後進入命令行界面。
  3. 進入項目目錄,拉取最新提交的代碼。
  4. 執行部署操做。
  5. 須要代碼更新,重複此操做。

而我經過webhooks以後,這些操做獲得很大的簡化。

  1. 配置webhooks的push事件,由於我要在本地push代碼後執行後續操做。

image

  1. 在服務器上編寫一個自動部署腳本,這裏舉個簡單的腳本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'
  1. 用node寫一個監聽接口,不必定要node,只要能跑出個接口能監聽到事件便可。須要提到:
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那邊對應配置上。

  1. 完成以後,一旦代碼提交到master的話,就會觸發事件,而後自動執行後續操做。

git工具推薦

有幾個我的認爲不錯的git工具或者項目能夠提升git的使用。

  1. gitignore。在項目根目錄新建一個.gitignore文件,將不須要提交到git上的文件路徑添加到這個文件。在這個項目中能夠快速找到本身所屬項目的通用gitignore文件

gitignore

  1. [VS Code] gitignore。能夠右鍵將文件夾或者文件添加到.gitignore文件中。

gitignore

  1. [VS Code] GitLens。可讓每一行代碼都顯示歷史記錄等。

Gitlens

  1. [Chrome] octotree。瀏覽github上的代碼更加輕鬆便捷。

octotree

  1. Sourcetree。git圖形界面工具,講了那麼多命令應該能夠不用圖形界面了吧😀。

sourcetree

最後

分享內容大概如此了,歡迎補充,也但願內容有些幫助。😄

參考
Rebase 代替合併
git 工做流-阮老師的
git 工做流
相關文章
相關標籤/搜索