更多内容,访问 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 工做流