Git入门指南:核心概念与实用操作

简单Git学习记录

1.Git核心概念与结构

基本工作流程

三个状态分别是:已提交 (committed)已修改 (modified)已暂存 (staged) 。由此引入了 Git 项目的三个核心工作区域:Git 仓库工作目录 以及 暂存区域

Git仓库目录:Git 用来保存项目的元数据和对象数据库的地方。这是 Git 的核心。当你从其他计算机克隆仓库时,实际拷贝的就是这里的数据。 工作目录:从 Git 仓库的压缩数据库中提取出来、放在磁盘上供你使用或修改的项目文件。 暂存区域:一个文件(通常位于 Git 仓库目录中),保存了下次将要提交的文件列表信息。有时也被称为"索引 (Index

  1. 在工作目录中修改文件。

  2. 暂存 文件,将文件的快照放入暂存区域 (git add)。

  3. 提交 文件,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录 (git commit)

2、Git 基本操作

2.1仓库本地初始化

复制代码
git init
  1. 进入目标目录(例如 my-project)。

  2. 右键打开 Git Bash Here(Windows)或直接在终端中进入该目录。

  3. 执行命令:git init

  4. 执行完毕后,目录下会多出一个 .git 的隐藏文件夹。

2.2 首次配置

设置用户名和邮箱(每次提交都会记录):

复制代码
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

查看配置:

复制代码
git config --list

示例:设置后每次 commit 都会带这些信息,避免匿名提交。

3. 创建仓库

3.1 git init -- 初始化新仓库

在当前目录创建一个空的 Git 仓库(生成 .git 文件夹)。

复制代码
mkdir my-project
cd my-project
git init

结果

复制代码
Initialized empty Git repository in /path/to/my-project/.git/

3.2 git clone -- 克隆远程仓库

将远程仓库完整下载到本地。

复制代码
git clone https://github.com/user/repo.git
# 或指定文件夹名
git clone https://github.com/user/repo.git my-folder

结果 :本地出现 repomy-folder 目录,包含所有历史版本。


4. 基本操作

4.1 git status -- 查看状态

显示工作区和暂存区的状态(哪些文件被修改、暂存、未追踪)。

复制代码
git status

示例 :创建一个 README.md 文件后运行。

复制代码
echo "# My Project" > README.md
git status

输出

复制代码
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md
nothing added to commit but untracked files present (use "git add" to track)

4.2 git add -- 将修改添加到暂存区

复制代码
git add README.md        # 添加单个文件
git add .                # 添加所有改动(包括新文件、修改、删除)
git add *.js             # 添加所有 .js 文件

示例git add README.md 后再 git status

复制代码
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   README.md

4.3 git commit -- 提交暂存区内容

生成一个新的版本快照,必须附带 -m 消息。

复制代码
git commit -m "Add README"

示例 :提交后 git status 显示干净。

复制代码
[main (root-commit) a1b2c3d] Add README
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

4.4 git log -- 查看提交历史

复制代码
git log                # 完整历史
git log --oneline      # 简洁一行显示
git log --graph --all  # 图形化显示所有分支

示例 :两个提交后的 git log --oneline

复制代码
a1b2c3d (HEAD -> main) Add README
f9e8d7c Initial commit

4.5 git diff -- 查看未暂存的改动

比较工作区与暂存区的差异。

复制代码
echo "more content" >> README.md   # 修改文件
git diff

输出

复制代码
diff --git a/README.md b/README.md
index 8e3b5b2..5c6e9f1 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 # My Project
+more content
  • git diff --staged:比较暂存区与最新提交(HEAD)的差异。

5. 版本回退与前进

5.1 git reset -- 重置版本

三种模式:

  • --soft:只移动 HEAD,保留暂存区和工作区。

  • --mixed(默认):移动 HEAD,清空暂存区,保留工作区。

  • --hard:移动 HEAD,清空暂存区和工作区(危险)。

复制代码
# 使用 git reflog 查看目标版本的索引值,然后回退
git reset --hard a6ace91
​
git reset --hard HEAD~1   # 回退到上一个版本,丢弃所有修改
git reset --soft HEAD~1   # 回退,但修改保留在暂存区
# 后退一步
git reset --hard HEAD^
# 后退 n 步
git reset --hard HEAD^^^ # 后退三步

示例 :当前有两个提交 commit2 (HEAD) 和 commit1。执行 git reset --hard HEAD~1 后,git log 只显示 commit1,且工作区文件回退到 commit1 的状态。

5.2 git reflog -- 查看所有 HEAD 移动历史

找回丢失的提交。

复制代码
git reflog

输出

复制代码
a1b2c3d HEAD@{0}: reset: moving to HEAD~1
f9e8d7c HEAD@{1}: commit: Add README
... 

通过 git reset --hard f9e8d7c 可以恢复之前删除的提交。


6. 分支管理

6.1 分支基础命令

复制代码
git branch                # 列出本地分支
git branch feature-a      # 创建分支 feature-a
git checkout feature-a    # 切换到 feature-a
git switch feature-a      # 新命令,切换分支(推荐)
git checkout -b feature-b # 创建并切换

6.2 git merge -- 合并分支

将其他分支的修改合并到当前分支。

复制代码
git checkout main
git merge feature-a

示例

  1. feature-a 分支上修改 README.md 并提交。

  2. 切回 main,执行 git merge feature-a

输出(Fast-forward 快进模式):

复制代码
Updating a1b2c3d..f9e8d7c
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

如果两个分支都有新提交,Git 会创建合并提交(merge commit)。

6.3 git rebase -- 变基

将当前分支的提交"移植"到目标分支的最新提交之上,使历史线性。

复制代码
git checkout feature-a
git rebase main

比对merge 会产生一个合并节点,而 rebase 会重写提交历史,看起来像顺序开发。

复制代码
# Merge 后的 log 图形
*   (main) Merge branch 'feature-a'
|\
| * (feature-a) Add feature
* | Update main
|/
​
# Rebase 后的 log 图形
* (feature-a) Add feature
* (main) Update main
* Initial commit

⚠️ 注意:不要对已推送到公共仓库的分支执行 rebase。


7. 远程仓库

7.1 管理远程

复制代码
git remote -v                     # 查看远程仓库列表
git remote add origin https://... # 添加远程仓库,名字为 origin
git remote rm origin              # 删除远程

7.2 git push -- 推送本地分支

复制代码
git push -u origin main   # -u 建立 upstream 关联,后续直接 git push
git push origin feature-a # 推送 feature-a 分支

7.3 git pull / git fetch

  • git fetch:下载远程最新对象,但不合并到本地分支。

  • git pull = git fetch + git merge(或 rebase,通过配置)。

复制代码
git fetch origin
git merge origin/main      # 手动合并
# 等价于
git pull origin main

示例 :远程仓库有新提交,本地落后。执行 git pull 后,本地 main 前进到远程最新。

7.4 克隆与冲突解决

pullmerge 出现冲突时,Git 会标记冲突文件,手动编辑后 add + commit

复制代码
git pull origin main
# CONFLICT in file.txt
# 编辑 file.txt,删除 <<<<<<< ======= >>>>>>> 标记
git add file.txt
git commit -m "Resolve merge conflict"

8. 撤销修改

8.1 工作区撤销 -- git restore / git checkout --

复制代码
git restore README.md          # 丢弃工作区的修改(回到暂存区或 HEAD)
git checkout -- README.md      # 旧语法,同样效果

示例 :修改 README.md 但未 add,执行 git restore README.md 后文件恢复到上次提交状态。

8.2 暂存区撤销 -- git restore --staged

复制代码
git add README.md              # 误添加
git restore --staged README.md # 将 README.md 从暂存区移出,工作区保留修改

8.3 重新提交 -- git commit --amend

修改最近一次提交的信息或遗漏文件。

复制代码
git add forgotten.txt
git commit --amend -m "New message"   # 替换上一次提交

示例 :之前提交漏了一个文件,amend 后不会产生新 commit,而是覆盖原有 commit(commit hash 会变)。

8.4 撤销提交(安全方式) -- git revert

生成一个新的提交来反向某个旧提交的改动,不破坏历史。

复制代码
git revert HEAD         # 撤销最近一次提交
git revert a1b2c3d      # 撤销指定提交

比对 reset vs revert

操作 历史是否修改 适用场景
reset 会重写历史(删除提交) 本地未推送的分支
revert 追加新提交来抵消改动 已经推送到公共仓库

9. 工作区、暂存区与版本库

这是一个核心图景,理解它才能掌握 Git。

复制代码
工作区 (Working Directory)
    ↓ git add
暂存区 (Staging Area / Index)
    ↓ git commit
版本库 (Repository / .git)
  • 工作区:你看到的实际文件。

  • 暂存区:临时存放待提交的改动。

  • 版本库 :所有 commit 对象,HEAD 指向当前分支的最新 commit。

示例:查看暂存区和 HEAD 的差异:

复制代码
git diff --cached   # 等价于 git diff --staged

10. 忽略文件

创建 .gitignore 文件,指定哪些文件不被 Git 追踪。

复制代码
# 忽略所有 .log 文件
*.log
# 但保留 important.log
!important.log
# 忽略 build 目录
build/
# 忽略 IDE 配置
.vscode/

常用命令:

复制代码
git check-ignore -v file.txt   # 查看哪个规则忽略了 file.txt

示例 :编写 .gitignore 后,git status 不会再显示被忽略的文件。


11. 储藏(Stash)

当你需要切换分支但当前工作区未完成不想提交时,使用 stash 临时保存。

复制代码
git stash save "WIP: feature"   # 储藏(可加描述)
git stash list                  # 查看所有储藏
git stash pop                   # 应用最近的储藏并删除
git stash apply stash@{1}       # 应用指定储藏但不删除
git stash drop stash@{0}        # 删除指定储藏

示例

复制代码
echo "unfinished" >> file.txt
git stash
git status   # 干净的工作区
git stash pop   # 恢复修改

12. 标签(Tag)

用于标记某个重要的提交(如发布版本)。

复制代码
git tag v1.0.0                 # 轻量标签
git tag -a v1.0.0 -m "Release" # 附注标签(推荐)
git tag                        # 列出所有标签
git show v1.0.0                # 显示标签信息
git push origin v1.0.0         # 推送标签到远程
git push --tags                # 推送所有标签

示例 :在 main 分支的最新提交打一个带注释的标签:

复制代码
git checkout main
git tag -a v2.0 -m "Second major release"
git log --oneline -1   # 显示标签名

13. 比对与差异(Diff)

git diff 是 Git 最强大的比较工具之一。

命令 比较对象
git diff 工作区 ↔ 暂存区
git diff --staged 暂存区 ↔ HEAD
git diff HEAD 工作区 ↔ HEAD
git diff branch1 branch2 两个分支的最新提交
git diff commit1 commit2 两个指定提交
git diff HEAD~2..HEAD 最近两个提交的差异

示例:查看工作区与 HEAD 的差异:

bash

复制代码
echo "new line" >> README.md
git diff HEAD

输出类似之前看到的 +- 符号。


14. 高级技巧速览

  • git cherry-pick <commit>:将其他分支的某个提交应用到当前分支。

  • git bisect:二分查找定位引入 bug 的提交。

  • git worktree:同时检出多个分支到不同目录,避免频繁切换。

  • git reflog:救命命令,找回丢失的任何提交。

  • git filter-branchBFG Repo-Cleaner:重写历史,删除大文件或敏感信息。


15. 总结

场景 常用命令
开始新项目 git init
克隆项目 git clone <url>
查看状态 git status
添加修改 git add <file>git add .
提交 git commit -m "msg"
查看历史 git log --oneline --graph
分支管理 git branch, git checkout/switch, git merge, git rebase
远程同步 git pull, git push, git fetch
撤销 git restore, git reset, git revert
储藏临时工作 git stash / git stash pop
打标签 git tag
相关推荐
Naisu Xu1 小时前
Mac上安装Homebrew、Git、Python等环境记录
git·python·macos·终端·brew
workflower1 小时前
人工智能全球治理
大数据·人工智能·设计模式·机器人·动态规划
workflower1 小时前
AI灵活高效的智慧用能核心场景
大数据·人工智能·设计模式·机器人·动态规划
189228048612 小时前
NV301固态MT29F32T08GWLBHD6-QJES:B
大数据·服务器·人工智能·科技·缓存
海兰2 小时前
在 Grafana 中驾驭 ES|QL:Elasticsearch 管道查询实战指南
大数据·elasticsearch·grafana
zuozewei2 小时前
AI-7D-SATS平台的harness engineering设计:让 AI Agent 从“工具堆叠”长成“工程制品”
大数据·人工智能
AI周红伟2 小时前
All in Token,百度李彦宏指出:Token经济,阿里,百度,腾讯,字节,移动,电信,联通,华为,开启新的Token战争
大数据·人工智能·windows·百度·copilot·openclaw
摸鱼仙人~2 小时前
Learn Git Branching:提交的技巧
git
say_fall3 小时前
Git完全入门指南-从概念到实战掌握版本控制的核心
linux·运维·服务器·git·学习