撤销
// 撤销工作区某个文件的更改
$ git checkout [file]
// 撤销工作区所有文件的更改
$ git checkout .
// 重置暂存区的指定文件,与上一次commit保持一致。但更改并没有消失,而是更改打回工作区
$ git reset [file]
// 重置暂存区与工作区,与上一次commit保持一致。
$ git reset --hard <当前分支名>
// 重置当前分支的指针为指定commit,同时重置暂存区。但更改并没有消失,而是更改打回工作区
$ git reset [commit]
// 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致。
$ git reset --hard [commit]
// 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
// 暂时将未提交的变化存入stash,稍后再弹出
$ git stash
$ git stash pop
git review
代码评审使用gerrit系统,git中使用git review <分支名>(默认是master) 命令执行review操作。
规则
•提交reivew之前pull远程代码,保证提交以前是最新代码,有冲突需要本地合并处理。
•一个单一的功能的变更放入一个commit中,提交一次reivew。
特殊情况
•review没有通过怎么办?
先回到要修改的那个commit
$ git reset --soft <要修改的那个commit的id>
继续修改你要改的文件。修改后add缓存文件,并执行
$ git commit --amend
将刚生产的变更归并到上一次变更里,继续执行git review
•已经做了多个提交commits怎么办?
如果多个提交是相关联的,请合并这个提交为一个提交
// 查询最先提交的commit, 记住id.
$ git log
// 进行变基操作
$ git rebase -i <上一步查到的id>
// 弹出的界面上罗列了最先提交的commit到现在的所有提交记录
//将每列开头的 'pick' 改成 's', 只保留第一列的 'pick'。
//保存修改后系统会自动把这些commits合并成一个commit.
// 如果遇到冲突需要手动解决。合并冲突后,继续变基, 直到所有commits都合并为止.
$ git rebase --continue
如果review中提交了多个commits,其中一个commit没review过怎么办(包括以前某个commit中没有生成change id)?一次commit对应生成一个review, 前一个review没通过的话,后面的review 通过了也提交不了。 必须把前面一个review 弄通过,后面的review才能提交。
// 查询未通过的review对应的commit id(gerrit里有记录)
// 回到这个commit的前一个节点,注意有个^
$ 执行 git rebase -i <未通过的review对应的commit id>^
// 修改并缓存要提交的文件后
$ git commit --amend
// 返回head处
$ git rebase --continue
// 提交对老review的更新
$ git review
特别提示
如果git review <分支名>后提示缺失commit_id,可能是前面rebase操作造成的。
// 现将rebase好的commit推回工作区
$ git reset head^
// 再重新add和commit,产生新的commit_id
$ git add .
$ git commit -m <备注信息>
$ git review <分支名>