Oh! 让人抓狂的git!

Git很难:因为搞砸了很容易,但是找到如何修复错误的方法缺很难。Git官方的文档,存在“先有鸡还是先有蛋”的问题——除非你知道解决问题的方法的特定名字,否则很难查询到解决方案并顺利的解决自己的问题。
所以,下面是我自己曾经遇到的一些十分糟糕的场景,并且我最终解决了这些问题,下面就用最通俗的话介绍一下。

Oh shit,我做了一件大错事!请告诉我Git有时间机器这样的东西!

git reflog
#你会看到通过git提交的每一项内容的清单列表,包含所有的分支
#每一项提交都有自己的索引:HEAD@{index}
#找到你误提交的前一个分支
git reset HEAD@{index}
#神奇的时光机!

你可以通过这种方式来恢复误删除的内容,也可以移除导致目录错乱的提交,或者恢复一个糟糕的合并,或者只是回退到某个所有的事情都是ok的时间点。我平时大量的使用relog,这个一定要告诉更多的人!
Oh shit,提交之后我才意识到还需要做一个小改动!

#做你的改动
git add . # or add individual files git commit --amend
#根据提示修改或者保留提交信息
#这时,你的上一次提交就包含本次变动啦

这种情景经常在我提交之后发生,然后我特喵的还要运行一些脚本……这个就不多提了,说多了都是泪。你也可以把这个改变作为一个新提交,然后执行rebase -i把两个提交揉成一起,但是最开始提到的方法大概要快很多。
Oh shit,我需要调整我上一次提交的信息!

git commit --amend
#根据提示来保留或者改变提交信息

对提交信息的格式,这特么的有个愚蠢的要求。
Oh shit,我误将应当提交到一个新分支的内容提交master上了!

#创建一个基于master的当前状态的新分支
git branch some-new-branch-name
#移除到master上的提交
git reset HEAD~ --hard git checkout some-new-branch-name
#现在你的提交仅存在在这个新分支中啦 :)

注意:如果你已经将提交push到远端,则这个方法不会生效,如果你已经尝试了其他方法,可能你需要先git reset HEAD@{number}而不是HEAD~。此外,很多人建议了这个更短但是更炫酷的方法,而我自己之前并不知道~感谢大家!
Oh shit,我不小心提交到错误的分支上了!

#撤销上一次提交,但是保留变更可用
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

Oh shit,我想运行一下diff,但是啥效果也没有?

git diff --staged

如果不使用–staged,git不会对比已经add-ed的文件之间的差异。
妈的智商,我放弃了……

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

爱咋咋,直接删除重新clone!(手动doge脸)

本文文字及图片出自 www.jointforce.com

余下全文(1/3)
分享这篇文章:

请关注我们:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注