Pro Git01-Git基础

Pro Git01-Git基础

我之前在知乎写了关于git的教程,但是现在我看来,内容过于笼统,很多地方只讲了操作方式,但是没有更深一点讲为什么,这一次开始连载git的文章,会比之前的更加深入。安装Git我就不再赘述了,但是我仍然希望你能去看看我那篇不成熟的文章。传送门

几种使用Git的场景

git简单工作流程

这是一张简单的长图,看不懂也没关系,知道个大概就行,接下来我们会一一开始介绍。

1.正常使用提交代码(云端有git仓库)

  1. git clone [xxx]

有两种获得Git项目仓库的方式,其中一种就是通过克隆一个现有的Git仓库。比如下图中的码云截图,这就是一个能保存Git云端的网站。

码云

当我们安装git以后,通过运行git clone xxx就可以获得一个和线上仓库相同的git项目。git的clone

第一种克隆的地址是HTTP,通过输入你在线上的账户和密码来克隆项目,第二种克隆是SSH,需要在云端配置本机的SSH公钥,配置以后就可以不用输入密码了,两种方式都可以克隆。这时候你所运行git clone命令的路径下就会多一个文件夹,文件夹的名字就是克隆地址中最后一个。https://gitee.com/likebenboy/spring.git这个url所代表的就是spring。

而在这个文件夹中除了你克隆下来的文件还有一个隐藏文件夹名为.git这个文件夹就是保存本地git仓库中的数据,删除以后该文件夹就不被git管理了。

git线上仓库文件结构

现在我们拥有了一个Git仓库,接下来,我们需要对这些文件做些修改,然后记录本次的修改,提交更新到仓库。现在我们先定义一个名词:git仓库中除了.git文件以外的文件都称为工作目录。在工作目录中每一个文件都处于两种状态:已追踪或未追踪

已跟踪:那些被纳入版本控制的文件,也就是被git所监控的文件。未跟踪:相反,也就是那些没有被纳入版本控制的文件。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件

  1. 检查当前文件状态

要查看哪些文件处于什么状态,git status命令可以做到这一点。如果你与我一样,在克隆完仓库马上执行此命令,你会看到类似的输出。

1
2
3
4
5
C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

这样说明你的工作目录没有任何修改,且当前工作目录下所有文件都处于已跟踪状态。我们现在暂时不去管理打印出来的Your branch is up to date with 'origin/master'.这代表你当前处于master分支,我们将会于下一篇文章中具体讲解分支相关的知识点。

现在让我试着去随便新增一个文件,在这个例子中,我将创建一个名字为likeben.txt的文件。

新建完成之后重新执行git status你会看到类似的输出。

1
2
3
4
5
6
7
8
9
C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

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

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

这样git就会告诉你在当前的工作目录下存在着未追踪的文件,如果你不对其进行处理,那么git将不会对于管理,也就是说这个文件与git无关。

  1. 追踪新文件

使用命令git add开始追踪一个文件。假如我们要追踪刚刚新建的likeben.txt文件。如果我们运行了该命令,你就可以看到该文件已经被git所追踪。

1
2
3
4
5
6
7
8
9
C:\Users\lenovo\Desktop\git文章\spring>git add likeben.txt

C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: likeben.txt

当然上述的命令是add后面直接跟上一个文件名,不过你也可以接路径的目录,例如这样git add ./如果后面跟上的参数是目录的路径,那么该命令将跟踪这个目录下所有文件。这条命令地意思是追踪当前文件夹中的所有文件。

  1. 暂存已修改的文件

继续接着上面的输入来讲。Changes to be committed:只要在这一行下面的文件,就说明已经是暂存的状态了。如果我们保存,那么此时此刻的版本将留在历史记录中。

那么假如修改我们已经追踪的文件会怎么样呢?当我们尝试修改文件中的内容之后,再次运行git status你会看到以下的内容。

1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: likeben.txt

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: likeben.txt

你可以看到多出了一些输出。文件likeben.txt再一次出现在了Changes not staged for commit:这行下面,着说明已跟踪的文件发生了变化,但是没有提交到暂存区,要暂存这次更新,需要运行git add命令。这个命令不光可以用来追踪新文件,也可以用来把已跟踪的文件添加到暂存区。

让我们再次运行以后的输出:

1
2
3
4
5
6
7
8
9
C:\Users\lenovo\Desktop\git文章\spring>git add likeben.txt

C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: likeben.txt

你会发现现在没有了,只有一个new file。还有一个种情况,假如某个文件已经提交了,但是我们修改了它,继续执行git add将它加入暂存区。你会得到以下的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: likeben.txt

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


C:\Users\lenovo\Desktop\git文章\spring>git add README.md

C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
new file: likeben.txt

那么假如我又重新修改了README.md文件呢?接下来会是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
new file: likeben.txt

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

它将再一次出现在非暂存区中,实际上Git只不过暂存了你运行git add命令时的版本吗,当我继续输入git add 命令之后,又只会出现一个目录了。

1
2
3
4
5
6
7
8
9
10
11
C:\Users\lenovo\Desktop\git文章\spring>git add README.md

C:\Users\lenovo\Desktop\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
new file: likeben.txt

所以这也告诉我们,如果你真的需要提供一次版本的切换,还是将这次修改提交更新,而不是只是放在暂存区中。只要你提交了更新,那么你就有机会拿回你的修改记录,否则可能会丢失这次更新。

  1. 提交更新

假定现在已经到了需要更新一个版本的时候了,是时候运行git commit来提交你的请求了。当你输入不带任何参数的命令时,这种方式会启动文本编辑器以输入本次提交的说明。经我测试,如果在Linux下的话会拉起vim编辑器,在Windows下的话不确定,因为我之前配置了notepad++,所以这里拉起了这个编辑器。

git的commit

这里是因为我把notepad++点了取消,git检测到我没有提交任何信息,所以就取消了这次commit。正常情况下我有应该把#去掉,以便可以提交我的commit。退出编辑器时,Git会丢掉注释行,用你输入提交附带信息生成一次提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
new file: likeben.txt


D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git commit
[master 8a454c9] 这是我的第一次commit提交 On branch master Your branch is up to date with 'origin/master'. Changes to be committed: new file: likeben.txt
2 files changed, 4 insertions(+), 2 deletions(-)
create mode 100644 likeben.txt

D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

nothing to commit, working tree clean

上图是我把2,8,10行的#去掉,然后在第1行输入了提交信息。当我们提交了以后,工作环境又变干净了。但是这样的方式不常见,通常我们会使用-m这个参数,直接在后面输入想提交的内容。-a选项,git会自动把所有已经追踪过的文件暂存起来一起提交,也就是跳过了git add这个步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

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: likeben.txt

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

D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git commit -a -m '第二次提交commit'
[master 262afc1] '第二次提交commit'
1 file changed, 2 insertions(+), 1 deletion(-)

D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)

nothing to commit, working tree clean
  1. 查看提交历史

在提交了更新以后,你可能想看下是否已经真的提交成功。你可以执行git log来查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git log
commit 262afc15d800f8cc5165f014fb4fb917e5135aa0 (HEAD -> master)
Author: wuheng <849808229@qq.com>
Date: Thu Oct 27 17:05:07 2022 +0800

'第二次提交commit'

commit 8a454c943dcc6ae29415349795867e70c6348384
Author: wuheng <849808229@qq.com>
Date: Thu Oct 27 16:53:47 2022 +0800

这是我的第一次commit提交
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
new file: likeben.txt

默认不带任何参数的时候,会按提交时间的降序来查看,一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交

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
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git log -p -2
commit 262afc15d800f8cc5165f014fb4fb917e5135aa0 (HEAD -> master)
Author: wuheng <849808229@qq.com>
Date: Thu Oct 27 17:05:07 2022 +0800

'第二次提交commit'

diff --git a/likeben.txt b/likeben.txt
index 2c813ea..9cc539e 100644
--- a/likeben.txt
+++ b/likeben.txt
@@ -1,2 +1,3 @@
likeben
-第一次波纹疾走
\ No newline at end of file
+第一次波纹疾走
+第二次波纹疾走
\ No newline at end of file

commit 8a454c943dcc6ae29415349795867e70c6348384
Author: wuheng <849808229@qq.com>
Date: Thu Oct 27 16:53:47 2022 +0800

这是我的第一次commit提交
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
new file: likeben.txt

diff --git a/README.md b/README.md

其他还有各种各样的参数供你调试,不过我一般都是在idea里面看,那里图形化界面会更明显一些。

  1. 推送到远程仓库

本来推送到远程仓库需要设置远程仓库的地址,但假如你是通过git clone下来的git项目,天生就带有远程仓库的地址,直接git push origin master

1
2
3
4
5
6
7
8
9
10
11
12
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git push origin master
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 780 bytes | 390.00 KiB/s, done.
Total 7 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:likebenboy/spring.git
0dc1da0..92f5bb9 master -> master

D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>

如果你想查看你已经配置的远程仓库服务器的简写,可以运行git remote,加上参数-v 会附带对应的url。

1
2
3
4
5
6
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git remote
origin

D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git remote -v
origin git@gitee.com:likebenboy/spring.git (fetch)
origin git@gitee.com:likebenboy/spring.git (push)

如果想要查看某一个远程仓库的更多信息,可以使用git remote show [remote-name]

1
2
3
4
5
6
7
8
9
10
11
D:\BaiduSyncdisk\给公司电脑传输内容\git文章\spring>git remote show origin
* remote origin
Fetch URL: git@gitee.com:likebenboy/spring.git
Push URL: git@gitee.com:likebenboy/spring.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)

结语

不知不觉已经写了3000多个字了,为了方便阅读,把后续场景放到下一篇吧,目前大家应该是清楚了如何克隆一个项目并为其开发的过程了。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!