Git入门与常用命令笔记

O泡李华 5

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

处理普通合并冲突的步骤:

  1. 执行 git status,找到冲突文件。
  2. 打开文件,确定最终内容,删除冲突标记并保存。
  3. 执行 git add 文件名,标记冲突已解决。
  4. 检查最终修改,执行 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 恢复最近一次临时保存