前言
在开始讲解之前,先借用网上的一张图,显示了使用Git 时的文件状态变化周期。
可以看到文件有四个状态
untracked(未跟踪的文件,相当于还未纳入版本管理)
-
tracked (已跟踪的文件,这个是我自己加的,在git中文件无非就两种,已跟踪和未跟踪,后三个状态都可纳入到已跟踪的文件这一类)
- unmodified :文件跟上个版本相比,没有修改过
- modified:文件修改过,但未加入暂存区(暂存区是git独有的概念,这个也是相较svn一个不同点:
使用svn时,修改完的文件直接提交到远程仓库.
git却不同,你确认要提交的文件,要先放入暂存区,然后再从暂存区提交到远程仓库) - staged:文件修改过并且已加入到暂存区,等着被提交到远程仓库
常用命令
创建仓库
git init
初始化仓库之后,我们会看工作目录下多了一个文件夹.git
,用于保存所有版本记录和配置文件。
查看配置信息
git config --list
有时候会看到相同的名称,因为它们来自不同的配置文件,文件的路径如下
- /etc/gitconfig:系统级的配置,对所有用户有效,使用--system参数查看系统配置
git config --system --list
- ~/.gitconfig:全局配置,使用--global 参数查看
git config --global --list
- .git/config:项目级别的配置,只对当前项目有效
git config --list
配置文件的写法
修改git仓库的用户名和邮箱(修改全局配置)
cd ~
#修改.gitconfig文件,修改后的内容如下
vi .gitconfig
修改之后的内容为
[user]
name = houhanbin
email = [email protected]
[color]
ui = true
使用命令查看我们的配置
git config --global --list
修改git用户信息
git config --global user.name "用户名"
git config --global user.email "用户邮箱"
这两个配置很关键,在提交纪录里会有这两个信息,用于标识上传人的身份,如果你使用github,这两个属性得和你github设置的名户名和邮箱一致,否则github不会记录你上传代码的记录。
检查文件的状态
git status
可能打印的内容有
-
On branch master
nothing to commit, working directory clean
说明你当前正在使用master
分支,工作目录没有任何文件被修改。 -
Untracked files
: 表示该文件还没有被追踪,git不会跟踪这个文件的变化,所以这个文件其实没有被纳入到版本管理中。 -
Changes to be committed:
文件已处于暂存区,等待用户提交。 -
Changes not staged for commit
:说明已跟踪的文件发生了改变,但是还没有放入暂存区。
跟踪文件
#跟踪所有文件
git add .
#跟踪一个文件(要指定文件的路径)
git add file
#跟踪一个目录(指定一个文件夹,git会递归跟踪这个文件下的所有文件)
git add dir
其实git add 命令有三个作用
1、开始追踪一个文件
2、将文件的快照放入暂存区
3、合并时把有冲突的文件标记为已解决状态
忽略某些文件
在日常开发中,ide有时候会生成一些文件,或者编译时会生成一些临时文件,这些文件其实是不用纳入版本管理中的,我们可以在项目的根目录下,创建一个.gitignore
文件,可以使用标准的glob匹配模式。
看一个.gitignore
文件的例子
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt
查看文件修改了哪些内容
不带任何参数,查看未加入暂存区的文件修改了哪些内容
git diff file
如果要查看,已经暂存的文件与上个版本的变化,可以使用下面的命令(未加入暂存区的变化不会显示)
git diff --cached file
提交更新
git commit -m "备注信息,比如这次修改了什么,做一个简短的记录"
只会提交暂存区的内容。
还有一种偷懒的方式,一条命令搞定暂存+提交(只对已跟踪的文件有效)
git commit -a -m "备注"
版本回退
每次commit之后,都会保存一条提交记录。
使用git log --pretty=oneline
产看提交历史记录,我们可以看到每次提交都会产生一个哈希串,作为每次提交的唯一标识,我们暂且把他称为commit_id
在git中HEAD
代表当前版本,HEAD^
代表上一个版本,上上一个版本就是HEAD^^
,如果前一百版本不可能写100个^吧,所以git提供一种简写方式HEAD~100
使用git reset
进行版本回退,这条命令有三个参数可选
- --hard:直接回退到某个版本,会出现文件丢失,慎用!
- --soft :不会直接丢弃版本间的变更,变更的内容会进入stage(暂存区),通过commit提交
- --mixed(默认)
#回退到上个版本
git reset --hard HEAD^
#回退到上上个版本
git reset --hard HEAD^^
#回退到指定commit_id的版本
git reset --hard commit_id
查看命令历史
git reflog
删除文件
如果我们想要删除一个文件,不能只是在工作目录中删除,还要把它从已跟踪的文件列表中剔除。
可以使用git rm
完成上述的两个操作,从工作目录中删除并且从跟踪文件中剔除
git rm file
提交之后,这个文件就不再纳入到版本管理中。
如果我们想把文件从git仓库中删除,但是这个文件仍保留在当前工作目录中,常见的场景:不小心把一些文件纳入到版本管理中,我们需要取消跟踪并保留这个文件,之后再把这个文件加入到.gitignore
文件中,请看下面这个命令。
git rm --cached file
移动的文件
git并不会跟踪文件的移动,如果想要监听这个文件的移动或者文件名称的变更推荐使用下面的命令
git mv from to
mv from to
git rm from
git add to
上面的两命令是等效的,你可以自己试一下这个命令,成功移动的文件会被标记为renamed
状态,