git stash recover 恢复

git stash 算是经常要用到的了,切换分支的时候常常要先把一些文件给暂存起来。备忘两个问题:

1)git stash 默认不会把untracked files加进去,如果希望把不在版本库的文件也加进去,如何做?

git stash -u

2) git pop 后refs会被dropped掉,我们会看见如下的信息:

Dropped refs/stash@{0} (f798acc46e0838e5c826d177124ab95a73ac92ca)

如何恢复?

很简单,如果我们能得到那串SHA1的值,直接

git stash apply f798acc46e0838e5c826d177124ab95a73ac92ca

如果我们找不到SHA1的值了,可以在git的–lost-found中找到:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

拿到SHA1的值只要再apply就可以了

http://stackoverflow.com/questions/89332/recover-dropped-stash-in-git

git merge vs rebase vs cherry-pick

git merge是用来合并两个分支的。

# 将b分支合并到当前分支
git merge b

git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。

# 先在v3.0中查看要合并的commit的commit id
git log
# 假设是 commit f79b0b1ffe445cab6e531260743fa4e08fb4048b

# 切到v2.0中
git check v2.0

# 合并commit
git cherry-pick f79b0b1ffe445cab6e531260743fa4e08fb4048b

git rebase有点类似git merge,但是两者又有不同,打个比方,你有两个抽屉A和B,里面都装了衣服,现在想把B中的衣服放到A中,git merge是那种横冲直撞型的,拿起B就倒入A里面,如果满了(冲突)再一并整理;而git rebase就很持家了,它会一件一件的从B往A中加,会根据一开始放入的时间顺序的来加,如果满了你可以处理这一件,你可以继续加,或者跳过这一件,又或者不加了,把A还原。所以merge适合那种比较琐碎的,简单的合并,系统级的合并还是用rebase吧。

专业的区别请移步到这里合并和衍合

# 合并b
git rebase b

# 处理完冲突继续合并
git rebase --continue

# 跳过
git rebase --skip

# 取消合并
git rebase --abort

git 备忘

1)如何取消上一次的提交

git reset --soft HEAD^
git commit -a -c ORIG_HEAD #ORIG_HEAD 是reset时对HEAD的拷贝

2)如何取消全部的本地修改

# 如果你没有提交
git checkout .
# 如果你提交了先
git reset
# 然后
git checkout .

3)如果我想切另外一个分支,但是当前分支有了修改,当前分支修改还没有完成,所以又不想提交,怎么办?

# 临时保存当前分支的修改
git stash
# 更复杂点
git stash save [--keep-index] [<message>]
# 列出所有的stash
git stash list
# 恢复
git stash apply
# or
git stash pop


注意:这个命令不会保存当前分支中Untracked的文件,所以记得在切到其他分支的时候,谨慎使用git clean

4)设定user name 和 email

# 全局设定
git config --global user.name "zires"
git config --global user.email "xxx@xx.com"

# 或者切到一个单独的repos中单独设置
git config user.name "zires"
git config user.email "xxx@xx.com"

5)打补丁

# git format-patch -n {commit_id}
git format-patch -1 {commit_id}
# 会生成一个0001-{commit message}.patch的文件

git am 0001-{commit message}.patch.patch # 或者
git apply 0001-{commit message}.patch.patch