banner
NEWS LETTER

原来:Git可以帮你管理杂乱的不同版本文件

Scroll down

🚫本教程参照廖雪峰的官方网站教程,请优先参考其网站。

Git优势

标签管理

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

📌Git有commit,为什么还要引入tag?“请把上周一的那个版本打包发布,commit号是6a5819e…”“一串乱七八糟的数字不好找!”如果换一个办法:“请把上周一的那个版本打包发布,版本号是v1.2”“好的,按照tag v1.2查找commit就行!”所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

创建标签

🧊使用命令git tag <name>就可以打一个新标签,默认标签是打在最新提交的commit上的,给过去的commit打标签需要找到历史提交的commit id。

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
$ git tag V2.0

$ git tag
V2.0

$ git log --graph --pretty=oneline --abbrev-commit
* efa0d7b (HEAD -> main, tag: V2.0, origin/main) add:add a feature:step11
* df12556 fix rebase
* 5307602 Deev (#2)
* b99d80c add:step10
* bc2c1a8 delete:想想垃圾
* 9059eaa merge with no-ff
|\
| * 7ff15b7 add:merge feature1
|/
* a86de26 conflick fixed
|\
| * 19d592e add:new a branch feature1
* | 9be30e1 add:Step 7
|/
* 62d62a4 add:new a branch dev
* 241aeea addfile:cancel.txt
* 9c6fad0 add:Step 5
* 674519f add:Step 4
* 6185ab1 add:Step 3; addfile:LICENSE
* a71de4e add:Step 2
* 55fc0ac add:Step 1

$ git tag V1.0 6185ab1

$ git tag
V1.0
V2.0

$ git log --graph --pretty=oneline --abbrev-commit
* efa0d7b (HEAD -> main, tag: V2.0, origin/main) add:add a feature:step11
* df12556 fix rebase
* 5307602 Deev (#2)
* b99d80c add:step10
* bc2c1a8 delete:想想垃圾
* 9059eaa merge with no-ff
|\
| * 7ff15b7 add:merge feature1
|/
* a86de26 conflick fixed
|\
| * 19d592e add:new a branch feature1
* | 9be30e1 add:Step 7
|/
* 62d62a4 add:new a branch dev
* 241aeea addfile:cancel.txt
* 9c6fad0 add:Step 5
* 674519f add:Step 4
* 6185ab1 (tag: V1.0) add:Step 3; addfile:LICENSE
* a71de4e add:Step 2
* 55fc0ac add:Step 1

🧊使用命令git show <tagname>查看标签信息,标签的作用可以类似于commit id的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git tag show V2.0

$ git show V2.0
commit efa0d7b0f1ec1f36c8faa2b58d747e58c6f4315b (HEAD -> main, tag: show, tag: V2.0, origin/main)
Author: DESKTOP-SP0MN28\16485 <164854196@qq.com>
Date: Fri Mar 1 13:38:51 2024 +0800

add:add a feature:step11

diff --git a/readme.txt b/readme.txt
index 44b8501..4e084ff 100644
--- a/readme.txt
+++ b/readme.txt
@@ -11,3 +11,4 @@ step9:工作的部分add到pool了
step10:工作了一部分,但是还没add到pool
step11:我自己加了一个功能
step12:远程小伙加了一个功能
+

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

操作标签

🧊使用命令git tag -d <tagname>来删除标签
🧊使用命令git push origin <tagname>来推送标签到远程
🧊使用命令git push origin --tags来一次性推送所有标签到远程

忽略文件

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:GitHub/gitignore

忽略原则

忽略文件的原则是:

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

忽略规则

📌可以通过GitIgnore Online Generator在线生成.gitignore文件并直接下载。

📌以下所有部分都是在.gitignore中文件写明的规则:

①假设你在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
# My configurations:
db.ini
deploy_key_rsa

④例外规则

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

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

文件校验

最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean

🧊使用命令git add -f <filename>强制添加被忽略的文件。
🧊使用命令git check-ignore命令检查忽略规则。

配置别名

只需要敲一行命令,告诉Git,以后st就表示status,当然还有别的命令可以简写,很多人都用co表示checkoutci表示commitbr表示branch--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。

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

配置文件

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:

例如:

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"

软件平台

Github开源项目

在GitHub上,利用Git极其强大的克隆和分支功能,广大人民群众真正可以第一次自由参与各种开源项目了。如何参与一个开源项目呢?比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:

1
git clone git@github.com:zhoufenmianfan/bootstrap.git

一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限,你将不能推送修改。Bootstrap的官方仓库twbs/bootstrap、你在GitHub上克隆的仓库my/bootstrap,以及你自己克隆到本地电脑的仓库,他们的关系就像下图显示的那样:

如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,对方是否接受你的pull request就不一定了。

SourceTree

当我们对Git的提交、分支已经非常熟悉,可以熟练使用命令操作Git后,再使用GUI工具,就可以更高效。

下载安装

Git有很多图形界面工具,这里我们推荐SourceTree,它是由Atlassian开发的免费Git图形界面工具,可以操作任何Git库。

软件使用

第一次运行SourceTree时,SourceTree并不知道我们的Git库在哪。如果本地已经有了Git库,直接从资源管理器把文件夹拖拽到SourceTree上,就添加了一个本地Git库:

命令手册

📌手册来源于廖雪峰的官方网站:友情附赠Git Cheat Sheet,建议打印出来备用:Git Cheat Sheet

🔥Git命令手册下载

其他文章