Oh! 让人抓狂的git!

原文:Oh shit, git!     
译者:杰微刊兼职译者张帆

 

Git很难:因为搞砸了很容易,但是找到如何修复错误的方法缺很难。Git官方的文档,存在“先有鸡还是先有蛋”的问题——除非你知道解决问题的方法的特定名字,否则很难查询到解决方案并顺利的解决自己的问题。


所以,下面是我自己曾经遇到的一些十分糟糕的场景,并且我最终解决了这些问题,下面就用最通俗的话介绍一下。

 

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

1
  

 

``` 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脸)

猜你喜欢

转载自blog.csdn.net/ichsonx/article/details/52701505