Git 基本操作流程
控制逻辑流程
本地操作
初始化项目
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 | vim README.md # 新建并编辑文件 |
此时查看 Git 状态,已经检测到工作空间中修改
(新增)了一个 README.md
文件,并且迫不及待提示使用 git add
完成后续流程操作。
1 | ❯ git status |
加入暂存区
git add
的作用就是将工作区中的修改添加至暂存区
根据提示使用 git add README.md
。
1 | ❯ git add README.md |
退出暂存区
有来就有回,根据上面的提示 “use “git rm –cached …” to unstage” 可知,使用 git rm
可以将修改退出暂存区,不用担心,这并不会删除工作区的源文件。status 返回为未添加状态。
1 | ❯ git rm --cache .\README.md |
提交修改
使用
git commit
提交已加入暂存区的修改
commit 命令会将暂存区中内容加入版本仓库中,并且可以附加修改信息标题。git add
是 git commit
的前提,这也就是为什么说 git commit
提交的是已加入暂存区的修改。
1 | ❯ git commit -m "📑第一次上传" |
通过 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 | ❯ cat .\README.md |
正如所见,我们在工作区写入了一些不好的内容,现在需要撤销这些修改。当然,这些修改可能存在好几种状态,需要区别处理。
! add && ! commit
这种当然是最理想的状态,可能只是工作中刚发的牢骚体现在了键盘上。此时只需要手动删除最后一行内容就可以了,另外 Git 提供的
checkout
可以使这个文件回到最近一次git commit
或git 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.mdadd && commit && push
此种情况看似很可怕,但是依旧可以使用
reset
方法解决,不多赘述。
远程仓库
实际中最常见的场景是使用内网 / 外网版本仓库来进行开发,这里以 Github 为例