工作区的文件有四个状态:

图源:
-
Untracked:新增的文件,尚未被 git 管理
-
Unmodified:文件内容与分支中的完全一致
-
Modified:UnModified 状态的文件被修改
-
Staged:文件被添加到暂存区,将会在下次提交(commit)时提交到分支
status
查看文件状态:
git status
如果输出:
❯ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
表明工作区文件与分支一致,没有任何文件需要提交到分支。
如果在工作区新建一个文件:
❯ git status
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
demo/src/main/java/cn/icexmoon/learngit/demo/MyController.java
nothing added to commit but untracked files present (use "git add" to track)
这表明存在一个未被跟踪(untracked)文件。
add
要提交这个文件到分支,需要先将它添加到暂存区(Stage Area):
git add demo/src/main/java/cn/icexmoon/learngit/demo/MyController.java
使用
git add .可以方便的将当前目录和子目录下的新添加/修改的文件添加到暂存区。
再次查看文件状态:
❯ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: demo/src/main/java/cn/icexmoon/learngit/demo/MyController.java
如果添加错了,需要从缓存区撤销(保留工作区的副本),可以按照提示:
git restore --staged demo/src/main/java/cn/icexmoon/learngit/demo/MyController.java
也可以使用:
git rm --cached demo/src/main/java/cn/icexmoon/learngit/demo/MyController.java
效果是相同的,都会删除暂存区内的文件,让文件重新变为未跟踪的/未修改的/已修改的。
可以使用git status -s方便地查看文件变更情况:

有四种情况:
-
绿色的 M,文件有改变,并且已经被添加到暂存区(staged)
-
红色的 M,文件有改变,但还未添加到暂存区(modified)
-
绿色的 A,新增文件,并且已经被添加到暂存区(staged)
-
红色的 ??,新增文件,没有被添加到暂存区(untracked)
diff
如果要查看有哪些工作区的内容已经修改,但还未添加到暂存区,可以:
git diff

换言之,这个命令的用途是比较暂存区与工作区的差别。
如果要查看稍后执行提交时暂存区有哪些代码变更会提交到分支,可以:
git diff --staged

commit
很常见的操作,用以下命令将暂存区的代码变更提交到分支:
git commit -m 'test'
每次修改工作区中的内容后都需要重新将其添加到暂存区,否则稍后的提交可能会不完整。这样做会显得有一些麻烦,因此 Git 提供一个更便利的操作:
git commit -a -m 'test'
这里的-a可以让 Git 执行提交时,将所有已经被跟踪的工作区文件添加到暂存区,并提交到分支。
注意,并不会包含新增文件(Untracked),需要显式添加到暂存区。
rm
Git 并不会自动跟踪文件的删除和移动,因此相应的操作需要通过 Git 命令显式执行。
第三方工具(比如 Idea 的 Git 插件)可以自动跟踪文件变化,可以省略这一步。
删除文件时,要分情况对待。如果文件已经被添加到暂存区,并且仅希望从暂存区删除而保留工作区的副本:
git rm --cached demo/src/main/java/cn/icexmoon/learngit/demo/MyController2.java
如果需要同时删除工作区和暂存区的文件:
git rm -f demo/src/main/java/cn/icexmoon/learngit/demo/MyController2.java
必须有
-f参数,否则会报错。
如果该文件已经被提交到分支,删除操作会被记录到暂存区:

稍后的提交操作会将分支上的文件删除。
mv
与rm类似,要让 GIt 跟踪文件移动,需要:
git mv demo/test.md demo/test2.md
这里相当于先将文件进行了复制,然后使用git rm删除文件,再通过git add添加副本。
The End.
参考资料

文章评论