引言
在上一篇文章中,我们介绍了 Git 的基本概念、安装配置以及初始化仓库的方法。本文将继续深入探讨 Git 的基本操作,包括添加和提交文件、查看状态、查看提交历史和撤销操作。通过这些操作,读者将能够熟练地使用 Git 进行日常的版本控制任务。
初始化仓库
在开始任何 Git 操作之前,我们需要确保已经初始化了一个 Git 仓库。初始化仓库的过程已经在上一篇文章中详细介绍了,这里简要回顾一下:
创建新仓库:
mkdir my-project cd my-project git init
现有项目:
cd /path/to/existing/project git init git add . git commit -m "Initial commit"
添加和提交文件
添加和提交文件是 Git 中最基本的两个操作,它们帮助你将工作区的更改保存到版本库中。
添加文件到暂存区:
- 单个文件:
git add file1.txt
- 多个文件:
git add file1.txt file2.txt
- 所有文件:
git add .
- 单个文件:
提交文件:
- 普通提交:
提交信息应该简洁明了,能够概括本次提交的主要改动。例如:“Add initial files”、“Fix bug in login function”等。git commit -m "Add initial files"
- 跳过暂存区直接提交:
这条命令会自动将所有已修改的文件添加到暂存区,然后进行提交。适用于频繁的小改动。git commit -am "Update files"
- 普通提交:
提交信息的最佳实践:
- 简洁明了:提交信息应该简短且具有描述性,能够让人一眼看出此次提交的主要内容。
- 遵循规范:一些团队可能有自己的提交信息规范,例如使用特定的前缀(如“feat:”表示新增功能,“fix:”表示修复bug)。
- 多行提交信息:对于复杂的提交,可以省略
-m
参数,直接运行git commit
,Git 会打开默认的文本编辑器,让你输入详细的提交信息。
查看状态
查看工作区和暂存区的状态是 Git 日常操作的重要部分。通过这些命令,你可以了解当前项目的更改情况,从而决定下一步的操作。
查看工作区状态:
git status
输出信息通常分为几个部分:
- 未跟踪文件:新创建但尚未添加到暂存区的文件。
- 已修改文件:已修改但尚未添加到暂存区的文件。
- 已暂存文件:已添加到暂存区但尚未提交的文件。
查看文件差异:
- 工作区与暂存区之间的差异:
这条命令会显示工作区中已修改但尚未暂存的文件与暂存区之间的差异。git diff
- 暂存区与上次提交之间的差异:
这条命令会显示暂存区中已暂存但尚未提交的文件与上次提交之间的差异。git diff --cached
- 工作区与上次提交之间的差异:
这条命令会显示工作区中所有已修改的文件与上次提交之间的差异。git diff HEAD
- 工作区与暂存区之间的差异:
查看提交历史
查看提交历史可以帮助你了解项目的演变过程,查找特定的更改记录,或者回退到某个历史版本。
查看完整的提交历史:
git log
默认情况下,
git log
会显示每次提交的哈希值、作者、日期和提交信息。输出信息按时间顺序排列,最近的提交在最前面。简化输出:
- 每条记录只显示一行:
这条命令会显示每次提交的简短信息,每条记录只占一行,便于快速浏览。git log --oneline
- 显示提交摘要:
这条命令会显示每次提交的文件变更统计信息,包括修改的文件数和行数。git log --stat
- 显示详细的更改内容:
这条命令会显示每次提交的详细更改内容,包括具体的代码修改。git log -p
- 每条记录只显示一行:
过滤提交记录:
- 按作者过滤:
git log --author="Your Name"
- 按时间段过滤:
git log --since="2 weeks ago" --until="1 week ago"
- 按关键字过滤:
git log --grep="fix bug"
- 按文件过滤:
这条命令会显示与指定文件相关的所有提交记录。git log -- filename
- 按作者过滤:
撤销操作
在开发过程中,经常会遇到需要撤销某些更改的情况。Git 提供了多种撤销操作的方法,帮助你恢复到之前的某个状态。
撤销工作区的修改:
- 恢复单个文件:
这条命令会将工作区中指定文件的修改回滚到最近一次提交的状态。git checkout -- filename
- 恢复所有文件:
这条命令会将工作区中所有文件的修改回滚到最近一次提交的状态。git checkout .
- 恢复单个文件:
撤销暂存区的修改:
- 移除单个文件:
这条命令会将暂存区中指定文件的修改移除,但保留工作区中的修改。git reset filename
- 移除所有文件:
这条命令会将暂存区中所有文件的修改移除,但保留工作区中的修改。git reset
- 移除单个文件:
撤销提交:
- 创建新的提交来撤销:
这条命令会创建一个新的提交,撤销指定提交的更改。适用于已经推送到远程仓库的提交。git revert <commit-hash>
- 重置到某个提交:
- 软重置(保留工作区和暂存区的更改):
这条命令会将当前分支的 HEAD 指针指向指定的提交,但保留工作区和暂存区中的所有更改。git reset --soft <commit-hash>
- 混合重置(保留工作区的更改,但清空暂存区):
这条命令会将当前分支的 HEAD 指针指向指定的提交,保留工作区中的更改,但清空暂存区。git reset --mixed <commit-hash>
- 硬重置(丢弃所有更改,恢复到指定提交的状态):
这条命令会将当前分支的 HEAD 指针指向指定的提交,并丢弃所有未提交的更改。使用时需谨慎。git reset --hard <commit-hash>
- 软重置(保留工作区和暂存区的更改):
- 创建新的提交来撤销:
忽略文件
在实际开发中,有些文件不需要纳入版本控制,例如编译生成的文件、临时文件和个人配置文件。Git 提供了 .gitignore
文件来忽略这些文件。
创建
.gitignore
文件:touch .gitignore
添加忽略规则:
- 忽略单个文件:
file1.txt
- 忽略某个目录及其子目录中的所有文件:
logs/
- 忽略某个扩展名的文件:
*.log
- 忽略某个目录中的特定文件:
logs/error.log
- 忽略所有
.DS_Store
文件:.DS_Store
- 忽略所有
.idea
目录:.idea/
- 忽略单个文件:
忽略已跟踪的文件:
如果某个文件已经被添加到版本库中,但后来决定忽略它,可以使用以下命令:git rm --cached filename
这条命令会将文件从版本库中移除,但保留工作区中的文件。然后,你需要在
.gitignore
文件中添加相应的忽略规则,以防止未来再次跟踪该文件。
小结
通过本文的介绍,读者应该能够熟练地进行 Git 的基本操作,包括添加和提交文件、查看状态、查看提交历史和撤销操作。这些操作是 Git 日常使用的核心部分,掌握它们将有助于你更高效地进行版本控制。接下来的文章将深入探讨 Git 的高级特性和实际应用案例,帮助读者进一步提升 Git 技能。希望本文能为你的 Git 学习之旅提供有价值的指导。
实战案例
为了更好地理解这些操作的实际应用,我们来看一个具体的例子。假设你正在开发一个 Web 应用项目,项目结构如下:
my-web-app/
├── index.html
├── styles.css
├── app.js
└── README.md
初始化仓库:
cd my-web-app git init
添加所有文件到暂存区:
git add .
提交初始版本:
git commit -m "Initial commit"
修改
app.js
文件:
编辑app.js
文件,添加一个新的函数:function greet(name) { return "Hello, " + name; }
查看工作区状态:
git status
输出信息可能如下:
On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: app.js no changes added to commit (use "git add" and/or "git commit -a")
查看文件差异:
git diff
输出信息可能如下:
diff --git a/app.js b/app.js index e69de29..d0746c9 100644 --- a/app.js +++ b/app.js @@ -0,0 +1 @@ +function greet(name) { return "Hello, " + name; }
添加修改到暂存区:
git add app.js
提交修改:
git commit -m "Add greet function to app.js"
查看提交历史:
git log --oneline
输出信息可能如下:
3a2b4c5 Add greet function to app.js 1234567 Initial commit
撤销
app.js
的修改:
假设你发现greet
函数有问题,决定撤销这次修改:git checkout -- app.js
通过这个实战案例,读者可以更直观地理解 Git 的基本操作是如何应用于实际开发中的。希望这些示例能帮助你在实际工作中更好地使用 Git。