基本的提交流程请参照pr-workflow,这里主要讲git的版本回退和一些细节问题

常用命令

git diff

git diff可以用来比较两个文件的变动,或者两个分支的变动

git diff <变动前的文件> <变动后的文件> #比较两个文件 git diff <变动前的提交> <变动后的提交> #比较两个文件

git reset

git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

以下是一些reset的示例:

# 回退所有内容到上一个版本
git reset HEAD^

# 回退a.py这个文件的版本到上一个版本
git reset HEAD^ a.py

# 向前回退到第3个版本
git reset –soft HEAD~3

# 将本地的状态回退到和远程的一样
git reset –hard origin/master

# 回退到某个版本
git reset 057d

# 回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit
git revert HEAD

常见问题

1. 如何回退某个文件到指定提交

git reset <commit> <path/to/file>  #恢复文件版本
git checkout <path/to/file>         #检出原来版本的文件

2. 删除本次提交(保留代码)

git reset <commit> #默认为 –mixed,保留代码,可以查看修改,重新提交
git status

3. 切换未提交的分支时如何保存原来的代码

git stash #缓存当前分支的修改,切换分支后不会丢失之前的修改。。

4. git 合并多个提交(包括message)

git log #查看提交历史
git rebase -i HEAD
# or git rebase -i <commit>
# 如果遇到冲突
# 需要先解决冲突 然后git add . 再git rebase --continue
git push origin dev -f #-f 强制提交

5. 本地过滤文件

有时需要过滤一些自己个人用的测试代码,但是又不想修改.gitignore 可以在.git/info/exclude中添加需要过滤的路径或文件。

比如

gulpfile.js/task/mobile-test.js
static/
static_resource/mobile/test

mobile/views/test/
templates/mobile/test

.ftpconfig

但是这种方法只能忽略未加入git版本库的文件,如果是已经加入版本库的文件,可以使用以下方法:

git update-index --assume-unchanged /path/to/file

如果需要取消,只需要运行以下命令就可以了

git update-index --no-assume-unchanged /path/to/file

6.只clone一个最新的commit

这种方法可以避免clone github上的项目因为太大而太慢..

git clone –depth=1 https://github.com/angular/angular-seed.git

7. git patch

git可以将diff导出为一个文件(patch),然后通过再应用这个文件,有两种方式

git diff的

git diff <prev_commit> <commit> > patch.diff
git apply patch.diff

git 本身的

git format-patch <commit1>..<commit2> #从commit1 到commit2的diff
git format-patch -1 <c1> # 单独一个commit
git format-patch <c1> # 从某commit以来的修改(不包含该commit)

git am xxx.patch

检查是否应用成功

git apply --stat patch.patch # 检查patch
git apply --check patch.diff # 测试应用patch

常用概念

HEAD 指向当前提交的一个指针 HEAD^^ HEAD往前两个版本 HEAD~3 HEAD回退3个版本