下面介绍一些 Git 命令中的一些基本操作,也上以后经常用到的一些操作。
取得 Git 仓库
有两种方法获得 Git 仓库,第一种是在现有的目录下创建项目的 Git 仓库
到项目所在的目录运行 git init 命令,然后使用 git add 将想要跟踪的文件纳入版本控制
$ git init
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
第二种是使用 git clone [url] 从远端仓库中将项目克隆到本地仓库,之前讲过 Git 是分布式版本控制系统,Git 克隆的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。
$ git clone git://github.com/schacon/grit.git mygrit # 克隆 Ruby 语言的 Git 代码仓库 Grit
如果指定了文件名,那么克隆出来的项目会存在 mygrit 目录下,否则,项目就会存在 grit 目录下。
对文件的更新操作
Git 文件可以分为两种状态:已跟踪和未跟踪。已跟踪的文件会记录其已修改,已暂存和已提交三种状态。而未跟踪文件就不纳入 Git 管理的范围。初始化仓库时,通过 git add 将工作目录中的文件添加为已跟踪文件,git add 命令后的文件就是已暂存状态。已暂存的文件修改之后之后,这个文件重新变为已修改状态,已修改的文件不在暂存区域,文件处于未暂存状态,通过 git add 可以将之重新变为已暂存。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,文件状态变化周期为
查看文件状态
git status 可以查看文件状态
可以看到 changes not staged for commit 就是已修改未暂存状态,git add 可以将已修改文件加入暂存区域。这里要说明的一点是:git add 是将文件变为已暂存状态,已暂存文件修改后就变为已修改未暂存状态。
忽略某些文件
如果不想跟踪某些文件,可以创建 .gitignore 文件,将想要忽略的文件写入其中。
文件 .gitignore
的格式规范如下:
- 所有空行或者以注释符号
#
开头的行都会被 Git 忽略。 - 匹配模式最后跟反斜杠(
/
)说明要忽略的是目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。 - 星号(
*
)匹配零个或多个任意字符。 [abc]
匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);- 问号(
?
)只匹配一个任意字符; - 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如
[0-9]
表示匹配所有 0 到 9 的数字)
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
windows 中创建 .gitignore 文件的方法:
1. 在项目根目录下面创建 gitignore.txt 文件
2. 把你需要排除的文件名保存到 gitignore.txt 文件
3. 在 cmd 中切换到该文件的目录
4. 执行命令 ren gitignore.txt .gitignore
查看已暂存和未暂存的更新
git diff 查看未暂存的更新
git diff --cached/git diff --staged 查看已暂存的更新
具体细节可以查看 https://blog.csdn.net/qq_26826585/article/details/102666398
提交更新
暂存区域已经准备妥当可以提交了,提交之前注意检查还有什么文件没有 git add 过,否则提交的版本不会记录未暂存文件的修改。因此一般在提交前,使用 git status 查看一下。
git commit 可以提交更新,将会打开默认的编辑工具,在其中写入提交说明
git commit -m "提交说明" 直接提交并写入了提交说明
git commit -a -m "提交说明" 跳过暂存直接将已跟踪文件暂存后提交
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
git rm 文件名 将文件从暂存区域移除,并连带将工作区域的文件移除
git rm -f 文件名 如果是删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
git rm --cached 文件名 将文件从暂存区移除,并保留工作区的文件。
其中文件名可以使用正则表达式匹配
查看提交历史
git log 按时间显示提交的校验码,日期,作者,提交说明等信息。
git log 有一些常用的选项,使用 -p
选项展开显示每次提交的内容差异,用 -2
则仅显示最近的两次更新。
--pretty 选项很有用
--pretty = oneline 只显示提交校验码并在一行显示
--pretty=format:"%h - %an, %ar : %s" 按指定格式显示,便于后期编程分析
还有其他的格式:
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
其中,作者(author)和提交者(committer)之间究竟有何差别,其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。
限制输出长度
git log -n 仅显示最近提交的 n 次记录
git --since=2.weeks 显示最近2周内的提交
还可以指定具体的日期 git --since=("2019-10-22")显示10-22之后的提交
此外还有
选项 说明
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
如果要查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试脚本(位于项目的 t/ 目录下的文件)
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attribute
acd3b9e - Enhance hold_lock_file_for_{update,append}()
f563754 - demonstrate breakage of detached checkout wi
d1a43f2 - reset --hard/read-tree --reset -u: remove un
51a94af - Fix "checkout --track -b newbranch" on detac
b0ad11e - pull: allow "git pull origin $something:$cur