控制逻辑流程


本地操作

初始化项目

1
git init [<projectName>]

若项目已存在,直接进入项目目录执行命令 git init,当然,前提是已安装 Git。若项目不存在,则运行 git init <projectName>,此命令会在当前目录下新建一个项目 projectName 并项目根目录中新建名为.git 的目录,Windows 用户可能需要通过相关设置才可以查看到此目录。需要注意的是,.git 并不是版本控制的工作区,而是 git 的版本仓库,这一目录下存放了很多东西,例如其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD

修改项目

在 Git 中一个非常重要的概念就是修改,与传统版本控制系统控制元文件不同,Git 引入以修改为控制元的控制结构。就如上图中 git status 返回的内容 “create/copy files…”,这就是一种修改,在 Git 中增加或删除都算作修改。现在作出修改:

1
2
vim README.md  # 新建并编辑文件
# 写入任意内容保存退出

此时查看 Git 状态,已经检测到工作空间中修改(新增)了一个 README.md 文件,并且迫不及待提示使用 git add 完成后续流程操作。

1
2
3
4
5
6
7
8
9
10
❯ git status
On branch master

No commits yet

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

nothing added to commit but untracked files present (use "git add" to track)

加入暂存区

git add 的作用就是将工作区中的修改添加至暂存区

根据提示使用 git add README.md

1
2
3
4
5
6
7
8
9
10
❯ git add README.md

❯ git status
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md

退出暂存区

有来就有回,根据上面的提示 “use “git rm –cached …” to unstage” 可知,使用 git rm 可以将修改退出暂存区,不用担心,这并不会删除工作区的源文件。status 返回为未添加状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ git rm --cache .\README.md
rm 'README.md'

❯ git status
On branch master

No commits yet

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

nothing added to commit but untracked files present (use "git add" to track)

提交修改

使用 git commit 提交已加入暂存区的修改

commit 命令会将暂存区中内容加入版本仓库中,并且可以附加修改信息标题。git addgit commit 的前提,这也就是为什么说 git commit 提交的是已加入暂存区的修改。

1
2
3
4
5
6
7
8
9
10
11
❯ git commit -m "📑第一次上传"
[master (root-commit) 4553d51] 📑第一次上传
1 file changed, 1 insertion(+)
create mode 100644 README.md

❯ git log
commit 4553d51c389bae5da3e77d71fe53326a0f48e330 (HEAD -> master)
Author: CoderKang <example@kang.com>
Date: Mon Sep 12 14:06:47 2022 +0800

📑第一次上传

通过 git log 可知,提交后会生成一个 commitId,这个 id 是结合

  • The source tree of the commit (which unravels to all the subtrees and blobs)
  • The parent commit sha1
  • The author info
  • The committer info (right, those are different!)
  • The commit message

并使用 SHA1 算法自动生成的。

撤销修改

1
2
3
4
❯ cat .\README.md
# This is a README file.
> Git is greate!
F**K SVN!

正如所见,我们在工作区写入了一些不好的内容,现在需要撤销这些修改。当然,这些修改可能存在好几种状态,需要区别处理。

  • ! add && ! commit

    这种当然是最理想的状态,可能只是工作中刚发的牢骚体现在了键盘上。此时只需要手动删除最后一行内容就可以了,另外 Git 提供的 checkout 可以使这个文件回到最近一次 git commitgit add 时的状态,或者使用 restore 废弃工作区中的修改。此时再查看文件内容:

    1
    git checkout -- README.md
    1
    git restore README.md
    1
    2
    3
    ❯ cat .\README.md
    # This is a README file.
    > Git is greate!
  • add && ! commit

    可能是因为中午没有休息,头脑昏昏沉沉,一不小心将修改的内容添加到了暂存区。

    1
    2
    3
    4
    5
    6
    7
    ❯ git add README.md

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

    问题不大,在状态返回内容中 Git 已经给出了解决方法,“git restore –staged…”。使用后又回到了未添加到暂存区状态,即第一种状态 ! add && ! commit

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ❯ git restore --staged .\README.md 

    ❯ 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.md

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

    可能加上昨晚熬夜加班,还是未发现 Bad Content,并且 commit 提交了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ❯ git log
    commit dd5cb08fda1a4ab65bf1a90338f00537f9299f98 (HEAD -> master)
    Author: CoderKang <example@kang.com>
    Date: Mon Sep 12 15:17:28 2022 +0800

    📑Bad Content

    commit 27294ac7f19b14054ba7dfba700133f4cd7884d2
    Author: CoderKang <example@kang.com>
    Date: Mon Sep 12 14:56:31 2022 +0800

    📑添加内容

    commit 4553d51c389bae5da3e77d71fe53326a0f48e330
    Author: CoderKang <example@kang.com>
    Date: Mon Sep 12 14:06:47 2022 +0800

    📑第一次上传

    依旧不慌,使用 reset 命令进行版本仓库内容的回退,让 Bad Content 回到暂存区,此时就回到刚刚介绍的情况 add && ! commit

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ❯ git reset HEAD^ .\README.md
    Unstaged changes after reset:
    M README.md

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

    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.md
  • add && commit && push

    此种情况看似很可怕,但是依旧可以使用 reset 方法解决,不多赘述。


远程仓库

实际中最常见的场景是使用内网 / 外网版本仓库来进行开发,这里以 Github 为例