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 提供.