git:undo operation

undo a commit

取消提交可以使用:git reset
git reset有四个选项,mixed,hard,merge,soft,具体区别参见上面的链接。
如果只是想取消提交,但是保留提交的文件更改,可使用--soft,如果直接discard修改,可用--hard

// undo commit,
// changes are as they were just before the changed commit
git reset --soft HEAD~1

undo a merge

取消分支合并也是使用git reset。撤销分支合并一般是直接丢弃合并过来的提交,选用--hard

git reset --hard commit_sha

// OR 
// get you back 2 commits 
git reset --hard HEAD~2
  • 第一种方法:commit_sha 是merge之前的commit_sha
  • 第二种方法:分支上可能有多次commit,有几次数字就是几

undo a push

push了的代码覆水难收,不过有一些迂回的方案可以解决。

git revert

git revert is used to record some new commits to reverse the effect of some earlier commits (often only a faulty one). If you want to throw away all uncommitted changes in your working directory, you should see git-reset(1), particularly the --hard option. If you want to extract specific files as they were in another commit, you should see git-checkout(1), specifically the git checkout -- syntax. Take care with these alternatives as both will discard uncommitted changes in your working directory.

git revert commit_sha

commitsha 是希望revert的commit。命令的操作是revert指定的commit,而不是revert到指定的commit。这点和reset不一样,reset是_reset到指定的commit,之前的commit也会被reset影响。

git apply

应用git apply 和 git diff,就是将更改反过来,原理和git revert类似

git apply <(git diff HEAD commit_sha)

undo local branch delete

误删分支是一件很令人抓狂的事,不过git有一点比较好,多有commit过的东西都能找回来(貌似是这么说,我没实践过)。

use git reflog to find SHA1 of the last commit of branch,then

git branch branchName <SHA1>

update: 2013-08-07 12:18:39

感谢jiaojiao的补充

获取SHA1值的方法

正常的分支其实指向的是一个commit,保存的是一个commit的SHA值, 只要知道SHA就可以了;
两个方法可以知道SHA的值

  • git reflog 获得的是.git/logs里面记录的值, 效果同 git log -g;

    每一次HEAD指针的变化都会被记录在在.git/logs

  • git fsck --full 通过检查数据完整性,显示所有未被引用的对象

    不过不小心删除分支, logs里面的记录又由于各种原因被删掉了, 可以用这个;用git cat-file -p SHA > diff 参看最近的对象即可

加入过缓存区的文件都可以找回来

所有git add过的内容都可以被找回来。

使用上面第二种方案找到SHA1值,可以找到文件的快照,利用git cat-file --file -p读出内容

Reference

comments powered by Disqus