GitHub基础操作
1.1. 准备工作
首先需要在需要版本管理的文件夹下,打开git命令控制台。
输入git init 这样就可以完成了git的初始化
接下来进行版本管理的一系列操作。
1.1.1. 版本管理的相关概念
暂存区(staged)
首先需要请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录。
对于已跟踪的文件,在工作一段时间后,它们的状态可能是未修改,已修改或已放入暂存区。
工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。
对于未跟踪的文件的版本管理,那就需要使用git add fileName,将fileName添加到下一次提交中。
对于已跟踪的文件未修改的文件,不需要什么操作
对于已跟踪的文件已修改的文件,那就需要使用git add fileName,将fileName添加到下一次提交中。
检查当前文件状态
可以用 git status 命令查看哪些文件处于什么状态。
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
?? 表示文件为新添加的未跟踪的文件
A 新添加到暂存区中的文件前面有 A 标记,
修改过的文件前面有 M 标记。
你可能注意到了 M 有两个可以出现的位置,
出现在右边的 M 表示该文件被修改了但是还没被放入暂存区,
出现在靠左边的 M 表示该文件被修改了并被放入了暂存区。
1.1.1.1. git add 命令
这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容到下一次提交中”
1.1.2. 查看已暂存和未暂存的修改
- 使用git diff
要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。也就是修改之后还没有暂存起来的变化内容。 - 使用git diff --staged
这条命令将比对已暂存文件与最后一次提交的文件差异。也可以用git diff --cached
1.1.3. 提交更新
1.1.3.1. 提交更新简介
git commit
如果直接输入这条命令,就会打开一个记事本,输入本次提交的说明。
$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
可以看到,提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添加和删改过
1.1.3.2. 跳过暂存区提交代码
跳过暂存区,即可以不使用git add fileName将已跟踪的文件添加到暂存区。
git commit -a -m “skip cached commit code”
1.1.3.3. 移除文件
在git中,移除文件,必须从暂存区域中移除文件,即使用git rm命令,而不是使用rm。
如果是使用rm,那么在提交的时候,会出现Changes not staged for commit(未暂存清单)
应该使用git rm fileName。如果删除去,已经修改过并且放在暂存区了,就必须增加强制删除选项-f
如果你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。那么就是用如下命令:
git rm --cached fileName
1.1.3.4. 移动文件
git mv sourceFile destinationFile
将sourceFile移动至destinationFile
git mv命令相当于三条命令
mv sourceFile destinationFile
git rm sourceFile
git add destinationFile
1.1.3.5. 查看文件列表
git ls-files 命令是用来查看暂存区中文件信息
常用参数
参数说明(括号里是简写)
–cached(-c)显示暂存区中的文件,git ls-files命令默认的参数
–deleted(-d)显示删除的文件
–modified(-m) 显示修改过的文件
–other(-o)显示没有被git跟踪的文件
–stage(-s) 显示mode以及文件对应的Blob对象,进而我们可以获取暂存区中对应文件里面的内容。
1.2. gitignore
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果没有这个文件,则需自己手工建立此文件)。
# 表示此为注释,将被Git忽略
*.a 表示忽略所有 .a 结尾的文件
!lib.a 表示但lib.a除外
/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt
bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 表示忽略根目录下的bin文件
/*.c: 表示忽略cat.c,不忽略 build/cat.c
debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: 表示忽略/foo,a/foo,a/b/foo等
a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表示不忽略bin目录下的run.sh文件
*.log: 表示忽略所有 .log 文件
config.php: 表示忽略当前路径的 config.php 文件
/mtk/ 表示过滤整个文件夹
*.zip 表示过滤所有.zip文件
/mtk/do.c 表示过滤某个具体文件
被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。
需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt
唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?
想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::
/mtk/*
!/mtk/one.txt
假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!
还有一些规则如下:
fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;
/*
!.gitignore
!/fw/
/fw/*
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。
1.3. 查看提交历史
查看提交历史
①git log
②git log -p -2
选项-p,它会显示每次提交所引入的差异
输出选项-2,它会仅显示最近提交的两次
③git log --stat
你想看到每次提交的简略统计信息,可以使用–stat 选项
④git log --pretty=format:"%an, %cd, %s"
–pretty。 这个选项可以使用不同于默认格式的方式展示提交历史
选项 | 说明 |
---|---|
%an | 作者姓名 |
%ae | 作者电邮 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date= 选项定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者(committer)的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
⑤git log --since=2.weeks
–since 可以查看最近一段时间提交的记录
⑥git log --after=“2018-05-21 00:00:00”–before=“2018-05-25 23:59:59”
–after --before 可以查看2018-05-21 00:00:00至2018-05-25 23:59:59这段时间,提交的记录
⑦当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史。
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个提交引入的差异。 |
–stat | 显示每次提交的文件修改统计信息。 |
–shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
–name-only | 仅在提交信息后显示已修改的文件清单。 |
–name-status | 显示新增、修改、删除的文件清单。 |
–abbrev-commit | 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。 |
–relative-date | 使用较短的相对时间而不是完整格式显示日期(比如,“2 weeks ago”)。 |
–graph | 在日志旁以 ASCII 图形显示分支与合并历史。 |
–pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(用来定义自己的格式)。 |