Git版本管理工具入门及常用命令讲解---小白版
我们就用一个非常生活化的例子来贯穿整个 Git 的讲解:编写一份『西红柿炒鸡蛋』的菜谱。
假设你是一个厨艺小白,想用 Git 来管理你的菜谱创作过程。我们会一步步来看,Git 是如何帮助你记录每一次修改、防止内容丢失、以及如何与他人协作的。以下的所有操作都在Ubuntu22.04版本上进行,但是原理都差不多,图片是我实际操作的截图,结果和文本或图片类似即可。
安装:
如果你是第一次使用,那么你需要安装一下,Windows、Linux、Mac系统的安装请参照以下链接:https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
这里我以Linux(Ubuntu)系统为例:
更新软件包:
sudo apt update
安装git:
sudo apt install git-all或者sudo apt install git(推荐,已经够用了)
检查是否安装成功:
git --version
第零步:开局设置 - 告诉 Git 你是谁
在开始任何工作之前,你必须先配置你的身份信息。这就像在厨房里穿上绣有你名字的厨师服,这样大家都知道这些美味的创造出自谁手。
-
命令:
git config --global user.name "你的名字" git config --global user.email "你的邮箱@example.com"
-
示例与解释:
git config --global user.name "Chef XiaoBai" git config --global user.email "xiaobai@chef.com"
--global
选项表示这台电脑上你所有的 Git 仓库都会使用这个配置。这个命令只需执行一次。 -
命令
# 查看当前登录账号的用户名
git config user.name
# 查看当前登录账号的邮箱
git config user.email
如果想要修改为其它用户名和其它邮箱再次执行上面的设置命令覆盖即可
第一步:初始化仓库 - 准备你的菜谱工作台
首先,你需要一个地方来存放和记录你的菜谱。在 Git 里,这个地方叫做“仓库”(Repository)。
-
命令:
git init
-
作用: 在当前文件夹创建一个新的 Git 仓库。这就像是清空你的厨房操作台,并告诉 Git:“嗨,从这个文件夹开始,帮我记录这里面所有文件的变化!”
-
示例:
# 1. 先创建一个专门放菜谱的文件夹,并进入它 mkdir my-recipes cd my-recipes# 2. 初始化 Git 仓库 git init
我在家目录下创建:
-
输出结果:
现在,你的
my-recipes
文件夹就是一个被 Git 管理的仓库了(注意有一个隐藏的.git
文件夹)。
第二步:第一次提交 - 写下菜谱初稿
现在,你在 my-recipes
文件夹里创建你的第一个菜谱文件。
-
步骤 1:创建文件
tomato_egg.md
你可以用任何文本编辑器,写下菜谱的第一版内容:# 西红柿炒鸡蛋
## 食材
- 鸡蛋:3个
- 西红柿:2个
## 步骤
1. 打散鸡蛋。
2. 切开西红柿。
3. 炒鸡蛋。
4. 加入西红柿一起炒。
touch tomato_egg.md
vi tomato_egg.md
创建文件这里可以直接使用vi tomato_egg.md也会自动创建并进入编辑的
保存后退出:
-
命令:
git status
-
作用: 查看当前仓库的状态。这是你最常用的命令之一,它能告诉你哪些文件被修改了,哪些文件已经准备好被保存了。就像是你看了一眼操作台,看看哪些食材已经准备就绪,哪些还没处理。
-
示例:
git status
-
类似的输出结果:
On branch main/master(注意这里是main还是master输入git status查看,通常是master)No commits yetUntracked files:(use "git add <file>..." to include in what will be committed)tomato_egg.mdnothing added to commit but untracked files present (use "git add" to track)
-
解读: Git 发现了一个新文件
tomato_egg.md
,但它现在是“未跟踪”(Untracked)状态,意思是 Git 还没有开始管理它。 -
命令:
git add
-
作用: 将文件的变化(这里是新文件)添加到“暂存区”(Staging Area)。暂存区就像一个打包盒,你把想要这次保存的内容(快照)放进去。
-
示例:
# 将 tomato_egg.md 放入“打包盒”(暂存区) git add tomato_egg.md# 你也可以用 git add . 来把所有修改过的新文件都放入“打包盒” # git add .
再次运行
git status
,会发现文件变成了绿色,可能会显示Changes to be committed
,意思是“已暂存,等待提交”。
-
命令:
git commit
-
作用: 将暂存区里的所有内容,正式打包成一个版本快照,并永久保存到 Git 仓库中。每次提交都需要一个注释(
-m
),说明这次提交干了什么,就像给这个快照贴个标签。 -
示例:
git commit -m "创建西红柿炒鸡蛋菜谱初稿"
-
类似的输出结果:
[main (root-commit) 6a3f7a1] 创建西红柿炒鸡蛋菜谱初稿1 file changed, 10 insertions(+)create mode 100644 tomato_egg.md
恭喜! 你已经完成了第一次提交!
6a3f7a1
是这个提交的唯一 ID(哈希值)。
第三步:修改与回溯 - 改进你的菜谱
过了一会,你觉得菜谱太简单了,需要补充。
-
步骤 2:修改
tomato_egg.md
你在“步骤”里添加了更多细节:... ## 步骤 1. 打散鸡蛋,加入少量盐。 2. 西红柿洗净,去蒂,切成小块。 3. 锅内放油,烧热后倒入鸡蛋液,炒熟后盛出。 4. 锅内再放少量油,放入西红柿块翻炒,炒出汤汁。 5. 倒入之前炒好的鸡蛋,混合均匀,加少许糖和盐调味即可。
保存退出:
-
命令:
git diff
-
作用: 查看文件具体修改了什么内容。非常有用!就像对比菜谱的旧版和新版,看看具体加了哪味调料。
-
示例:
git diff
-
输出结果: 会显示所有红色(删除)和绿色(新增)的文字,清晰地告诉你哪里加了“盐”,哪里加了“炒出汤汁”等步骤。
现在你想保存这个更详细的版本。
-
示例:
git add tomato_egg.md # 把修改后的文件再次放入“打包盒” git status # 查看状态,确认打包盒里有东西 git commit -m "完善炒菜步骤和调味细节" # 打包成一个新版本
-
命令:
git log
-
作用: 查看提交历史。就像翻看你的菜谱修改日志,看看自己都保存过哪些版本。
-
示例:
git log
-
类似的输出结果:
commit d4b5f7c2... (HEAD -> main/master)(注意这里是main还是master输入git status查看,通常是master) Author: Your Name <your.email@example.com> Date: Thu Oct 26 10:00:00 2023 +0800完善炒菜步骤和调味细节commit 6a3f7a1... Author: Your Name <your.email@example.com> Date: Thu Oct 26 09:30:00 2023 +0800创建西红柿炒鸡蛋菜谱初稿
可以看到两个版本按时间倒序列出来了。最新的提交在最上面。(HEAD
表示你当前看到的是哪个版本)。
-
命令:
git checkout
-
作用: 切换到某个提交版本。注意: 这常用于临时查看历史版本,或者撤销更改。在 Git 新版本中,更推荐用
git switch
或git restore
来完成部分功能,但checkout
依然强大且常用。 -
场景: 你改完菜谱后,觉得还是初版的“炒鸡蛋”步骤更简洁有力,想看看初版怎么写来着。
-
示例:
# 1. 先用 git log 找到初版提交的ID(前几位就行,比如 6a3f7a1) git log# 2. 切换到初版提交 git checkout 6a3f7a1
查看内容可以看到回到了最初的版本:
-
输出结果: 提示
You are in 'detached HEAD' state...
。这时你打开tomato_egg.md
文件,会发现内容已经变回了初版!
想回到最新版怎么办?git checkout main/master(注意这里是main还是master输入git status查看,通常是master)
这样就切换回了主线的最新状态。
第四步:时光机 - 回溯与后悔
你决定尝试一个大胆的创新:在西红柿炒鸡蛋里加香菜。但加完之后又后悔了。
-
修改并提交: 在食材中加入
- 香菜:1棵
,并提交。git add tomato_egg.md git commit -m "尝试加入香菜创新口味"
提交:
-
命令:
git reset(注意其与git checkout的区别)
-
作用: 将当前分支的 HEAD 指针(当前状态)回退到指定的提交版本。这是强大的“后悔药”。
-
示例: (
git log --oneline(git log简洁输出)
输出如下)你想彻底撤销“加香菜”这个提交,回到上一个版本:
# --hard 模式:彻底丢弃目标版本之后的所有修改 git reset --hard 5d39e5b # 【慎用】你的“香菜”修改就消失了 # 或者更常用的 --soft 模式:回退版本,但保留你的修改作为未提交的更改 # git reset --soft 5d39e5b
-
命令:
git reflog
-
作用: 查看所有 HEAD 的移动记录。是终极后悔药,能找回
git reset --hard
删除的提交。 -
场景: 你刚用
reset --hard
删除了“加香菜”的提交,但又反悔了! -
示例:
git reflog 输出如下:
找到“加香菜”提交的哈希值
ca060a9
,然后恢复它:git reset --hard ca060a9 # HEAD指针又指回了“加香菜”的版本
第五步:分支 - 尝试大胆的创新
你觉得加香菜风险太大,不想在主菜谱上直接修改,怕把 original 的菜谱搞坏了。这时可以用分支。
这时,分支(Branch)就派上用场了。分支就像是给你提供了一个平行宇宙,你可以在里面随便折腾,而完全不影响主线(main/master
分支)。
-
命令:
git branch
和git checkout -b
(或git switch -c
) -
作用:
-
git branch
:查看所有分支。 -
git checkout -b <分支名>
:创建并切换到一个新分支。 -
(现代做法)
git switch -c <分支名>
:效果相同,更语义化。
-
-
示例:
# 创建一个叫 “add-coriander” 的分支,并立即切换过去 git checkout -b add-coriander # 或者 git switch -c add-coriander
-
类似的输出结果:
Switched to a new branch 'add-coriander'
我先把主分支回退到没有加香菜之前,然后创建分支:
现在你就在这个平行宇宙里了。git branch
会显示有两个分支,当前所在的分支前面有个 *
号。
然后你在 add-coriander
分支里修改菜谱,在食材里加入 - 香菜:1棵
,并在步骤里加入撒香菜的步骤。再次 add
和 commit
。
# 修改文件... git add tomato_egg.md git commit -m "尝试加入香菜创新口味"
这个提交只存在于 add-coriander
分支里,main
/master分支完全没受影响。
提交:
-
命令:
git merge
-
作用: 将指定分支的修改合并到当前分支。
-
场景: 你尝了一下加香菜的版本,哇!太好吃了!决定把这个创新合并到主菜谱中。
-
示例:
# 1. 首先,切换回主分支 main/master git switch main/master(注意这里是main还是master输入git status查看,通常是master)# 2. 然后,将 add-coriander 分支的修改合并过来 git merge add-coriander
-
类似的输出结果:
Updating d4b5f7c..a1b2c3d Fast-forwardtomato_egg.md | 3 +++1 file changed, 3 insertions(+)
Fast-forward
(快进)表示合并非常顺利。现在打开主分支的tomato_egg.md
,发现已经有了香菜的内容!上面忘记截图了,这里解释一下,假如在没有合并分支到主分支之前,并且你处于主分支(master),那么你查看tomato_egg.md是没有香菜内容的,只有你切换到分支才会有。
如果这个创新口味失败了,你不想合并,直接删除这个分支即可:
git branch -d add-coriander # 删除分支
第六步:远程仓库与协作 - 把菜谱备份到云端并分享给朋友
你怕电脑坏了菜谱丢失,也想和朋友一起完善这个菜谱。这时就需要一个远程仓库(如 GitHub, Gitee)。这里说一下,国内建议使用gitee,两者的操作都差不多
-
命令:
git remote add
-
作用: 给你的本地仓库添加一个远程仓库的地址,并起个简短的名字(通常叫
origin,这个名字是创建仓库的时候你取的,就如下面命令中的origin和example都是自己取的
)。 -
示例: (假设你已经在 GitHub 上创建了一个空仓库)
git remote add origin https://github.com/your-username/my-recipes.git
# 使用 SSH 格式的 URLgit remote add example git@github.com:your-username/my-recipes.git
这里我以新账号演示,在GitHub的home页面创建一个仓库
创建成功后复制仓库地址,你也可以选择使用https,这里我就用ssh了,我也更推荐这种
生成 SSH 密钥对(如果还没有):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 替换为你的邮箱
一路回车使用默认设置即可(除非你有特殊需要)。
邮箱查看如下:
将公钥添加到 GitHub:
-
查看公钥内容:
cat ~/.ssh/id_rsa.pub
-
复制输出的内容(以
ssh-rsa
开头,你的邮箱结尾)。 -
登录 GitHub -> 点击右上角头像 -> Settings -> SSH and GPG keys -> New SSH key。
-
Title 随便取个名字,Key 类型选择 Authentication Key,然后将刚才复制的公钥内容粘贴到 Key 框中,最后点击 Add SSH key。
点击下面的添加即可,可能需要再次输入登录密码,输入即可
添加远程仓库:
-
命令:
git push
-
作用: 将你本地仓库的提交(Commit)推送到远程仓库。就像是把本地做好的菜谱上传到网盘。
-
示例:
# 第一次推送时,需要指定将本地的 main/master 分支推送到远程的 origin 仓库,并建立起关联 git push -u origin main/master # 之后每次推送,直接使用 git push 即可 git push
如果推送出现如下错误:
并且输入ssh -T git@github.com不成功:
我的解决方法:
有时网络防火墙会阻止标准的 SSH 端口(22)。GitHub 也支持通过 HTTPS 端口(443)进行 SSH 连接。尝试修改 SSH 配置:
# 创建或编辑 SSH 配置文件,记得按住CTRL+x保存
nano ~/.ssh/config
添加以下内容:
Host github.comHostname ssh.github.comPort 443User git
保存文件后,再次测试 SSH 连接:
ssh -T git@github.com
推送:
到GitHub查看:
-
命令:
git clone
-
作用: 从远程仓库克隆一个项目到本地。这是你获取他人项目代码(或你的另一台电脑获取项目)的起始命令。
-
示例: (你的朋友想参与)
git clone https://github.com/your-username/my-recipes.git
# 使用 SSH 格式的 URL
git clone git@github.com:your-username/my-recipes.git
在一个新路径下克隆项目(克隆下来的项目注意层级嵌套关系)
-
命令:
git pull
-
作用: 从远程仓库拉取最新的更新并合并到本地。相当于下载网盘上最新的版本,和你本地的合并。在开始工作前,一定要先
pull
一下,保证本地是最新的! -
示例: (你的朋友修改了菜谱并
push
了,你想获取他的修改)git pull
我删除食材后将内容推送到GitHub
这时候假如是团队一起开发的话,每次都需要拉去最新项目再进行开发,假如我的仓库现在是团队开发,那么别人就可以通过git pull拉去最新的版本也就是我删除了食材的版本。
额外补充:
如何将远程仓库 URL 改为 SSH 格式:
# 先查看当前的远程仓库地址 git remote -v# 删除现有的名为 example 的远程仓库(如果你确定要换的话) git remote remove example# 重新添加,但使用 SSH 格式的 URL git remote add example git@github.com:your-username/my-recipes.git# 再次尝试 push git push -u example master
使用 SSH 方式可以避免很多 HTTPS 协议带来的网络问题
本章完整命令总结表
命令 | 说明 | 例子 | 重要性 |
---|---|---|---|
git config --global user.[name/email] | 配置用户身份 | git config --global user.name "Chef XiaoBai" | 必需 |
git init | 初始化新仓库 | git init | 高 |
git status | 查看状态 | git status | 极高 |
git add <file> | 将文件修改添加到暂存区 | git add tomato_egg.md | 极高 |
git commit -m "msg" | 提交更改 | git commit -m "完善步骤" | 极高 |
git diff | 查看未暂存的修改详情 | git diff | 高 |
git log | 查看提交历史 | git log --oneline | 高 |
git reset [commit] | 回溯版本(撤销提交) | git reset --soft HEAD^ (回退到上一个版本,保留修改) | 高 |
git reflog | 查看操作历史,找回“丢失”的提交 | git reflog | 中 |
git branch | 查看分支列表 | git branch | 高 |
git switch -c <new-branch> | 创建并切换新分支 | git switch -c experiment | 高 |
git merge <branch> | 合并分支 | git merge experiment | 高 |
git remote add origin <url> | 添加远程仓库 | git remote add origin https://... | 高 |
git push | 推送到远程仓库 | git push -u origin main | 极高 |
git clone <url> | 克隆远程仓库 | git clone https://... | 高 |
git pull | 拉取远程更新 | git pull | 极高 |
希望这个贯穿始终的「西红柿炒鸡蛋」项目,能让你对 Git 的核心工作流有一个全面、深刻的理解!大胆去使用它吧,git status
和 git log
是你最好的朋友,而 reflog
是你的救命稻草。