一、什么是Git
版本控制系统(VCS)是将『什么时候、谁、对什么文件做了怎样的修改』这样的信息以版本的形式保存并进行管理的系统。
简单来说,版本控制系统会去记录它所管理的文件的『历史版本』。
版本控制系统 “不是网盘,而胜似网盘” :
- 它和网盘的相同点在于:它可以位于局域网,或者是外网上的一台服务器上,你和你的小伙伴们可以在不同的地方、不同的电脑上,以它为 “中介、桥梁” 共享文件。
- 它胜似网盘的地方在于:它能记录你和你的小伙伴们对文件修改的所以历史版本,并且你可以将你的文件恢复到你感兴趣的某个历史版本。
Git 并非唯一的版本控制系统,它的前辈是 Subversion 。2014 年 Git 的市场占有率首次超过 Subversion ,成为主流。
Git 相较于 Subversion 的先进之处在于:
-
Subversion 中的版本信息仅存在于中央仓库,而 Git 中所有的本地库中都有完整的历史版本信息。
-
Subversion 中的 “分支” 很重,创建分支、删除分支、合并分支等分支相关操作很慢,而 Git 中的分支很轻,分支操作是 Git 的拳头特性
二、Git的安装
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。由于开发机大多数情况都是windows,所以本教程只讲解windows下的git的安装及使用
第1步:安装Git
下载Git
- 官方下载地址:https://git-scm.com/download
- 淘宝下载地址:https://npm.taobao.org/mirrors/git-for-windows/
初始化配置
打开Git命令界面,在使用 git 之前需要使用 config 命令配置下用户名和用户邮箱:
git config --global user.name "<用户名>"
git config --global user.email "<邮箱>"
git config --global push.default simple
git config --global core.editor notepad
在使用 git 之前创建 SSH Key,未来会使用到:
ssh-keygen -t rsa -b 4096 -C "备注"
# 一路回车
cat ~/.ssh/id_rsa.pub
『备注』通常是 2 种风格:
- 邮箱
- username@hostname,例如:tom@192.172.0.110
第2步:安装GitKraken
提前注册一个 github 的账号,后续要使用
GitKran 简介
GitKraken 是 Git 客户端界的后起之秀,它的出现打破了『SourceTree 最好用』的说法。不少 SourceTree 的用户从 SourceTree 上迁移到了 GitKraken 。
GitKranken 的特点在于,界面更简洁、友好,这样在保证功能不少的情况下,上手比 SourceTree 更快。
GitKranken 比 SourceTree 还有一个有优势之处:它跨平台,在 Linux 上可用。
不过,GitKraken 从 6.5.3 版本开始收费,它的最后一个免费版本是 6.5.1 ,当你使用收费版本而又未付费时,使用 GitKranken 将无法打开本地仓库,这就约等于无法使用了。
对于这个问题解决的办法自然就是破解:使用一个可免费试用的低版本,并且关闭它的自动升级功能
安装
百度自行下载6.5.1 的 GitKraken 安装程序,或者致信博主。
安装过程一路 Next,没有特殊之处。
提示:安装程序 GitKrakenSetup-6.5.1.exe 只用执行一次,不要反复点击、运行它。导致,后面 “update.exe 怎么删不掉?”
破解
理论上,安装 GitKraken 6.5.1 版之后直接使用就可以,但是,讨厌的是 GitKraken 会『自动升级』。一旦自动升级,你的 GitKraken 自然就不再是最后一个免费版 6.5.1 了。
GitKraken “做手脚” 的地方就在于:正常安装之后,你桌面生成的 GitKraken 的快捷方式链接到的是 GitKranken 安装程序的 update.exe!所以,你通过点击快捷方式运行GitKraken 时,它总会先检查服务器上是否有新版本可以升级!如果有,GitKraken 就会下载最新本版,自我更新。
所以,破解的关键在于:干掉 update.exe ,让 GitKraken 无法升级,定死再 6.5.1 版本 。
在安装 GitKraken 之后,在你的安装目录(C:\Users\<用户名>\AppData\Local\gitkraken
)下会有一个名为 Update.exe
的可执行程序。
三、Git的基本操作
3.1、创建本地版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。由于git是分布式版本管理工具,所以git在不需要联网的情况下也具有完整的版本管理能力。
创建一个版本库非常简单。首先,选择一个合适的地方,创建一个空目录,在该文件夹中执行 git init,就可以让 Git 完成管理前的准备工作。
$ git init
执行成功后,你会看到类似如下信息:
Initialized empty Git repository in ...
Git 会在它管理的文件夹下创建名为 .git 的子文件夹,这个文件夹也就是逻辑上的『本地仓库』。它里面会存放被 Git 所管理的文件的相关信息(例如,历史版本)。
注意:你不要自己去操作 .git 目录,更不要随意将 .git 目录删除。这个目录下的内容是 Git 来使用和操作的。
当你执行完 git init 命令之后,当前目录就位于 Git 的监管范畴内,这个目录中的文件的变动(新创建的、被删除的、内容有更新的)都会被 Git 察觉。
3.2、Git 中文件的受管状态
Git 会将文件(文件夹)的状态分成以下 3 类:
状态 | 说明 |
---|---|
tracked被追踪 | tracked 状态意味着 Git 正在关注着这个文件。 你对这个文件的任何改动,都会被 Git 发现。Git 会进一步要求你提交你的改动,或撤销你的改动。 |
ignored被忽略的 | ignored 状态意味着 Git 完全不管这个文件,在 Git 看来它就跟不存在一样。 |
untracked不被追踪的 | untracked 状态是所有文件的初始状态。 逻辑上,它是 tracked 和 ignored 状态『之前』的一种状态,逻辑上,它是一种临时状态:你既没有要求 Git 监管它,又没有要求 Git 忽略它。 对于这个文件,Git 也是一脸懵逼不知道接下来该不该监测文件的变动,正因为如此,untracked 是一种临时状态,不应该长期存在。 |
注意
这里有 2 点需要强调的是:
所有的文件的初始状态都是 untracked 。
在正常情况下,文件不应该长期处于 untracked 状态,应尽快转变为 tracked 或 ignored 。
对于新创建的文件,它们都是处于 untracked 状态的,接下来它们应该尽快通过下述 2 种方法之一切换成 ignored 状态,或 tracked 状态。
untracked
└──> ignored
必须先在 Repo 文件夹中创建一个名为 .gitignore 的文件(必须是这个名字),
然后把要忽略的文件逐一列在这个文件中,一个文件一行,支持通配符。
windows上创建.gitignore文件:
先任意创建一个文件,例如:1.txt
在cmd中输入:ren 1.txt .gitignore
untracked
└──> tracked
可以使用 git add + git commit 命令,将它提交给 Git 监管即可。
3.3、新增一个文件的历史版本
git add + git commit 的作用简单来说,就是将一个文件的当前内容提交给 Git :
- 对于 untracked 状态的文件(即新增的文件),提交后会变成 tracked 状态;
- 对于 tracked 状态的文件(即原有的文件),其历史版本记录则会演进一步。
$ git add "readme.txt"
$ git commit -m "message"
对于一次『提交』而言,提交消息(message)是必须的 。否则,Git 会拒绝你的这次提交。
要新增『一次提交』之所以要同时使用 git add 和 git commit 是因为在将文件当前的内容添加成至本地仓库之前,要 先 将其添加至 暂存区 。git commit
『只会』将暂存区的文件的内容提交至本地仓库进行保存。
3.4、使用 Git 的核心思想:一致性
当你改动了工作区(硬盘上)的文件的内容之后,你可以使用 git status 命令查看文件的状态。你会看到类似如下信息:
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: 新建文本文档.txt
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
什么是工作区(WorkingDirectory)
工作区就是你在电脑里能看到的目录,比如我的temp文件夹就是一个工作区。有的同学可能会说temp不是版本库吗怎么是工作区了?其实temp目录是工作区,在这个目录中的“.git”隐藏文件夹才是版本库。这回概念清晰了吧。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
如下图所示:
分支和HEAD的概念我们稍后再讲。前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
这里除了能看到 Git 监控到的文件的变动 modified: 新建文本文档.txt
之外,在这条信息的上面,你还能看到 Git 为你给出的 2 条建议:接下来请使用 git add … 命令,或使用 git checkout – … 命令。
这两条建议的背后,体现出 Git 的一个核心『关注点』:Git 希望你能保持工作区和本地仓库的一致性 。
在初始状况下,工作区和本地仓库的内容是一致的,当你改动工作区的文件后,工作区和本地仓库的内容就不再一致了。
对于此情况,Git 希望你将它们重新『调整』成一致。
至于如何『调整』,有 2 种方案(这也就是 Git 对你给出的 2 条二选一的建议):
- 使用
git add <file>...
命令(及后续的git commit
命令),将你对工作区的改动提交到本地仓库。这样,工作区和本地仓库将会重新一致。这也就意味着,本地仓库的版本将向前演进。 - 使用
git checkout -- <file>...
命令用本地仓库(的最新、最近版本)的内容覆盖你的工作区的内容。这样,工作区和本地仓库将会重新一致。这也就意味着,你的工作区的内容的变动将会被覆盖、舍弃。
你在使用 Git 对你的文件夹、进行版本控制的整个使用过程中,你的工作区和本地仓库的状态的一致性的变化状态将是如下情况:
一致 > 不一致 > 重新一致 > 不一致 > 重新一致 > … > 一致
3.5、.gitignore 文件
之前已经提到过,.gitignore 是用于屏蔽某些文件被纳入到 Git 管理范围下的配置文件。
简单来说,.gitignore 文件就是一个『黑名单』,在其中列举的文件都不会被 Git 管理,Git 不会关注这些文件的创建、删除、改动,也不会将它们存入到本地版本库,更不会将它们上传到远程仓库。
-
创建
.gitignore
文件提示:.gitignore 文件必须叫 .gitignore ,一定不能错 。
在 window 系统中,windows 不允许直接新建文件名以
.
开头的文件(Linux 不存在这个问题)。因为,Windows 会误以为 .gitignore 是文件的后缀,而你的文件是没有名字的!所以这种情况下,你需要 “动脑子” 创建。你可以在 git bash 中通过 touch 命令创建,也可以从别的项目中拷贝一个过来。
-
.gitignore 文件的基本语法
##:表示注释 /:目录层级 *:通配符
例如:
忽略所有后缀名为 log 的文件,无所谓文件名。无论它位于什么层次结构。
*.log
忽略『根目录』下的 target 文件夹
/target/
这里最后的 / 非必须。不过个人建议还是加上,因为可以暗示出它是一个文件夹。
忽略所有名为 target 的文件夹。无论它位于什么层次结构中。
target/
补充
.gitignore 文件中有一个
!
表示的 “非” 的规则,对于它的使用相较而言比较复杂,暂时不要求掌握。
注意事项
-
.gitignore
配置文件的根目录就是当前 Git 工程目录。
.gitignore` 配置只对当前 Git 工程有效。 -
在配置语句的前后面添加空格、Tab、注释等,会导致当前行的配置语句失效。所以,不要添加非必要的空白符。
-
配置语句对已经 add、commit 的文件无效。
gitignore 模板
HELP.md
target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
### VS Code ###
.vscode/
3.6、取出历史版本
从本地版本库中取出文件只需要一个指令:
git checkout [ 版本标识 | 标签 ] <文件1>, <文件2>, ...
需要特别提醒的是,磁盘文件夹中的文件会被取出的文件『覆盖』(覆盖、覆盖),因此你对该文件作出的修改会丢失。
- 例如,本地版本库中的文件是 80 行的,你本地的文件被你改成 100 行(但未提交),执行 git checkout 之后,你的本地文件会变成 80 行。
3.7、从 git 中删除文件
git rm 用于删除文件,删除行为分为『弱删除』和『强删除』。
-
git rm --cache :『弱』删除
它表示让 Git『不再监管』某文件/文件夹,而该文件/文件夹在磁盘上『仍存在』。
-
git rm :强删除
它表示告知 Git『不再监管』某文件/文件夹的同时,还从硬盘上『删除』此文件/文件夹。
3.8、撤销操作
git reset ,使用图形界面完成
3.9、比较文件差异
git diff,使用图形界面完成