原文 Oh shit, git!

Git很难: 容易出错,还很难搞明白如何修复。而当你想通过搜索Git文档来寻求帮助时,又会陷入先有鸡还是先有蛋的困境:如果不是已经知道需要使用的解决方案名字的话,就没办法找出来解决方案。

下面用大白话列举了一些我曾经遇到的破事,以及最终是如何解决的。


该死,我犯了大错,拜托请告诉我Git有魔力让时光倒流!?!

git reflog
# 你会看到你在Git里面所有分支上的操作列表!
# 每一个都有索引 HEAD@{index}
# 找到犯错之前的那一条
git reset HEAD@{index}
# 时光机启动

你可以这样来找回误删除的文件、干掉那些错误的东西、恢复合并错了的文件,或者直接回退到一切运行正确的时候。 我经常要用到 reflog ,这也是很多人推荐添加的技巧!

该死,我刚提交就发现需要做一个小改动!

# 进行修改
git add . # 或者加入单独的文件
git commit --amend
# 按照提示修改火保留提交说明
# 现在你的提交已经包含修改了!

这事经常发生在我提交后运行测试或者linter检查时发现我忘记在等号后面加上空格。。。你也可以将修改作为一个新的提交,然后使用 rebase -i 来把提交合并,但是上面的方法要快很多。

该死,我需要修改上次的提交说明!

git commit --amend
# 按照提示修改提交说明

愚蠢的提交说明格式要求。

该死,我把应该发到新分支上的修改提交到了master!

# 从当前master创建新分支
git branch some-new-branch-name
# 从master移除提交
git reset HEAD~ --hard
git checkout some-new-branch-name
# 你的提交现在已经在新分支上了 :)

注意: 如果已经把提交推送到origin,这个方法就无效了。如果之前你还尝试了其它方法,那么你需要使用 git reset HEAD@{number} 替换 HEAD~ ,无尽的悲伤。同时,很多人推荐了这个之前我并不知道的简单方法,感谢你们!

该死,我提交错了分支!

# 撤销最后一次提交,但是保留文件修改
git reset HEAD~ --soft
git stash
# 移动至正确的分支
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here"
# 现在你的修改已经在正确的分支上了

很多人建议在这种情况下使用cherry-pick,你可以选择对自己来说最顺手的方式处理!

git checkout name-of-the-correct-branch
# 获取master分支上最后一次提交
git cherry-pick master
# 从master分支删除
git checkout master
git reset HEAD~ --hard

该死,我想运行diff,但是什么都没发生?!

git diff --staged

如果命令不使用 –staged 这个flag的话,Git不会去比较已经被添加至暂存区的文件。(这是个特性而不是bug,但是第一次碰到时会让人很迷惑)。

乱七八糟的,我放弃了。

cd ..
sudo rm -r fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-git-repo-dir

感谢 @viaz66 提供.


扩展阅读