简单Git学习记录
1.Git核心概念与结构
基本工作流程
三个状态分别是:已提交 (committed) 、已修改 (modified) 和 已暂存 (staged) 。由此引入了 Git 项目的三个核心工作区域:Git 仓库 、工作目录 以及 暂存区域。
Git仓库目录:Git 用来保存项目的元数据和对象数据库的地方。这是 Git 的核心。当你从其他计算机克隆仓库时,实际拷贝的就是这里的数据。 工作目录:从 Git 仓库的压缩数据库中提取出来、放在磁盘上供你使用或修改的项目文件。 暂存区域:一个文件(通常位于 Git 仓库目录中),保存了下次将要提交的文件列表信息。有时也被称为"索引 (Index
-
在工作目录中修改文件。
-
暂存 文件,将文件的快照放入暂存区域 (
git add)。 -
提交 文件,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录 (
git commit)
2、Git 基本操作
2.1仓库本地初始化
git init
-
进入目标目录(例如
my-project)。 -
右键打开
Git Bash Here(Windows)或直接在终端中进入该目录。 -
执行命令:
git init -
执行完毕后,目录下会多出一个
.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
结果 :本地出现 repo 或 my-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
示例:
-
在
feature-a分支上修改README.md并提交。 -
切回
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 克隆与冲突解决
当 pull 或 merge 出现冲突时,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-branch或BFG 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 |