git学习日志-git文件的跟踪
在我们的工作目录下,每个文件不外乎有两种状态:已跟踪或未跟踪。
- 已跟踪,指被纳入git版本控制的文件;
- 未跟踪,指未被跟踪的文件,工作目录中除了已跟踪的文件之外的其他所有的文件。
在克隆某一git仓库时,工作目录中的所有文件都是已跟踪文件。
文件追踪流程.png检查文件的状态
可以通过git status
命令查看哪些文件处于什么状态。
显示当前所在分支名称,没有出现任何处于未跟踪状态的新文件等信息。
现在我们在项目下创建一个新的文件,比如说创建README.md文件。然后再执行git status
命令,可以看到以下结果:
可以看到新建的文件出现在Untracked files
下面,它表示未跟踪的文件(git在之前的快照中没有这些文件)。
git不会自动跟踪这些未跟踪的文件,需要我们明确地告诉git“我们要跟踪这些文件”才行。
查看状态也可以使用简略模式,在git status
命令后加上-s
或--short
参数。如图:
显示结果分为两列,左列指示暂存区及工作区的状态,右列指示文件。
而左列又分为两栏,左栏指示暂存区的状态,右栏指示工作区的状态。
- 新添加但未跟踪的文件前有
??
- 新添加到暂存区的文件前有
A
- 修改过的文件前有
M
跟踪新文件
使用git add
命令可以开始跟踪一个文件。
如果我们想跟踪刚创建的README.md
文件,我们需要运行以下命令:
git add README.md
运行完成以后再查看状态,运行git status
,可以看到README.md
文件已经被跟踪了,并且这个文件处于暂存状态(Changes to be committed:
目录下的文件都是已暂存状态)。
如果提交的话,那么这个文件在我们运行git add
时的版本将被留存在git的历史记录中。
注意:
如果
git add
命令后加目录参数,那么将递归地跟踪该目录下的所有文件。
暂存已修改的文件
现在我们再创建一个新文件README-CN.md
,并跟踪这个文件,然后再修改这个文件。
运行git status
命令,查看状态,结果显示如下:
README-CN.md
文件出现在Changes not staged for commit:
下面,这就说明已跟踪的文件内容发生了变化,但是还没有放到暂存区。如果想暂存这次更新,就需要运行git add
命令。
注意:
git add
命令应该理解为:将内容添加到下一次提交中,而不能简单的理解为:将一个文件添加到项目中。
运行git add
命令,将README-CN.md
文件放到暂存区,现在两个文件都已经暂存了。如果此时,我们再对README-CN.md
文件内容进行修改,再运行git status
命令,查看结果:
会看到README-CN.md
文件同时存在于暂存区和非暂存区。这是因为git只是暂存了运行git add
命令时的版本,如果有修改的文件,需要再次运行git add
命令把最新的版本暂存起来。
忽略文件
如果有文件不希望被git管理,那么可以创建一个名为.gitignore
的文件,列出要忽略的文件模式。
.gitignore
的文件的格式如下:
- 所有空行或以
#
开头的行都会被git忽略; - 可以使用标准的glob模式(shell使用的简化了的正则表达式)匹配,会递归的应用在整个工作区中;
- 匹配模式可以以
/
开头防止递归 - 匹配模式可以以
/
结尾指定目录; - 要忽略指定模式以外的文件或目录,可以在模式前加上
!
取反。
注意:
glob模式是指shell中使用的简化了的正则表达式。
*
匹配零个或多个任意字符;
[abc]
匹配任何一个列在方括号中的字符(要么匹配一个a,要么匹配一个b,要么匹配一个c);
?
只匹配一个任意字符;
方括号中如果使用短线分隔两个字符,表示所有在这两个字符范围内的都可以匹配([0-9]
表示匹配所有0到9的数字);
**
表示匹配任意中间目录,比如a/**/z
可以匹配a/z
、a/b/z
或a/b/c/z
等。
例如:
# 忽略所有的.a文件
*.a
# 跟踪所有的lib.a,即时在前边忽略了.a文件
!lib.a
# 只忽略当前目录下的todo文件,而不会忽略a/todo文件
/todo
# 忽略任何目录下名为build的文件夹
build/
# 忽略doc/notes.txt,但不忽略doc/server/arch.txt
doc/*.txt
# 忽略doc/目录及其所有子目录下的.pdf文件
doc/**/*.pdf
查看不同
通过git diff
命令可以查看尚未暂存的文件更新了哪些内容。
此命令是比较工作目录中当前文件和暂存区快照之间的差异,即修改后还没暂存的变化内容。
如果要查看已暂存的将要提交到下次提交里的内容,可以使用
git diff --staged
这条命令是将比对已暂存文件与最后一次提交文件的差异。
提交
暂存区的文件可以通过git commit
命令进行提交,填写注释,保存退出。
也可以在git commit
命令后加-m "注释"
(注意注释要加双引号)完成提交。
如果觉得每次都要先添加到暂存区再提交很繁琐,也可以在git commit
后加上-a
参数,这样git会自动将所有已跟踪过的文件暂存起来一并提交,从而跳过git add
步骤。
移除文件
若希望从git中移除某个文件,就必须从已跟踪文件清单中移除(也就是说从暂存区移除),然后再提交。
手动删除文件,运行git status
时,会在未暂存清单(Changes not staged for commit
)中看到以下信息。
然后再使用git rm
命令可以记录移除指定文件的操作。
git rm test.txt
git移除删除的文件.png
在下一次提交时,该文件就不会再被纳入版本管理了。
- 如果希望移除以前修改过或已经在暂存区的文件时,需要加
-f
参数。 - 如果希望只是将文件从暂存区移除,但仍然保留在当前工作区(只是不想让git继续追踪该文件),可以在
git rm
后加--cached
参数。
git rm --cached test.txt
git rm
命令后也可以加文件或目录名。
# 移除a目录下的所有.log文件
git rm a/\*.log
# 移除所有以.txt文件结尾的文件
git rm \*.txt
移动文件
使用git mv
命令可以对文件改名。
git mv a.txt b.txt
git修改文件名.png
其实git修改文件名可以分为以下三条命令:
mv a.txt b.txt
git rm a.txt
git add a.txt