- Git将数据当做一个文件系统的一组快照.每次提交或者保存状态的时候,Git会抓取一张所有文件当前状态的快照,然后存储一个指向该快照的引用.
- 如果文件没有变动,那么Git不会再保存在文件,而是设置一个指向已保存过的相同文件的链接.
-
Git通过散列值来在数据库中存储数据,而不是文件名.
-
Git所有的操作都是向数据库中添加数据.
-
三种状态:已提交committed,已修改modified,已暂存staged
- committed:数据已经被安全的保存到本地数据库
- modified:改动了文件,但还没提交到数据库
- 如果Git跟踪的文件出现了变更,并且没有被暂存,则就是modified状态
- staged:对已经修改的文件做出标识,并在下一次提交的时候加入到快照中
- 文件被修改,并且放入暂存区中,就是staged状态
-
工作目录是项目某个版本的单词检出(check out project,相当于从数据库中查看之前保存的文件状态)。这些数据从Git目录下面被提取出来,放到磁盘上以供使用。
-
暂存区保存了下次将要提交的信息。
Git配置
Git config
Git config用来获取和设置配置变量,用来控制Git外观和操作的方方面面。
这些变量放在三个不同的位置:所有用户、当前用户、单个仓库
- /etc/gitconfig,包含了系统中所有用户及其仓库的值。使用git config的 --system选项来从该文件读写配置变量
- ~/.gitconfig或者~/.config/git/config,针对当前用户,使用--global选项来从该文件读写配置变量
- 当前仓库的Git目录中的config文件:针对单个仓库使用的。
注意,每一级都会覆盖上一级的设置,所以./git/config中的值优于/etc/gitcongih中的值
设置用户身份
安装好Git的第一件事是设置name和email,Git每一次提交都需要用到这些信息。
命令如下:
git config --global user.name "your_name"
git config --global user.email "vms_zhang@tom.com"
如果传入了--global选项,则只需要设置一次就可以了.之后执行操作的时候,Git都会使用这些已经设置好的信息.
I. 如果想要在某个项目中使用不同的name,email,则可以在项目中使用不带--global的命令
检查个人设置
git config --list # 查看配置信息
也可以使用git config user.name 来查看Git中当前某个键的值.
Git基础
获取Git仓库
获取Git仓库的方法:
-
方法一:把现有的项目导入Git中
-
方法二:从服务器上克隆现有的Git仓库
方法一:在现有目录中初始化git仓库
- 只需要进入相应的项目目录并对项目进行跟踪
- 在这个目录打开bash
- 输入命令进行初始化
git init #标记当前目录是git目录
这个命令会创建一个.git的子目录,里面包含了Git仓库骨架的信息;
此时并未跟踪项目中的任何文件
- 跟踪项目中的文件并进行初次提交;
只需要执行git add命令,然后输入git commit命令就行了.
git add *.c # 跟踪所有的.c文件
git add LICENSE # 跟踪LICENSE文件
git commit -m "initial project version" # 提交,-m后面跟的是本次提交的备注信息
现在就已经对这些被跟踪的项目进行了初次提交
方法二:克隆现有仓库
比如克隆仓库git@github.com:VMS-zhang/GoStart.git,那么可以使用如下命令
git clone git@github.com:VMS-zhang/GoStart.git
这个命令会从github中克隆url所指向的仓库.
例子
- 创建一个空目录
- 打开bash界面,输入git clone git@github.com:VMS-zhang/GoStart.git
则会从github上把项目下载下来
下载下来的文件默认是已跟踪状态.
Git仓库中记录的变更
现在已经向git进行了一次提交,下一步可以做一些更改,然后再向仓库中提交数据.
工作目录下的每一个文件都处于两种状态
-
已跟踪tracked,即被Git感知的文件;已跟踪文件有三种状态,已修改/未修改/已暂存
-
未跟踪untracked,Git还没有感知到的文件
如果修改了已跟踪的文件,那么文件状态就会变成已修改,接下来需要把这些已修改的文件放到暂存区,提交所有已暂存的变更,重复这个过程.
查看当前文件的状态
git status
如果克隆仓库以后立即执行这个命令,会有如下的输出:
这个输出说明当前项目工作目录是干净的,因为没有任何文件被修改过;同时也没有找到任何未跟踪文件,否则文件会被列出.
默认是master分支.
例子:
- 向文件夹随便添加一个文件,例如一个名为README的文件
可以看到,README文件处于未跟踪状态,显示了"untracked files",Git不会自动把这些文件包含到下一次提交的文件范围中,除非明确告诉Git去跟踪这些文件.
跟踪新文件
刚才创建了一个README,但是还没有进行跟踪,使用git add对其进行跟踪.
可以看到,git status的时候,Changes to be committed下面就是已暂存的文件.
现在如果提交,那么之前执行的git add时候的文件版本就会被添加到历史快照中间.
暂存已修改文件
刚才clone的时候,从仓库获取到了README.md文件,如果对这个文件进行修改,则会使这个文件变成一个已跟踪但未暂存的状态
这个时候也需要使用git add命令来进行暂存.
Git add 既可以跟踪新文件,也可以用来暂存文件,还有一些其他功能.
Git add 命令的最好理解是:添加内容到下一次提交中!
二次修改
如果此时对README.md再一次进行修改,查看一下状态
现在README.md有两种状态
-
绿色的代表执行git add README.md时候的那个状态
-
红色的那个是现在README.md的状态.
所以还需要进行一次git add来设置README.md作为新的修改
忽略文件
可能不希望在仓库中记录一些日志信息,可以使用.gitignore来进行设置
- 创建一个名.gitignore的文件,在其中列出待匹配的模式
例子:
具体的匹配规则可以查看git文档.
查看已暂存或者未暂存的变更
如果想知道具体的修改内容,而不仅仅是修改的文件的名字,可以使用git diff命令
他解决了
- 查看未暂存的更改git diff
- 注意这个命令不是显示从上一次提交以来进行的变更,而只是显示还没有进入暂存区的那些变更
- 因为进入暂存区的变更将来会被提交到数据库,所以不需要进行特别指明,而还没有进入暂存区的数据下一次不会被提交到数据库中,所以需要进行指明
- 查看已暂存的更改git diff --staged
-
会比较已暂存文件和上次commit时候文件状态的差异
-
Git diff 显示了具体添加和删除了那些行.
- 如果查看尚未添加到暂存区的变更,可以使用git diff命令,而不需参数
命令会对比当前工作目录下的内容和暂存区的内容,对比结果就显示了有那些还没有暂存的新变更.
- 如果查看哪些已暂存的内容,可以使用git diff --staged命令,这会对比暂存区中保存的变更和上一次提交的内容
提交变更
任何没有进入暂存区的变更都不会进入到提交的内容中.
使用git commit -m "本次提交的备注信息"
输出了
-
提交到的分支
-
校验和f3e1844
-
改动的文件个数和源文件新增和删除了多少行的统计信息.
移除文件
首先需要把文件从暂存区中移除,然后再提交.
移除并从工作目录中删除
使用git rm命令:将文件从已跟踪列表移除并提交同时在工作目录中删除这个文件
此时这个文件在硬盘上也删除了
从工作目录中删除但没有在git中删除
注意,如果单纯的只是从工作目录中删除了一个文件,而没有使用git rm命令,那么会出现如下输出:
比如删除的是README文件
这个时候需要执行git rm 命令,Git才会记录文件的移除状态到暂存区
从git移除并不从工作目录删除
使用git rm --cached README
只是在git中删除了这个文件,而硬盘上依旧保存这个文件
重命名文件
git mv file_name new_name
给文件重命名
实际上,mv命令执行了三个操作
mv README README1
git rm README
git add README1
查看提交历史
git log
- 如果只是执行git log命令而不加参数,则输出所有的提交记录,新提交的在前面进行显示
常用参数
- -p参数,可以同时附带-2参数来查看最近的两次提交
-
-p会同时显示出每次提交的差异,即diff
- --stat,来查看每个提交的简要统计信息
-
改动的文件列表
-
被改动的文件数
-
新增行
-
删除行
- --pretty,更改默认的输出格式
- --pretty=oneline,在每一行中显示一个提交.
- 也可以自己指定输出的格式,
具体格式可参考git文档
撤销操作
向前一次commit中添加文件
如果提交之后才发现自己忘了添加某些文件,或者写错了提交信息,可以尝试使用--amend进行重新提交.
git commit --amend
例子
git commit -m "first"
git add second.txt
git commit --amend
上面代码只会产生一个提交,因为第二次提交修正了第一个提交的结果.
撤销已暂存的文件
如果修改了两个文件,并将两个文件加入到了暂存区,但是本次只想提交其中一个文件的修改
提示使用git restore --staged 命令把文件移出暂存区.
撤销对文件的修改
修改一个文件以后,如何把他恢复到上一次提交时候的状态?
git restore命令来进行撤销