主要内容:【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