翻译自Oh shit, Git! 原文作者:Katie Sylor-Miller

Git很难,搞砸却很容易.特别是想要搞清楚你该怎么补救你犯得错误简直是不可能的.
Git文档也有着一个“先有鸡还是先有蛋的问题”:你几乎不知道该怎么去查找解决你遇到的问题的方法,除非你已经知道了能够解决你遇到的问题的方法的名字.
以下我将通过平直的语言列举一些我遇到过并陷入其中的糟糕问题,并最终我是怎么摆脱它们的.

哦豁完蛋,我刚刚做了一些非常糟糕的操作,谁能帮我找哆啦A梦借台时光机!

1
2
3
4
5
6
git reflog
# 你将会看到你之前在git的操作的列表,无论是在哪个分支上
# 每一条都有一个索引,表现为HEAD@{index}
# 找到你最早把事情搞砸之前那一步的索引
git reset HEAD@{index}
# 时间回到了过去!

你可以用它来找回你不小心删除并提交了的内容,或者删除一些你把Git仓库搞炸的操作,或者从一次糟糕的merge中恢复到原来的状态,亦或是你只是想回到过去某一个一切都能正常工作的节点.我 经常 使用reflog,有许多许多许多许多的人建议我把它加在这里.

哦豁完蛋,我刚刚提交完,发现还有一些东西需要改!

1
2
3
4
git add . # 或者 add 你需要提交的文件
git commit --amend
# 根据提示修改或保留你上次提交的提交信息
# 现在,你上次的提交就已经包含了你刚刚作出的修改

我常常在写完代码,跑完测试然后提交准备上传发布的时候突然发现忘记做代码格式化而产生这样的问题.虽然你也可以直接提交一个新的提交记录然后通过 rebase -i 来合并这次提交和上次提交,但是相信我,前者的速度比后者快一百万倍!

哦豁完蛋,我刚刚提交的时候写错了提交信息!

1
2
git commit --amend
# 根据提示修改你上次提交的提交信息

有时候一份没有错别字的提交记录更能够帮助你的同事理解你的工作成果

哦豁完蛋,我刚刚不小心提交到了master,但是这应该是在一条新分支上面提交的!

1
2
3
4
5
6
# 在你错误提交之后在现有的状态下创建一条新分支
git branch 新分支名
# 从master分支删掉你的错误提交
git reset Head~ --hard
git checkout 新分支名
# 现在你已经在你本来想要提交到的新分支上了

注意:如果你已经上传到了远程仓库,那么这条方法将就帮不了你了

哦豁完蛋,我不小心提交到了错误的分支上!

1
2
3
4
5
6
7
8
9
# 撤销上次提交,并保留修改的文件
git reset Head~ --soft
git stash save
# 跳转到正确的分支上
git checkout 正确的分支名
git stash pop
git add .
git commit -m "提交信息"
# 现在你的提交就已经到了正确的分支上了

有许多人建议在这种情况下使用cherry-pick,所以以下是cherry-pick的写法,你可以挑你喜欢的来用

1
2
3
4
5
6
git checkout 正确的分支名
# 从错误提交的分支提取出你需要的提交
git cherry-pick 错误提交的分支名
# 去错误提交的分支上删除错误的提交
git checkout 错误提交的分支名
git reset Head~ --hard

我受够这一团乱麻了,我放弃了!

1
2
3
4
cd ..
rm -rf ./仓库目录名/
git clone 远程仓库url 仓库目录名
cd 仓库目录名