之前都是直接用Github for windows图形客户端来上传代码,并不了解git的命令,也远没有发挥出git应有的威力。现在在作一个CMS的项目,最后须要将其部署到远端服务器上,而通过前端工程化思想的洗礼以后,我已没法忍受手工传文件到服务器的"FTP部署法",由于这样原始低效易出错,且严重不利于维护更新。本着能自动化就自动化的精神,我开始研究用git来部署网站的方法。
git仓库(repo)是指存放项目文件的目录,这个目录下有一个.git隐藏文件(若是没有,用git init生成),里面是用于版本管理的相关文件,别乱动。
.git是版本库,其中最重要的是stage(暂存区),还有git自动建立的分支master,以及指向master的一个指针HEAD。
进入暂存区的文件被暂时“锁定”等待提交,文件在加入暂存区以后发生的变更不影响暂存区,提交以暂存区版本为准。
注意:命令里能够使用通配符*?等。
经常使用命令
git init 初始化版本库(--bare 生成裸库,即只有记录版本库历史信息的文件,而没有实际项目源文件的拷贝)
git add [file]:将文件添加到暂存区等待提交。文件被添加暂存区后所发生的变更将不被提交,除非从新添加一次。
git commit -m [message]:将暂存区的文件提交到HEAD指向的当前分支上
git diff [file]:查看文件相对于分支上的变更
git status [file]:查看文件状态
git checkout -- [file]:用暂存区文件覆盖工做区文件,至关于丢弃上次add以来的变更。git checkout . 表示用暂存区的全部文件覆盖工做区文件。
git log 查看提交日志
git reflog 查看最新动做日志
git reset --hard [版本号] 恢复指定版本
git reset -hard HEAD^ 恢复到上一个版本(一个^表示一个版本,或者用~[数字]表示回退版本数)
分支策略
通常master分支是最稳健的,用于发布新版本,不能在上面干活,干活都应该在别的分支上,干完再合并到master。
git branch [branch] 建立新分支
git checkout [branch] 切换到指定分支(带上-b参数表示同时建立新分支)。切换分支后,仓库里的文件内容会变到与当前分支相同。
git merge [branch] 将指定分支合并到当前分支。当合并分支与当前分支有冲突时,git会在合并后的文件中标注出来,须手动消除冲突后再提交一次。
git branch -d [branch] 删除指定分支
git stash 隐藏当前分支的工做现场,好比工做进行到一半时没法提交,但必须切换分支,此时可以使用这个命令。
git stash list 列出被隐藏起来的工做现场
git stash apply/drop 恢复现场/...并删除隐藏的工做现场
远程操做
git remote 查看远程库信息(参数-v查看详细信息)
git remote add [remote branch] [server]:在远端服务器上克隆本地仓库,远程库名默认为origin
git push [remote branch] [branch]:将分支推送到远端仓库(第一次推送时在push后面加上-u参数)
git clone [remote address]:将远端(Github)的仓库克隆到本地,git自动将本地master和远程master对应起来
策略:哪些分支须要推送?
- master是主分支,须要时刻与远程同步
- 开发分支不须要推送到远程,能够合并到master以后再推送
git pull 从远程拉取分支到本地
git branch --set-upstream-to [local branch] origin/[branch] 关联本地分支与远程分支
多人协做工做模式通常是这样的:前端
- 首先,能够试图用git push origin branch-name推送本身的修改.
- 若是推送失败,则由于远程分支比你的本地更新早,须要先用git pull试图合并。
- 若是合并有冲突,则须要解决冲突,并在本地提交。再用git push origin branch-name推送。
附:利用git向服务器部署Node.js项目代码的方法:node
- 在服务器上建立项目目录,初始化为git仓库:git init,配置为容许接收代码提交:git config receive.denyCurrentBranch ignore
- 在本地项目建立远程分支:git remote add 远程分支名 ssh://用户名@远程地址/项目路径/.git
- 将项目的master分支push到服务器上:git push 远程分支名 master
- 到服务器端git staus,会发现暂存区内一堆的反操做(例如将原本应该保留的文件delete掉)。此时先更新再检出代码 git update-server-info、git checkout -f,效果是将全部文件还原到最后一次commit的版本,暂存区内的修改被丢弃。
- 而后npm install补上node_modules就能够了!
- 服务器端添加自动更新钩子脚本:1)cd .git/hooks;2) 新建 post-receive 或将 post-receive.sample 重命名为 post-receive;使用post-update也能够, 不过须要先将post-update中的exec git update-server-info这一行删掉;3)vim post-receive,将以下内容复制到文件中
- #!/bin/sh
- unset GIT_DIR
- cd ..
- git checkout -f
- 安装pm2来守护网站
- 在Linux系统下监听低于1024的端口,须要root权限,为此用一个变通的办法,即利用ip表设置80端口的信息与3000端口互相转发,此转发在网卡层面,性能很高。方法以下:
- 输入sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
- 切换到root用户
- 输入iptables-save>/etc/iptables-rules
- 编辑/etc/network/interfaces文件,在最后一行插入:pre-up iptables-restore</etc/iptables-rules,实现开机自动配置