介绍

什么是 Git

Git 是 Linux 社区为了协作开发 Linux 而开发的一款开源轻量型分布式版本控制系统,以其开源、轻量的优点迅速超越了其他版本控制系统。

Git 能做什么

  • 记录文件的修改版本
  • 与他人协作修改一些文件
  • 整理文件版本(还原、应用修改等)

本文阅读说明

本文通过命令行操作演示 Git 的使用,较为基础。
对于一些基础的 shell 命令不会过多解释。但只要你能完全理解 cd ../..ls 之类命令的含义,阅读本文就足够了。

由于终端界面较为简单,所以很少有图片说明,演示输出内容时,以 $ 符号开头的行表示输入的命令。(有配图时以图片实际为准)

安装

Windows

下载安装程序 Git for Windows,按照安装程序的提示即可安装。

Linux/Unix

对于 Linux 来说,不同的发行版使用不同的包管理系统。

Debian/Ubuntu

如果使用的是最新稳定版 Debian/Ubuntu,在终端中输入:

apt-get install git

Alpine

apk add git

Red Hat Enterprise Linux, Oracle Linux, CentOS, Scientific Linux 等

yum install git

RHEL 及其发行版会包含旧版本的 Git,可使用源码安装新版。

MacOS

首先在 AppStore 中安装 Homebrew,然后打开执行:

brew install git

入门

配置账号

按照上文的步骤安装好 Git 后,在系统的终端中就可以使用 git 命令了,对于 Windows 用户,需要使用 Git Bash 应用。

使用 Git 协作时,需要让系统知道是哪个用户提交了代码,使用下面的命令配置提交时使用的用户名与邮箱:

git config --global user.name "用户名"
git config --global user.email "email@example.com"

--global 参数的含义是当前计算机用户的所有仓库都会使用这个配置。

新建一个仓库

mkdir learning-git # 新建文件夹 learning-git
cd learning-git    # 将工作目录切换到 learning-git
git init           # 初始化仓库

如下图所示:

新建仓库

这样就创建了一个空的仓库,接下来向其中添加文件。

添加并提交文件

让我们编写一个文本文件,保存为 README,如下图所示:

新建README文件

如果使用 Windows 编辑文件,请保存为 UTF-8 无 BOM 格式。

使用下面的命令将其提交到 Git 中:

git add README
git commit -m "添加 README 说明文件"

运行成功后,会提示:

$ git commit -m "添加 README 说明文件"
[master (root-commit) 6457fc4] 添加 README 说明文件
 1 file changed, 1 insertion(+)
 create mode 100644 README

如果提示:

$ git commit -m "添加 README 说明文件"
*** Please tell me who you are.
...
fatal: unable to auto-detect email address (got 'gardel@ubuntu.(unknown)')

则表示你没有配置账号,请回到第一步配置账号

提交成功后,输入 git log 即可查看提交历史,如下图所示。
查看提交历史

修改文件并再次提交

添加单个修改的文件

接下来随便修改以下 README 文件的内容,然后输入一下 git status,显示如下信息:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README

no changes added to commit (use "git add" and/or "git commit -a")

这表示我们修改了一些文件,现在是待添加状态(添加到提交列表),提示我们使用 git add 添加或者使用 git restore 还原,也可以用 git commit -a 提交所有文件。

那么我们输入 git add README 试试:

$ git add README
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README

可以看到 README 文件已经被加入 commit 列表了。

批量添加修改的文件

所有修改的文件都需要用 git add 添加吗?当然不是,可以用 git add . 快速添加所有修改的文件,也可以使用 git commit -a 直接提交所有修改的文件。

那么如何排除一些不需要上传到版本控制的文件呢?这就要用到 .gitignore 文件了。在此目录下新建一个 .gitignore 文件,内容如下:

*.password
.output
!default.password

其中 * 代表通配,! 代表排除,在 .gitignore 中的排除就代表强制包含(但是不能包含已经排除的目录下的内容)。

现在我们创建 default.password .output .password 这三个文件:

$ ls -a
.  ..  default.password  .git  .gitignore  .output  .password  README

再执行 git add .

$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitignore
        modified:   README
        new file:   default.password

这样 Git 就按照要求排除了 .output .password 两个文件。

强制添加与删除

那么使用了 gitignore 后如果我想把某个被忽略的文件强制提交上去呢?可以使用 git add -f 命令,即输入 git add -f .password

$ git add -f .password
$ git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitignore
        new file:   .password
        modified:   README
        new file:   default.password

如果要从待提交的列表中删除文件,可以使用 git restore 命令,但是这个命令会回退你的改动,推荐使用 git rm --cached,如果要删除目录,可以使用 -r 参数,

$ git rm --cached .password
rm '.password'
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitignore
        modified:   README
        new file:   default.password

$ ls -a
.  ..  default.password  .git  .gitignore  .output  .password  README

移除的文件还留在磁盘上。

git rm 命令通常用于将某些文件加入了 .gitignore 但是没有立即生效的情况。

提交

提交并查看记录:
输入命令:

$ git commit -m "添加 .gitignore 文件"
...
$ git log
...

再次提交

如图,可见提交记录中多了刚刚提交的记录。

如何删除文件

有两种办法:删除不需要的文件再提交一次,或撤销新建文件的提交(只有在该次提交只有一个新建操作时可用,否则会还原其他所有的修改)。推荐使用第一种,安全可控。
下面新建一个测试文件,并将其提交到版本控制中去。

$ vim delete_me
$ git add .
$ git commit -m "测试删除文件-新建操作"
[master 59f77c9] 测试删除文件-新建操作
 1 file changed, 1 insertion(+)
 create mode 100644 delete_me

现在删除 delete_me 文件:

$ git rm delete_me
rm 'delete_me'
$ ls -a
.  ..  default.password  .git  .gitignore  .output  .password  README
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    delete_me

使用 git rm 命令后,磁盘上的文件也被删除。git rm 的用法与系统命令 rm 非常类似,但是有一个不同的地方是如果加上 --cached 参数,将只删除 Git 仓库中的记录但保留磁盘上的文件,如下。

$ git rm --cached delete_me 
rm 'delete_me'
$ ls -a
.  ..  default.password  delete_me  .git  .gitignore  .output  .password  README
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    delete_me

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        delete_me

这样之后只需要再提交一次就可以达到删除文件的效果。

进阶

(未完待续)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据