Git 使用指南之 Git 自定义

Git 中支持自定义 忽略文件,使得 Git 自动忽略这些文件,不再被 track。还支持为 Git 中的命令配置简单、易用的 别名,这在频繁使用包含较为复杂参数的命令时极有成效!甚至当你不想使用 Github 或者 Gitee 时,你可以选择自定义 搭建一台 Git 服务器 作为私有仓库使用。

版权说明: 本文思路以及内容主要来自廖雪峰老师的 Git 教程 (强烈推荐膜拜原文),并结合个人使用所作,只作为学习记录使用。如内容有侵权请联系删除,禁止转载!

更多 Git 相关内容,请关注博主 Git 博文系列:

之一 >>> Git 使用指南之初识

之二 >>> Git 使用指南之时光穿梭机

之三 >>> Git 使用指南之远程仓库

之四 >>> Git 使用指南之分支管理

之五 >>> Git 使用指南之 WorkFlow (工作流)

之六 >>> Git 使用指南之 Git 自定义

之七 >>> Git 使用指南之 HEAD 指针

之八 >>> Git 使用指南之 Git 中的黑魔法


忽略特殊文件

场景描述:日常项目中,很多时候你必须把某些文件放到 Git 工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等…每次 git status 都会显示 Untracked files ...,有强迫症的看官心里肯定不爽。

解决方法 >>>>

Git 考虑到了大家的感受,通过 Git 工作区的根目录下创建一个特殊的 .gitignore 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件。

GitHub Ignore Repo

不需要你从头去写 .gitignore 文件,GitHub 已经为我们准备了各种工程项目(Pyhont、Java…)的配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:

传送门 —> https://github.com/github/gitignore


Ignore Document Policy

设置忽略文件,要遵循忽略文件的原则:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等:也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如 Java 编译产生的 .class 文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放密码、口令的配置文件;
  4. 忽略配置文件需要提交。

举个例子 >>>>

假设你在 Windows 下进行 Python 开发,Windows 会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有 Desktop.ini 文件,因此你需要忽略 Windows 自动生成的垃圾文件:

1
2
3
4
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

然后,继续忽略 Python 编译产生的 .pyc.pyodist 等文件或目录:

1
2
3
4
5
6
7
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

加上你自己定义的文件,最终得到一个完整的 .gitignore 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

最后一步就是把 .gitignore 也提交到 Git,就完成了!!!

当然,检验 .gitignore 的标准是 git status 命令是不是说 working directory clean


Git-Ignore More

.gitignore 配置文件配置不精确导致某些特殊需要文件被忽略 >>>>

有些时候,你想添加一个文件(App.class)到 Git,但发现添加不了,原因是这个文件被 .gitignore 忽略了:

1
2
3
4
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.

输出信息提示:如果你确实想添加该文件,可以用 -f 强制添加到 Git:

1
$ git add -f App.class

忽略规则配置文件检查(推荐)

如果由于 .gitignore 配置文件配置不精确导致某些特殊需要文件被忽略,你需要找出来到底哪个规则给过滤掉了,这时可以用 git check-ignore 命令检查:

1
2
$ git check-ignore -v App.class
.gitignore:3:*.class App.class

Git 告诉我们:.gitignore 的第 3 行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

事实上,很多时候都是由于个人编写的规则排除了部分文件,如下内容:

1
2
3
4
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class

发现:.* 这个规则把 .gitignore 排除了,并且 App.class 需要被添加到版本库,但也被 *.class 规则排除了。

虽然可以使用 git add -f 强制添加进去,但不要破坏 .gitignore 规则,这个时候可以添加两条 例外规则

1
2
3
4
5
6
7
8
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class

# 不排除 .gitignore 和 App.class:
!.gitignore
!App.class

例外规则:把指定文件排除在 .gitignore 规则外的写法就是 ! + 文件名,只需把例外文件添加进去即可。


配置别名

配置别名是针对 Git 中常用的较长,不容易记忆,或者参数太多太长的命令,为其配置精简别名,以简化使用。

配置

配置别名的命令格式如下(注意添加 --global 的影响):

1
2
3
4
5
# 为 git status 设置全局命令别名:git st
$ git config --global alias.st status

# 在当前仓库,为 git status 设置命令别名:git st
$ git config alias.st status

大多数开发人员配置的别名(以全局配置为例):

1
2
3
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

一个优秀的 git log 设置方案:

1
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

来看看效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
* 6a9789d - (HEAD -> master, tag: v1.0, origin/master) Tag Test (3 hours ago) <TheNightIsYoung>
* fb50835 - Dealing Merge Conflict (5 days ago) <TheNightIsYoung>
|\
| * c07648e - (FeatureA) Merge conflic test in FeatureA (5 days ago) <TheNightIsYoung>
* | 7d23fef - Merge conflic test in master (5 days ago) <TheNightIsYoung>
* | 28157d9 - Merge with no-ff (5 days ago) <TheNightIsYoung>
|\ \
| * | 02636d0 - Func-Add Permission(no-ff) (5 days ago) <TheNightIsYoung>
| * | b324182 - Func-Add User(no-ff) (5 days ago) <TheNightIsYoung>
|/ /
* | 8a39810 - Func-Add Permission (5 days ago) <TheNightIsYoung>
* | 3d6d64d - Func-Add User (5 days ago) <TheNightIsYoung>
* | 5f264b1 - (tag: v1.2) Merge branch 'featureB' (5 days ago) <TheNightIsYoung>
|\ \
| |/
|/|
| * 4528426 - (featureB) Add BTest File For featureB (5 days ago) <TheNightIsYoung>
* | fc2702b - Add ATest File For (5 days ago) <TheNightIsYoung>
|/
* 79c3a2c - Add git_rm_test.txt (8 days ago) <TheNightIsYoung>
* fe3235b - git tracks changes (8 days ago) <TheNightIsYoung>
* d6ddc31 - Git local data management test (8 days ago) <TheNightIsYoung>
* 0f5a696 - understand how stage works (8 days ago) <TheNightIsYoung>
* ebba382 - Add test code (8 days ago) <TheNightIsYoung>
* da1fadc - Add help info (8 days ago) <TheNightIsYoung>

自己动手设置一下,效果显著~~~


删除

有时候,我们想要删除配置好的别名删除怎么办?这时,需要借助配置文件。

我们知道,配置 Git 的时候,加上 --global 是针对当前用户起作用的;如果不加,那只针对当前的仓库起作用。

首先,我们需要知道配置文件放在什么位置?

1 –> 仓库配置文件

仓库的配置文件都放在 .git/config 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat .git/config 
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1

别名就在 [alias] 后面,要删除别名,直接把对应的行删掉即可。

2 –> 当前用户的 Git 配置文件

而当前用户的 Git 配置文件放在用户主目录(~)下的一个隐藏文件 .gitconfig 中:

1
2
3
4
5
6
7
8
9
$ cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com

配置别名也可以直接修改这个文件。

Author

Waldeinsamkeit

Posted on

2017-07-05

Updated on

2022-03-05

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.