说真的,你需要学习 Git。
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
警告:接下来是抱怨。
我看过无数篇关于 Git 的文章(Git 是目前最热门的话题之一),但我仍然感到困惑,为什么真正花时间学习Git 的开发者如此之少。
你不懂 Git。
为了更清楚地说明我的意思,我们来玩个游戏。如果我让你创建一个功能分支,提交一些更改,然后发起一个拉取请求,我相信一切都没问题。但现在,让我改变一下游戏规则:
-
第一级:你不能使用任何外部工具,例如 GitLab 或你常用的 IDE。不能使用点击操作,只能在终端中操作。其他所有级别都适用此规则。
-
第二级:你需要将修改分成 5 个提交。额外说明:这些文件仅来自两个文件。请不要使用老套的方法,将所有修改复制到某个地方,然后逐个粘贴来“准备”每个提交。
-
第三级:你推送了提交 1 到 5,但你的审阅者要求更改提交 2 中的某些内容,重新排列提交 3 和 4,将提交 5 合并到提交 4 中,更改提交 1 的提交消息,并将你的分支变基到 master。
-
第四级:您在第三级操作中犯了错误。您需要“恢复”并重新开始,但您已经推送了更改,因此从原点强制拉取将不起作用。
-
附加题:代码库中引入了一个 bug,但你不知道是什么时候引入的。如何使用 Git 找到引发该 bug 的提交?
当你理解了git的概念和内部运作方式之后,这一切都是可以实现的——(我想写的是“当你开始真正关心你每天使用的工具时”)。
何必呢?嗯,我在游戏中概述的操作可以:
-
加快开发进程
-
让你的代码库更清晰,让代码审查更轻松:如果你的团队中的所有开发人员都学会了如何正确地拆分和组织提交,你就可以开始考虑常规提交、自动变更日志、原子提交、持续部署、清晰的审查流程等等。
-
让你适合开源:是的,如果你有一天想为 Linux 内核或其他重要代码库做出贡献,你就需要所有这些!
-
当有人(可能是你?)搞砸了 Git 仓库时,它可以救你一命。
-
[...请 ChatGPT 填写列表...]
别误会我的意思。我不是说每个人都应该精通 Git,但鉴于全球 99% 的代码库都通过 Git 管理,“使用 Git”已经成为日常操作,我认为花些时间了解它的强大功能是值得的。我自己也记不住所有的 Git 命令,但我了解的足以让我意识到它的各种可能性(以及该搜索什么)。
但你可以开始学习
既然我已经(希望!)说服了你,那么以下是一些入门指南。
从基础开始
先用最直接的方式学习 Git。暂时不要使用 IDE 或 Git 用户界面,直到你能够熟练地使用命令行完成所有基本操作。不要死记硬背,而是要思考 Git 底层的工作原理。例如,“暂存区”、“分支”和“远程”这些概念应该非常清楚。你还应该理解 `git .gitignore` 文件内部的内容.git/config、` .gitignoregit .gitignore` 的工作原理以及`git refs`是什么。
以下是一些我认为“基本”的命令:
-
显而易见的
clone,,,pullpushfetch -
远程管理:
git remote add|remove|show origin -
git status以及如何向暂存区添加(删除)文件/文件夹(例如git rm --cached -r foo/) -
提交(包含简短和详细的提交信息),尤其要修改最后一次提交(例如
git commit --amend --reset-author)。此外,请确保您知道如何撤销最近的提交(git reset --hard/--soft)。 -
基本的分支和标签管理:
git checkout [-b] ...,,git branch ...。git tag ...请注意,检出不仅适用于分支,也适用于文件! -
囤货(拜托,为了你自己!):
git stash/git stash pop,…… -
合并和基本变基:
git merge,git rebase -
理解
git log(或者更好git log --graph --format=oneline),并查看特定参考(git show,git revparse) -
其他一些实用命令:
git diff,,git revparse……
注:这是一条非常通用的建议。我刚开始学习编程时,我的第一堂Java课不是讲基本类型,而是讲函数式编程java。javac我一开始只用记事本和终端,直到上了四周课才被允许使用集成开发环境(IDE)。这真是个绝妙的主意,我一直铭记于心。
熟悉重新定型
git rebase它功能强大到令人眼花缭乱。光是摆弄它就能玩上好几个月。我个人只记住了两件事:(a) 如何将一个分支变基到另一个分支上(例如,git rebase master从特性分支变基);(b) 如何进行交互式变基。
亲自体验交互式变基,熟悉各种选项:pick,,,,。学习如何在变基过程中处理冲突,以及如何中止变基reword。editsquashfixup
如果你担心会搞砸,别忘了 Git 里没有什么是不可撤销的。你可以随时使用命令停止交互式变基git rebase --abort。如果你已经完成了变基,你仍然可以查看 reflog 日志 ;)
做实验,学习如何撤销任何操作。
害怕出错时,尝试新事物总是很困难。但你在本地仓库所做的任何操作都可以回滚。你可能已经了解了 `resolve`git reset和 `resolve` git pull --force,所以下一步是熟悉 `reflog`。
引用日志(reflogs)记录了本地仓库中分支和其他引用的修改历史。例如,创建/删除分支、执行变基、合并等操作都会记录引用日志。每个日志都关联一个 SHA 值,你可以使用 SHA 值像处理提交一样回溯到过去git reset <reflog SHA>。
剩下的就交给你自己去琢磨吧!既然你已经知道它的存在,那就没有理由胡乱尝试了:合并、变基、删除、随便搞砸,都没关系。
保持好奇心
当你重新使用 IDE / git GUI 时(提示:试试lazygit,它非常棒),一定要问问自己后台使用了哪些命令。
偶尔git --help查阅一下文档,了解一下你从未接触过的命令。例如,看看 `ls` git blame、git bissect`ls` 等命令。
询问你的同事们如何使用 Git,并向他们学习。分享你的学习成果,传播知识。
提升你的水平
既然你已经熟悉了 Git,是时候更进一步了。想想它如何帮助你简化流程,以及它能如何让你和你的团队受益。
此外,还有一些额外建议:
-
使用 GPG 密钥对提交进行签名(这会在 GitHub 上为您的提交添加漂亮的“已验证”徽章)。
-
使用 squash 保持 git 历史记录的整洁,并考虑采用原子提交。