将文件提交到仓库里:
1.git status
查看仓库的状态:
- 当前仓库处于哪个分支
- 有哪些文件
- 这些文件处于哪些状态
不妨在上一篇文章里的repo文件夹中创建一个新文件,看看创建后status发生了什么变化
这里我使用了Linux的echo指令:
查看status:
发现list内多了一个file1.txt,说明repo文件夹状态改变。此时文件处于untracked状态。
2.git add
上篇文章已经提到,git add指令的作用就是将文件从工作区提交至暂存区。
将前文提到的file1.txt提交,再用git status查看状态,发现file1.txt从之前的红色变成了绿色,说明此文件已进入暂存区。括号内提示可以使用git rm的指令将其从暂存区中取回工作区。
常用指令:
git add */文件类型/:将同类型的文件全部add
git add . :将当前文件夹内所有文件全部add
3.git commit
文件只有被提交到本地仓库中才算被真正保管,git commit指令智慧将暂存区的文件提交至仓库,对工作区内的文件无影响。
为了说明这点,我们再使用echo指令创建第二个文件file2.txt:
使用git status查看仓库状态
使用git commit指令,提交file1.txt
再次使用git status指令:
此时list内file1.txt不再存在。
回退版本
git reset
git reset用于回退版本,撤销修改,总共有三种用法
- git reset --soft
- git reset --hard
- git reset --mixed
新建一个文件夹loco,初始化以后新建三个文件。
一次操作一个文件,先add后commit,同时记录每次信息。
查看log,此时头指针指向third time:
将loco文件夹复制两份,使用控制变量法操作:
loco1执行soft指令:
执行soft以后,发现仅仅只是回退到了second time版本,用ls读取工作区list发现三个文件都在,用status发现3.txt还在暂存区。
loco2执行hard指令:
不仅回退到了上个版本,并且工作区和暂存区中3.txt也被删除
原理:每次commit一个版本,系统会自动保存当前版本的工作区和暂存区。执行hard的指令会将系统的工作区和暂存区被对应的版本覆盖,hard命令会将工作目录恢复到指定提交的快照状态,移除所有超出该快照范围的文件(比如说第二次commit时,只提交了1、2文件,那么快照中也就只有1文件和2文件,所以工作区也会被覆盖为1文件和2文件,而3文件会被删除),而soft指令不会这么做,所以执行soft指令后,3.txt仍然还在工作区和暂存区。
查看差异:
git diff
- 查看工作区,暂存区,本地仓库之间的区别。
- 查看不同版本之间的差异。
- 查看不同分支之间的差异。
示例 1: 查看工作区与暂存区的差异
假设你修改了一个名为 `example.txt` 的文件,并想查看自上次执行 `git add` 后你所做的更改:
git diff example.txt
这将输出该文件自上次添加到暂存区后的所有更改。
示例 2: 查看已暂存文件与最近提交的差异
如果你已经通过 `git add example.txt` 将修改添加到暂存区,并想查看这些修改与最近一次提交之间的差异:
git diff --staged example.txt
示例 3: 比较两个分支
假设有两个分支,名为 `main` 和 `feature-branch`,你想比较这两个分支在某个特定文件上的差异:
git diff main feature-branch -- path/to/file.txt
这会显示两个分支中指定文件的差异。
示例 4: 查看特定提交和当前工作目录之间的差异
如果你知道某个提交的哈希值(例如 `a1b2c3d`),并且想查看自那次提交以来对 `example.txt` 文件所做的更改:
git diff a1b2c3d -- example.txt
示例 5: 忽略空白变化比较两个分支
如果你只关心代码逻辑变化,不关心格式(如空格、制表符等)变化,可以使用 `-w` 参数:
git diff -w branch1 branch2 -- path/to/file.txt
这将忽略空白字符的变化,只显示实质性代码更改。
通过这些示例,你可以开始利用 `git diff` 来检查代码更改、审查代码以及准备合并。每种情况可能需要不同参数和选项来获取最相关和有用的信息。
删除:
git rm:
git rm是 Git 中用于删除文件的命令。它不仅会从工作目录中删除指定的文件,还会将这些删除操作记录到暂存区,以便在下次提交时生效。
基本用法
1. 删除单个文件:
git rm <file>
这条命令会从工作目录和暂存区中删除 `<file>` 文件。
2. 删除多个文件:
git rm <file1> <file2> ...
可以一次性删除多个文件。
3. 强制删除:
如果文件已经被修改且未提交,可以使用 `-f` 选项强制删除:
git rm -f <file>
4. 递归删除目录:
使用 `-r` 选项可以递归地删除一个目录及其内容:
git rm -r <directory>
5. 仅从暂存区移除(保留工作目录中的文件):
如果你只想将文件从 Git 的管理中移除,但希望保留在工作目录中,可以使用 `--cached` 选项:
git rm --cached <file>
- 删除操作是不可逆的,确保在执行之前确认要删除的文件。
- 在执行git rm后,需要使用 `git commit` 提交更改,以使这些变动生效。
示例:
假设你有一个名为 `example.txt` 的文件,你想要将其从 Git 仓库中移除:
git rm example.txt
git commit -m "Remove example.txt"
这样,`example.txt` 就会被从版本控制中移除,并且在下一次提交时,这一变更会被记录下来。
.gitignore文件与其配置
.gitignore`文件是一个特殊的文件,用于告诉 Git 版本控制系统在工作目录中忽略掉一些不需要纳入版本管理的文件或目录。这通常包括编译生成的文件、操作系统产生的文件以及个人配置文件等。
为什么使用.gitignore
- 减少仓库大小:避免将不必要的大文件存储在 Git 仓库中。
- 避免提交敏感信息:例如 API 密钥、密码等。
- 清洁的提交历史:只跟踪和项目相关的重要文件,保持提交历史清晰有序。
- 提高性能:减少 Git 检查更改的文件数量,可以提高性能。
如何设置.gitignore
- 在项目根目录下创建一个名为 `.gitignore` 的文件。
- 在该文件中添加规则来指定哪些文件或目录应该被忽略。每行一个规则。
常见的.gitignore规则
*.log //忽略所有以 .log 结尾的文件。
temp/ //忽略整个 temp 目录及其内容。
!important.log //不忽略 important.log 文件,即使前面有规则忽略了所有 .log 文件。
/todo.txt //只忽略根目录下的 todo.txt 文件,不会忽略其他目录下名为 todo.txt 的文件。
build/ //忽略 build/ 目录及其所有子目录中的内容。
示例.gitignore 文件
# 忽略所有 .a 结尾的文件
*.a
# 但跟踪 lib.a, 即使你前面排除了所有 .a 文件
!lib.a
# 只忽略项目根目录下的 TODO 文件, 不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc/notes.txt, 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有 .pdf 文件在 doc/ 目录下
doc/**/*.pdf
通过合理配置 `.gitignore`,可以有效地管理工作区和索引(暂存区)中哪些内容应该被 Git 跟踪。这对于维护项目清洁和高效至关重要。
生效前提:这些被.gitignore管理的文件不能是已经被添加到版本库(本地仓库)的文件