Git 日常使用入门:从提交到协作

一篇面向日常开发和博客维护的 Git 基础教程,覆盖初始化、提交、分支、远程仓库、撤销、冲突处理和常用命令速查。

Git Git 是一个版本管理工具。你可以把它理解成项目的“时间机器”:每次完成一小段工作,就保存一个快照;以后如果改坏了,可以回头看、对比、撤销,也可以和 GitHub 这类远程仓库同步。

这篇文章不讲太多底层原理,只整理日常最常用的一套 Git 操作。

先理解三个区域

Git 日常操作主要围绕三个区域:

1
2
3
4
5
6
7
8
工作区 Working Directory
    你正在编辑的文件

暂存区 Staging Area
    准备放进下一次提交的文件

本地仓库 Repository
    已经提交保存的历史记录

对应到命令就是:

1
2
git add .
git commit -m "提交说明"

git add 是把改动放进暂存区,git commit 是把暂存区里的内容真正保存成一次历史记录。

第一次配置 Git

新电脑上使用 Git 前,建议先设置用户名和邮箱:

1
2
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

查看当前配置:

1
git config --global --list

这些信息会记录在每次提交里,方便以后知道是谁提交了这次改动。

初始化一个仓库

如果一个文件夹还不是 Git 仓库,可以进入这个项目目录后执行:

1
git init

然后查看当前状态:

1
git status

git status 是最常用的命令之一。只要不知道现在发生了什么,就先看它。

完成一次提交

日常最标准的保存流程是:

1
2
3
git status
git add .
git commit -m "说明这次改了什么"

例如你写完一篇博客文章:

1
2
git add content/post/git-daily-guide/index.md
git commit -m "Add Git daily guide"

如果这次修改了多个文件,也可以直接:

1
2
git add .
git commit -m "Update blog content"

提交说明建议写清楚“做了什么”,不用太长,但要能看懂。

查看历史记录

查看提交历史:

1
git log

更简洁的写法:

1
git log --oneline

查看某一次提交改了什么:

1
git show 提交ID

提交 ID 不需要写完整,通常复制前 7 位左右就够了。

查看文件改动

查看工作区里还没暂存的改动:

1
git diff

查看已经 git add 进暂存区、但还没提交的改动:

1
git diff --cached

这是提交前很有用的一步,可以避免把不该提交的内容带进去。

连接远程仓库

如果你已经在 GitHub 上创建了仓库,可以把本地仓库和远程仓库关联起来:

1
git remote add origin git@github.com:用户名/仓库名.git

查看远程仓库地址:

1
git remote -v

第一次推送:

1
git push -u origin main

以后再推送就可以直接:

1
git push

如果你的默认分支叫 master,就把上面的 main 改成 master

从远程拉取更新

如果远程仓库有别人提交的内容,或者你在另一台电脑上改过代码,回到当前电脑后可以拉取:

1
git pull

它大致等于“先下载远程更新,再合并到当前分支”。

日常建议是:

1
2
3
4
5
git pull
# 修改文件
git add .
git commit -m "Update something"
git push

先拉再改,可以减少冲突。

分支的基本用法

分支适合用来做一段独立修改,比如写新功能、改页面、尝试新样式。

查看当前分支:

1
git branch

创建并切换到新分支:

1
git switch -c feature/about-page

切回主分支:

1
git switch main

把分支合并回主分支:

1
2
git switch main
git merge feature/about-page

合并完成后,如果不再需要这个分支,可以删除:

1
git branch -d feature/about-page

撤销还没提交的修改

如果某个文件改坏了,还没有 git add,可以丢弃这个文件的改动:

1
git restore 文件路径

例如:

1
git restore assets/scss/custom.scss

如果已经 git add 了,但还没有提交,可以先取消暂存:

1
git restore --staged 文件路径

然后再决定是否丢弃工作区修改。

修改上一次提交

如果刚提交完,发现提交说明写错了,可以改最后一次提交说明:

1
git commit --amend -m "新的提交说明"

如果刚提交完,发现漏了一个文件:

1
2
git add 漏掉的文件
git commit --amend --no-edit

--no-edit 表示沿用上一次提交说明。

注意:如果这次提交已经推送给别人使用了,修改历史前要谨慎。

回退一次提交

如果想撤销某一次已经提交的改动,比较稳妥的方式是 revert

1
git revert 提交ID

它不会删除历史,而是新建一个“反向提交”。这种方式适合已经推送到远程仓库的提交。

不建议新手随便使用:

1
git reset --hard

它会直接丢弃改动,比较危险。

处理冲突

冲突通常发生在两个人改了同一个文件的同一段内容,或者你在两台电脑上分别改了同一处。

冲突文件里一般会出现类似内容:

1
2
3
4
5
<<<<<<< HEAD
当前分支的内容
=======
别人或远程分支的内容
>>>>>>> main

处理步骤:

  1. 打开冲突文件。
  2. 保留你真正想要的内容。
  3. 删除 <<<<<<<=======>>>>>>> 这些标记。
  4. 保存文件。
  5. 重新提交。

命令大概是:

1
2
3
4
git status
# 手动编辑冲突文件
git add 冲突文件
git commit

如果是 git pull 时产生的冲突,解决后继续提交即可。

忽略不需要提交的文件

有些文件不应该提交,比如缓存、构建产物、临时文件、密钥文件。可以写进 .gitignore

1
2
3
4
5
6
.DS_Store
Thumbs.db
node_modules/
.env
.hugo_build.lock
resources/_gen/

对 Hugo 博客来说,是否提交 public/ 取决于你的部署方式:

1
public/

如果你使用 Cloudflare Pages、GitHub Actions 等自动构建,一般可以不提交 public/。如果你的部署方式要求上传静态产物,就不要忽略它。

日常推荐流程

个人维护博客时,可以按这个流程来:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git pull

# 编辑文章或配置
hugo

git status
git diff
git add .
git commit -m "Update blog"
git push

如果只是写新文章:

1
2
3
4
git pull
git add content/post/文章目录/index.md
git commit -m "Add new post"
git push

如果是改主题样式:

1
2
3
4
5
6
7
8
git switch -c style/update-about-page

# 修改 CSS 或模板
hugo

git add .
git commit -m "Update about page style"
git push -u origin style/update-about-page

常用命令速查

目的命令
查看状态git status
查看改动git diff
暂存全部改动git add .
提交git commit -m "message"
查看历史git log --oneline
拉取远程更新git pull
推送到远程git push
查看分支git branch
新建并切换分支git switch -c 分支名
切换分支git switch 分支名
合并分支git merge 分支名
丢弃某个文件修改git restore 文件路径
取消暂存git restore --staged 文件路径
撤销某次提交git revert 提交ID
查看远程仓库git remote -v

一个简单心法

日常使用 Git 时,记住这几件事就够了:

  • 不确定状态时,先 git status
  • 提交前先 git diff 看一眼。
  • 每次提交只做一件相对完整的事。
  • 提交说明写清楚,不要全都叫 update
  • 已经推送到远程的历史,不要轻易乱改。

Git 一开始会显得命令很多,但日常真正高频使用的其实不多。熟悉 statusaddcommitpullpushdiff 之后,就已经可以完成大多数个人项目和博客维护工作了。

使用 Hugo 构建
主题 StackJimmy 设计