/

【Git 权威指南】读书笔记 - 独奏 - Part 3

主要内容:【Git 基本操作】

Git 基本操作

先来合个影

在 Git 里,“留影”用的命令叫做 tag,更加专业的术语叫做“里程碑”(打 tag,或打标签)。

git tag -m "Say bye-bye to all previous practice." old_practice

里程碑无非也是一个引用,通过记录提交 ID(或者创建 Tag 对象)来为当前版本库状态进行“留影”。

git rev-parse refs/tags/old_practice
41bd4e2cce0f8baa9bb4cdda62927b408c846cd6

git describe 显示当前版本库的最新提交的版本号。格式:最近的 tag - 距离此 tag 的个数 - 该提交的 SHA1

git describe
old_practice

# .. commit something

git describe
old_practice-2-g8861c65

删除文件

rm *.txt 针对的是 工作区,对 暂存区版本库 没有任何影响。

git rm detached-commit.txt hack-1.txt new-commit.txt welcome.txt 删除动作加入了暂存区,commit 后在版本库罪行提交中删除了,在历史提交中尚在。

可以通过下面命令查看历史版本的文件列表:

git ls-files --with-tree=HEAD^
detached-commit.txt
new-commit.txt
welcome.txt

查看在历史版本中尚在的删除文件的内容:

git cat-file -p HEAD^:welcome.txt
Hello.
Nice to meet you.

git add -u 命令会对工作区中 所有改动 以及 删除文件 添加到暂存区。

恢复删除的文件

git cat-file -p HEAD~1:welcome.txt > welcome.txt

然后加入暂存区,提交到版本库:

git add -A
git commit -m "restore file: welcome.txt"

这是通过再次添加的方式恢复被删除的文件。

git add -A 命令会对工作区中 所有改动 以及 新增文件 添加到暂存区。

移动文件

git mv welcome.txt README

交互界面

git add -i

文件忽略

cat > .gitignore << EOF
> hello
> *.o
> *.h
> EOF

查看被忽略的文件:

git status --ignored -s

将忽略的文件强制添加到仓库中:

git add -f hello.h
git commit -m "add hello.h"
[master 48456ab] add hello.h
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 src/hello.h

忽略只对未跟踪文件有效,对于已加入版本库的文件无效。hello.h 添加到版本库后,对 hello.h 的修改都会立刻被跟踪到。.gitignore 只是对未入库的文件起作用。

本地独享式忽略文件

.gitignore 设置的文件忽略是共享式的,是因为.gitignore 被添加到版本库后成为了版本库的一部分,文件忽略在他人的工作区中同样生效。

享式忽略有两种方式:

  • 在版本库.git 目录下的一个文件.git/info/exclude 来设置文件忽略。
  • 通过 Git 的配置变量 core.excludesfile 指定的一个忽略文件,其设置的忽略对所有文件均有效。
git config --global core.excludesfile /home/jiangxin/_gitignore
git config core.excludesfile
/home/jiangxin/_gitignore

cat /home/jiangxin/_gitignore
*~ # vim 临时文件
*.pyc # python 的编译文件
.*.mmx # 不是正则表达式哦,因为 FreeMind-MMX 的辅助文件以点开头

Git 忽略语法

  • # 表示开始的行被忽略。
  • 通配符。* 任意多字符,? 一个字符,[abc] 可选字符范围。
  • 最后面是一个 / 表示忽略的是整个目录,同名文件不忽略,否则同名的文件和目录都忽略。
  • 最前面 ! 表示不忽略。
# 这是注释行 —— 被忽略
*.a # 忽略所有以 .a 为扩展名的文件。
!lib.a # 但是 lib.a 文件或者目录不要忽略,即使前面设置了对 *.a 的忽略。
/TODO # 只忽略根目录下的 TODO 文件,子目录的 TODO 文件不忽略。
build/ # 忽略所有 build/ 目录下的文件。
doc/*.txt # 忽略文件如 doc/notes.txt,但是文件如 doc/server/arch.txt 不被忽略。

文件归档

如果想压缩工作区文件归档,可能一不小心会把版本库(.git 目录)包含其中,甚至将工作区中的忽略文件、临时文件也包含其中。所以 Git 提供了一个归档命令 git archive

# 基于最新提交建立归档文件latest.zip
git archive -o latest.zip HEAD

# 只将目录 src 和 doc 建立到归档 partial.tar 中
git archive -o partial.tar HEAD src doc

# 基于里程碑v1.0建立归档,并且为归档中文件添加目录前缀1.0
git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz

References