本文主要介绍Git的文件操作,包含文件四种状态的之间的转换以及一些常用的提交、删除等操作,并在文末附有常用的Git操作命令图。博客原文: http://www.dustyblog.cn/311.html
一、Git 操作
1、Git 日常使用的六个命令
2、Git 文件操作
版本控制就是对文件的版本控制:首先要知道文件当前在什么状态,然后才能对文件进行修改、提交等操作,不然可能会提交了现在还不想提交的文件。
2.1、文件的四种状态
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到 Git 库, 不参与版本控制.通过 git add 状态变为 Staged;
- Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为 Modified. 如果使用 git rm 移出版本库, 则成为 Untracked 文件;
- Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处,通过 git add 可进入暂存 staged 状态, 使用 git checkout 则丢弃修改过, 返回到 unmodify 状态, 这个 git checkout 即从库中取出文件, 覆盖当前修改;
- Staged: 暂存状态.执行 git commit 则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为 Unmodify 状态. 执行 git reset HEAD filename 取消暂存, 文件状态为 Modified.
2.2、查看文件状态
git status
查看所有文件的状态
git status (filename)
查看指定文件的状态
foo.htm 文件的状态为 untracked(未跟踪),右下角提示:git add
暂存。
[s][p]
Git 这点做得很好:在输出每个文件状态的同时还说明了怎么操作,像上图就有怎么暂存、怎么跟踪文件、怎么取消暂存的说明。
[/p]
2.3、添加文件与目录
工作区(Working Directory)就是你在电脑里能看到的目录。
版本库(Repository)工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。
将 untracked 状态的文件添加到暂存区:
git add .
#添加当前目录的所有文件到暂存区(注意:最后面有个“.”);
git add (file) (file)
#添加指定文件到暂存区;
git add (dir)
#添加当前目录的所有文件到暂存区。
如图:新建的 aoo.htm 通过git add
添加到暂存区
2.4、移除文件与目录(撤销 add)
git rm --cached
#直接从暂存区删除文件,工作区不做出改变
通过移除操作,aoo.htm 文件恢复到 untracked 状态:
git checkout .
#用赞寻去全部或指定文件替换工作区的文件,这个操作很危险,会清楚工作区中未添加到暂存区的改动。
git clean
#一般会加上参数 -df,-d 表示包含目录,-f 表示强制清除;
新建 test.txt 文件并查看状态移除前:强行移除,test.txt 文件消失
2.5、查看文件修改后的差异
git status
只能查看对哪些文件做了改动,如果要看改动了什么,可以用:
git diff (files)
#查看文件修改后的差异
---a 表示修改前的文件,+++b 表示修改后的文件,可以发现,a 对应的文件是红色的‘Hello Word!’,b 对应的是蓝色的‘Hello Git!’;
此外,还有以下两个常用命令:
- git diff --cached #比较暂存区的文件与之前已经提交过的文件
- git diff HEAD~n #比较 repo 与工作空间中的文件差异
2.6、签出
2.6.1、使用情景
该文件已经存在仓库中,工作区已经对其进行修改过了,如果想撤销修改,可以使用 checkout。
检出命令git checkout
是 git 最常用的命令之一,同时也是一个很危险的命令,因为折腾命令会重写工作区。
2.6.2、语法
git checkout [-q][][--]
git checkout [-q][]
git checkout [-m][[-b]--[orphan]][]
太杂,晚些时候再整理
2.7、提交
通过add
只是将文件或者目录添加到 index 暂存区,使用commit
可以实现将暂存区的文件提交到本地仓库。
git commit -m [message] #提交暂存区到仓库区
git commit [file1] [file2] ... -m [message] #提交暂存区的指定文件到仓库区
git commit -a#提交工作区自上次 commit 之后的变化,直接到仓库区,跳过了 add,对新文件无效
git commit -v #提交时显示所有 diff 信息
#使用一次新的 commit,替代上一次提交
案例提交前状态提交 aoo.htm 文件,并查看提交后的状态从上图可以看出,提交后,暂存区 aoo.htm 没有了。
2.8、撤销更新
2.8.1、撤销暂存区更新
git reset HEAD [filename]
#将暂存区指定文件移出到工作区
2.8.2、撤销本地仓库 更新
撤销提交放弃工作区和 index 的改动,同时 HEAD 指针指向前一个 comit 对象:git log
#查看提交日志,git reset --hard HELD~1
撤销了上一次的提交,这里的上一次提交日志就不存在了。
cat [filename]
#查看文件内内容
git revert
#把指定的提交修改回滚,并同时生成一个新的提交
2.9、日志与历史
- git log #查看所有提交日志;
- git log [filename] #查看某文件提交日志;
- history #查看在 bash 下输入过的指令;
- git reflog #查看仓库中所有分支的所有更新记录,包括已经撤销的更新。
2.10、查看文件列表
git ls-files
#查看所有的缓存文件,也可查看指定状态的文件列表
2.11、删除文件
2.11.1、删除未跟踪文件
直接用 bash 中的rm
即可删除。
2.11.2、删除已提交文件
-f
强制删除,同时删除工作区和暂存区中的文件;
git reset HEAD [filename]
#撤销删除到工作区。
2.11.3、删除暂存区的文件,不删除工作区的文件
可通过上一步的操作完成。