Git

Git 自救指南


Git 虽然因其分布式管理方式,不完全依赖网络,良好的分支策略,容易部署等优点,已经成为最受欢迎的源代码管理方式。但是一分耕耘一分收获,如果想更好地掌握 Git,需要付出大量的学习成本。即使在各种 GUI 的加持下,也不得不说 Git 真的很难,在 V2EX 上也常有如何正确使用 Git 的讨论,同时在 Stackoverflow 上超过 10w+ 的 Git 相关问题也证明了 Git 的复杂性。再加上 Git 的官方文档也一直存在着 “先有鸡还是先有蛋” 的问题,虽然文档非常全面,但如果你不知道你遇到的问题叫什么,那么根本就无从查起。

本文节选自 Katie Sylor-Miller 在日常工作中所遇到过的让他很头疼的 Git 相关问题,并整理了相应的应对措施,在这里分享给正在学习如何使用 Git 的同学们。当然这些应对措施并不是唯一的,可能你会有其他更好的应对方法,这也恰恰是 Git 这套版本控制系统强大的地方。如果你想和更多 Git 技术专家交流,可以加我微信liyingjiese,备注『加群』。群里每周都有全球各大公司的最佳实践以及行业最新动态

我刚刚好像搞错了一个很重要的东西,但是 Git 有个神奇的时间机器能帮我复原!
git reflog
# you will see a list of every thing you've done in git, across all branches!
# each one has an index HEAD@{index}
# find the one before you broke everything
git reset HEAD@{index}
# magic time machine

reflog 是一个非常实用的命令,你可以使用这个命令去找回无意间删除的代码,或者去掉一些刚刚添加的却把仓库里的代码弄坏的内容。同时也可以拯救一下失败的 merge,或者仅仅是为了回退到之前的版本。

我 commit 完才想起来还有一处小地方要修改!
# make your change
git add . # or add individual files
git commit --amend
# follow prompts to change or keep the commit message
# now your last commit contains that change!

当我 commit 完然后跑测试的时候,经常突然发现忘了在等于号前面加空格。虽然可以把修改过的代码再重新 commit 一下,然后 rebase -i 将两次揉在一起,不过上面的方法会比较快。

我要改一下上一个 commit message!
git commit --amend
# follow prompts to change the commit message

当你们组对 commit message 有格式要求时,或者当你忘了中英文间要加空格,这个命令能救你狗命。

我不小心把本应在新分支上的内容 commit 到 master 了!
# create a new branch from the current state of master
git branch some-new-branch-name
# remove the commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# your commit lives in this branch now :)

注意:这个指令必须在错误的 commit 后直接执行,如果你已经试了其他的方式,你可能就需要用 git reset HEAD@{number} 来代替 HEAD~ 了。

我不小心 commit 到错误的分支上了!
# undo the last commit, but leave the changes available
git reset HEAD~ --soft
git stash
# move to the correct branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here"
# now your changes are on the correct branch

也有很多人推荐了 cherry-pick 的解决方案,所以选哪个就看你心情了。
git checkout name-of-the-correct-branch
# grab the last commit to master
git cherry-pick master
# delete it from master
git checkout master
git reset HEAD~ --hard

我执行了 diff 但是啥也没出现
git diff --staged

Git 不会给通过 add 加入到 staging 区域里面的文件做 diff ,除非你加了 --staged 的标签,别怀疑了这是一个 feature 不是一个 bug,当然对于第一次碰到这个问题的人来说还是有些不好理解的。

Git 从入门到放弃
cd ..
sudo rm -r fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-git-repo-dir

为了维护最后的尊严 XD

原文链接:https://mp.weixin.qq.com/s/kr0KrwpueC73PD8Ma_AuWg

0 个评论

要回复文章请先登录注册