git的一些操作记录

撤销merge

原因是这样,这个功能,本来是要的,可是就在正准备提交代码的时候,,产品说这个功能不要了..但是,那个功能的分支已经merge了啊,,无奈只能撤销

找到最后一次提交到master分支的版本号,即【merge前的版本号】

$ git log --pretty=oneline

file

会退到某个版本号

git reset --hard 【merge前的版本号】

file

执行结果

file

git log 查看结果

file

git rm 删除已经提交的文件

先看public/uploads正常状态,正常情况下uploads是一个软连接

drwxr-xr-x 2 root root 4.0K 1月  13 00:05 css
-rw-r--r-- 1 root root    0 12月 17 13:42 favicon.ico
drwxr-xr-x 3 root root 4.0K 12月 17 13:42 fonts
drwxr-xr-x 2 root root 4.0K 12月 23 01:07 images
-rw-r--r-- 1 root root 1.8K 1月  14 00:55 index.php
drwxr-xr-x 2 root root 4.0K 1月  22 10:15 js
-rw-r--r-- 1 root root   70 12月 17 13:42 mix-manifest.json
-rw-r--r-- 1 root root   24 12月 17 13:42 robots.txt
lrwxrwxrwx 1 root root   23 2月   5 23:25 uploads -> /data/iluoy.com/uploads
drwxr-xr-x 3 root root 4.0K 1月  13 00:05 vendor

查看.gitignore

// ......
/public/uploads/

提交代码之后的目录变化

在这里,我们看到即使我们在..gitignore添加了目录.其实还是提交上来了

drwxr-xr-x 2 root root 4.0K 1月  13 00:05 css
-rw-r--r-- 1 root root    0 12月 17 13:42 favicon.ico
drwxr-xr-x 3 root root 4.0K 12月 17 13:42 fonts
drwxr-xr-x 2 root root 4.0K 12月 23 01:07 images
-rw-r--r-- 1 root root 1.8K 1月  14 00:55 index.php
drwxr-xr-x 2 root root 4.0K 1月  22 10:15 js
-rw-r--r-- 1 root root   70 12月 17 13:42 mix-manifest.json
-rw-r--r-- 1 root root   24 12月 17 13:42 robots.txt
drwxr-xr-x 3 root root 4.0K 2月  13 14:24 uploads
drwxr-xr-x 3 root root 4.0K 1月  13 00:05 vendor

之后恢复的操作

我每次都要做这样的操作,基于uploads的服务才能正常运行

rm -rf public/uploads
ln -s /data/iluoy.com/uploads `pwd`/public

删除版本库中的public/uploads文件

git rm -r public/uploads
rm 'public/uploads/articles/7dfa5ab2efc14f12ed2707567e27f2e7.png'

git status

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    public/uploads/articles/7dfa5ab2efc14f12ed2707567e27f2e7.png

error: src refspec develop does not match any.

以下是提交记录,最开始以为是origin远端地址不对,后来检查了并且换了http和ssh都还是报这个错

➜  wechat-broker git:(master) git push origin develop
error: src refspec develop does not match any.
error: failed to push some refs to 'git@gitlab.xxxx.com:xxx/wechat-broker.git'

解决办法

先fetch一下保证远端地址正确,并且查看分支情况

➜  wechat-broker git:(master) git fetch
From http://gitlab.xxxx.com/xxxx/wechat-broker
 * [new branch]      develop    -> origin/develop
 * [new branch]      master     -> origin/master

切换到 develop 分支

因为之前是在master分支,所以提交不到develop分支上

git checkout -b develop
git push origin develop

git rm

git rm --cached

一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除

另外可以使用 git rm --cached 文件名 ,可以从缓存区移除文件(git add了,但是没有commit),使该文件变为未跟踪的状态

git rm --f

一种是 git rm --f "文件路径",不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶)

fatal: Unable to create '/mnt/www/iluoy.com/.git/index.lock': ?????.

➜  iluoy.com git:(master) ✗ git checkout .
fatal: Unable to create '/mnt/www/iluoy.com/.git/index.lock': ?????.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
rm -f ./.git/index.lock

关于git uploads文件忽略的一次事故和教训

public/uploads这个目录是存放项目上传资源的

ignore文件

....
/public/uploads/
....

file

由于一开始public/uploads这个文件夹就已经加到版本控制了,并且提交过,然后由于我有些时候有喜欢sftp到服务器,然后没问题了.就提交到版本库.然后再服务器同步代码,这样一来,就有了以下操作步骤

  • 修改本地代码, sftp到服务器,看效果..
  • 提交到版本库
  • 服务器上 git checkout .撤销所有已加入版本控制的文件修改
  • 服务器上git clean -fd删除为加入版本控制的文件
  • 服务器上git pull origin master拉取最新代码

删除软连的时候又酿成大祸

rm -rf uploads/

因为手快,加了个/导致磁盘文件也被删除...5555~~~

正确删除软连方式

rm -rf uploads

因为public/uploads是软连,然后每次拉去代码..软连都被代码更新覆盖..只能删除软连,在建立软连,赋予权限..这样必定会影响到线上

忽略public/uploads

//  删除已经提交的目录,并且保留本地文件
git rm -r --cached public/uploads

修改gitignore文件

// 前者只是忽略文件夹下的所有文件
// 后者才是忽略文件夹
/public/uploads/    改为  /public/uploads

提交修改

彻底删除/替换git远程仓库

这个操作,会清空master的代码,并提交新的代码上去

$ git remote add origin <url>
$ git push --force --set-upstream origin master

git查看某个文件的修改

git log -p 文件路径

更新单个或指定的文件

一般来说 我们更新代码会先更新composer.json和composer.lock然后安装好包后,再拉去所有代码..这样线上才不会有问题

  • 如果想拿远端git服务器上的最新版本(或某个特定版本)覆盖本地的修改,可以使用git pull命令,但这会全面更新本地代码库和工作拷贝.
  • 如果想放弃本地工作拷贝所做修改,可以使用git checkout file/to/path命令,但该命令只能用本地库覆盖你的工作拷贝,并不能取得远端版本的更新.

所以,正确的方法应该是先更新本地库(但不更新工作拷贝),然后用本地库来更新单个的工作拷贝文件.

git fetch
git checkout origin/master -- composer.json
git checkout origin/master -- composer.lock
composer install
git pull origin master

git commit message和change log

安装全局packages

brew install node
npm install -g commitizen
npm install -g conventional-changelog
npm install -g conventional-changelog-cli

校验是否安装成功

有以上插件即可

npm ls -g -depth=0

支持Angular的Commit message格式

commitizen init cz-conventional-changelog --save --save-exact

但是注意,因为commitizen工具是基于Node.js的,而我们iOS项目工程目录下是没有package.json文件,所以会报错:

npm WARN saveError ENOENT: no such file or directory, open '/Users/Elite/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/Users/Elite/package.json'

对于此种错误,创建一个空的package.json文件,然后进入到项目目录,执行

npm init --yes

添加changelog

此时项目中多了CHANGELOG.md文件,表示生成 Change log成功了。以后,凡是用到git commit 命令的时候统一改为git cz,然后就会出现选项,生成符合格式的Commit Message。实例如下:

conventional-changelog -p angular -i CHANGELOG.md -s

添加忽略文件

/node_modules/
/CHANGELOG.md

packages.json配置script脚本

  • npm run changelog 打印changelog在屏幕
  • npm run changelog-write 把changelog输出到CHANGELOG.md,这里有个前提是你必须要手动清理掉CHANGELOG.md的内容
"scripts": {
    "changelog": "conventional-changelog -p angular -i CHANGELOG.md -w -r 0",
    "changelog-write": "conventional-changelog -p angular -i CHANGELOG.md -s"
  }

参考文章