Git入门与常用命令笔记
Git 入门笔记:基本概念与常用命令
开发项目时,经常需要查看代码修改、恢复历史版本,或者与同事同时开发不同功能。Git 就是用来管理这些变化的工具。
本文整理 Git 的基本概念、常用命令和日常操作流程,适合初次使用 Git 的开发者。
一、Git 是什么
Git 是一个分布式版本管理工具,用来记录文件修改、保存历史版本和支持多人协作。
例如,修改登录功能后发现出现问题,可以通过 Git 查看具体改动,或者撤销相关修改。即使一个人开发,也可以用 Git 保存每次重要改动。
Git 的每次提交都会记录一个版本快照。通常,本地仓库包含版本历史,因此很多操作可以离线完成。
Git 与 GitHub 的区别
| 名称 | 作用 |
|---|---|
| Git | 运行在电脑上的版本管理工具 |
| GitHub、Gitee、GitLab | 托管 Git 仓库的平台,方便备份、审查和协作 |
可以先在本地使用 Git,之后再将代码推送到远程平台。
二、理解工作区、暂存区和仓库
Git 的基本操作围绕三个区域展开:
工作区 暂存区 本地仓库
正在编辑的文件 ──→ 准备提交的修改 ──→ 已保存的版本记录
git add git commit
- 工作区:当前能看到和编辑的项目文件。
- 暂存区:下一次提交准备包含的内容。
- 本地仓库:已经提交的版本记录。
与远程仓库同步时,还会用到:
本地仓库 ── git push ──→ 远程仓库
本地仓库 ←─ git pull ── 远程仓库
git commit 只保存到本地,git push 才会上传提交到远程。
三、首次使用:配置身份
安装 Git 后,在终端执行:
# 查看 Git 版本
git --version
# 设置提交作者的姓名和邮箱
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
# 查看配置
git config --list
--global 表示对当前用户的仓库生效。在某个仓库中执行不带 --global 的配置命令,可以为这个仓库单独设置身份。
姓名和邮箱用于标记提交作者,不是远程平台的登录凭证。推送代码时,仍需要按平台要求配置认证。
四、创建或获取仓库
1. 初始化本地仓库
进入项目目录后执行:
git init
项目中会生成 .git 目录,用于保存版本记录和仓库配置,不要随意删除。
2. 克隆已有仓库
git clone https://github.com/用户名/仓库名.git
clone 会获取项目文件和版本历史,并通常将原地址设置为名叫 origin 的远程仓库。
下面命令中的姓名、邮箱、仓库地址、分支名和文件路径都需要根据实际情况替换。
五、日常最常用的命令
1. 查看状态:git status
git status
# 使用简短格式显示
git status --short
可以看到哪些文件新增、修改、删除,以及哪些修改已经暂存。修改前后和提交前,都可以执行一次。
常见状态包括:
- 未跟踪:新文件尚未加入 Git 管理。
- 已修改但未暂存:工作区内容与暂存区不同。
- 已暂存:修改已经加入下一次提交。
2. 查看差异:git diff
# 查看已跟踪文件的未暂存修改
git diff
# 查看已暂存、准备提交的修改
git diff --staged
# 查看工作区与当前提交之间的差异
git diff HEAD
普通 git diff 不会展示未跟踪新文件的内容。提交前检查差异,能避免把不相关的修改一起提交。
3. 暂存修改:git add
# 暂存指定文件
git add HelloController.java
# 暂存当前目录及子目录中的修改
git add .
git add . 包括当前目录范围内的新增、修改和删除,但会遵循忽略规则。要收集整个仓库的修改,也可以使用 git add -A。
**git add 保存的是执行这一刻的文件内容。**如果之后又修改文件,需要再次执行 add,才能将新修改包含在本次提交中。
4. 提交版本:git commit
git commit -m "添加问候接口"
提交会记录暂存区中的内容。提交说明应描述具体改动,例如:
git commit -m "修复用户查询接口的空指针问题"
一次提交尽量围绕一个明确的目的,方便后续审查和撤销。
5. 查看历史:git log
# 查看完整提交记录
git log
# 每个提交显示一行
git log --oneline
# 查看所有分支的提交关系
git log --oneline --graph --all
每次提交都有标识,例如 a1b2c3d,可以用它定位历史版本。日志进入分页界面时,通常按 q 退出。
6. 查看某次提交:git show
# 查看最近一次提交
git show HEAD
# 查看指定提交,替换成实际提交 ID
git show a1b2c3d
HEAD 通常指向当前分支的最新提交,HEAD~1 表示它的第一父提交。
六、分支:独立开发不同功能
分支适合开发新功能、修复问题,以及同时维护不同版本。
假设主分支是 main,现在要开发登录功能:
# 查看本地分支,星号表示当前分支
git branch
# 查看本地分支和远程跟踪分支
git branch -a
# 创建并切换到功能分支
git switch -c feature/login
# 切换回主分支
git switch main
在功能分支完成修改并提交后,可以合并到主分支:
git switch main
git merge feature/login
合并完成后,删除不再需要的本地分支:
git branch -d feature/login
main 只是常见名称,也有项目使用 master,以实际仓库为准。删除本地分支不会自动删除远程分支。
较旧的教程可能使用 git checkout 切换分支;这里使用用途更明确的 git switch。
七、与远程仓库同步
1. 查看或添加远程地址
# 查看远程仓库地址
git remote -v
# 为本地仓库添加远程地址
git remote add origin https://github.com/用户名/仓库名.git
如果通过 clone 获取项目,通常已经存在 origin,不用重复添加。需要修改已有地址时:
git remote set-url origin https://github.com/用户名/仓库名.git
origin 是远程仓库的名称,可以理解为远程地址的别名。
2. 上传提交:git push
# 首次推送,并建立分支关联
git push -u origin main
# 建立关联后,通常可以直接执行
git push
-u 设置上游分支关联,方便之后执行不带分支参数的 push 和 pull。
如果推送被拒绝,先检查提示、远程更新和仓库权限,再处理原因。不要直接通过强制推送覆盖他人的历史。
3. 获取远程更新:git fetch
git fetch origin
它更新本地保存的远程分支记录,不会自动合并到当前分支。随后可以检查远程分支,例如:
# 查看 origin/main 有、当前分支没有的提交
git log --oneline HEAD..origin/main
4. 获取并整合更新:git pull
git pull
pull 会获取远程更新,并整合到当前分支;根据配置和命令选项,整合方式可能是合并或变基。分支出现分叉时,Git 也可能要求明确选择策略。
如果只允许快进更新,可以使用:
git pull --ff-only
如果本地和远程各自有新提交,该命令会停止,需要按团队约定进行合并或变基。
同步前先用 git status 检查本地修改。提交或临时保存当前工作,通常会更方便处理后续变化。
八、撤销修改:先确定修改在哪个区域
| 需求 | 命令 | 效果 |
|---|---|---|
| 取消某文件的暂存 | git restore --staged 文件名 |
保留工作区修改 |
| 丢弃已跟踪文件的未暂存修改 | git restore 文件名 |
用暂存区内容覆盖工作区文件 |
| 撤销某次普通提交的改动 | git revert 提交ID |
创建一个新的撤销提交 |
| 丢弃暂存区和工作区的已跟踪修改 | git reset --hard HEAD |
将它们恢复到当前提交 |
1. 取消暂存,但保留修改
git restore --staged HelloController.java
文件仍然保留修改,只是不再准备提交。
2. 丢弃未暂存修改
git restore HelloController.java
默认从暂存区恢复文件。如果这个文件之前已经暂存过修改,恢复后保留的是那份暂存内容。
3. 撤销已提交的改动
git revert a1b2c3d
Git 会尝试生成一个反向修改的提交。撤销时可能出现冲突,合并提交还需要额外指定主线,不能直接照搬普通提交的用法。
对于已经推送、多人共享的提交,通常使用 revert 更方便保留协作历史。
4. 丢弃当前已跟踪修改
git reset --hard HEAD
该操作会丢失未提交的已跟踪修改。它也不是清理所有未跟踪文件的命令。
执行覆盖或丢弃文件内容的操作前,先用 git status 和 git diff 确认修改是否仍然需要。
九、临时保存工作:git stash
写代码写到一半,需要切换分支处理其他任务,可以先临时保存:
# 保存已跟踪文件的修改
git stash
# 同时保存未跟踪的新文件,不包含忽略文件
git stash -u
# 查看保存记录
git stash list
# 恢复最近一次保存,成功后删除该记录
git stash pop
如果希望恢复后仍保留记录,可以使用:
git stash apply
如果 pop 恢复时出现冲突,保存记录通常会保留,需要手动处理冲突。
十、合并冲突怎么处理
当两个分支修改了同一处内容,Git 可能无法自动决定保留哪一份。
冲突文件中会出现类似标记:
<<<<<<< HEAD
当前分支的内容
=======
另一个分支的内容
>>>>>>> feature/login
处理普通合并冲突的步骤:
- 执行
git status,找到冲突文件。 - 打开文件,确定最终内容,删除冲突标记并保存。
- 执行
git add 文件名,标记冲突已解决。 - 检查最终修改,执行
git commit完成合并。
如果冲突发生在变基过程中,解决并暂存后按提示执行:
git rebase --continue
如果要取消正在进行的合并:
git merge --abort
取消正在进行的变基:
git rebase --abort
十一、忽略不需要提交的文件
在项目根目录创建 .gitignore,例如 Java 项目:
# 编译产物
target/
*.class
# 日志
*.log
# 本地环境配置
.env
.gitignore 主要防止未跟踪文件被加入版本管理。已经被 Git 跟踪的文件,不会因为写进 .gitignore 就自动停止跟踪。
如果确定要停止跟踪某个文件,同时保留本地文件,可以执行:
git rm --cached 文件名
然后提交这项修改及对应的忽略规则。其他人同步这个提交后,该文件会从版本管理中移除,应先确认它确实不需要共享。
十二、完整的日常操作流程
下面以“添加一个问候接口”为例。假设项目已有远程仓库,工作区干净,主分支为 main:
# 1. 检查当前状态
git status
# 2. 切换到主分支并同步
git switch main
git pull --ff-only
# 3. 创建功能分支
git switch -c feature/hello-api
# 4. 编辑代码后,查看已跟踪文件的修改
git diff
# 5. 暂存相关文件,替换成实际文件路径
git add src/main/java/com/example/demo/controller/HelloController.java
# 6. 检查本次准备提交的内容
git diff --staged
# 7. 提交到本地
git commit -m "添加问候接口"
# 8. 推送功能分支到远程
git push -u origin feature/hello-api
推送后,可在 GitHub、Gitee 或 GitLab 上创建 Pull Request / Merge Request,供团队审查并合并。
十三、常用命令速查
| 命令 | 用途 |
|---|---|
git init |
初始化仓库 |
git clone 地址 |
克隆仓库 |
git status |
查看文件与仓库状态 |
git diff |
查看已跟踪文件的未暂存修改 |
git diff --staged |
查看准备提交的修改 |
git add 文件名 |
暂存指定文件 |
git commit -m "说明" |
提交暂存区内容 |
git log --oneline |
查看简洁提交历史 |
git show 提交ID |
查看某次提交 |
git branch |
查看本地分支 |
git switch -c 分支名 |
创建并切换分支 |
git switch 分支名 |
切换分支 |
git merge 分支名 |
将指定分支合并到当前分支 |
git remote -v |
查看远程地址 |
git fetch |
获取远程更新 |
git pull |
获取并整合远程更新 |
git push |
推送本地提交 |
git restore --staged 文件名 |
取消暂存,保留工作区修改 |
git revert 提交ID |
通过新提交撤销已有改动 |
git stash -u |
临时保存修改及未跟踪文件 |
git stash pop |
恢复最近一次临时保存 |