banner
NEWS LETTER

原来:Git可以帮你管理杂乱的不同版本文件

Scroll down

🚫本教程参照廖雪峰的官方网站教程,请优先参考其网站。

Git的下载安装

安装渠道:Git官网

Git简介

提供各种各样的版本文件管理思路与流程,Git是工具,Github是一个服务器性质的集代码托管、论坛、开发等功能于一体的平台。

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

Git使用

Git仓库

版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

仓库创建

🧊使用命令git init初始化一个仓库,以当前目录作为Git仓库

文件创建

文件自身的创建是和Git没有关系的,可以用windows的可视化操作创建,也可以用终端指令创建任意文件or目录。

文件添加

🧊使用命令git add将任意一个文件添加到Git仓库,可以认为是暂时提交到Git仓库中的一个池子pool中

文件提交

🧊使用命令git commit将前面add操作添加到池子pool中的文件提交到仓库,因此add只能添加一个文件,但是commit可以一次性将pool中的所有文件提交。

1
2
3
4
5
6
7
8
$ git add readme.json
$ git add readme.txt
$ git commit -m "add:Step 1"
[master (root-commit) 55fc0ac] add:Step 1
2 files changed, 5 insertions(+)
create mode 100644 readme.json
create mode 100644 readme.txt

文件修改

自定义修改文件内容,保存文件内容。

状态查看

🧊使用命令git status查看当前仓库内的文件和上一次commit操作后的文件差异,提示在主分支On branch master被修改过了,Changes not staged for commit:但还没有准备提交的修改文件modified: readme.txt,推荐你使用命令git add <file>去将这个文件添加到pool中以备后续commit,或者使用命令git restore <file>去忽略这部分改动。no changes added to commit没有新的通过add文件到pool中去用于commit。

1
2
3
4
5
6
7
8
9
$ 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.txt

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

比较查看

🧊使用命令git diff查看具体修改的内容,显示的格式是Unix通用的diff格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git diff
diff --git a/readme.txt b/readme.txt
index 80a2774..19ac55a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
Git test:
-step1:文件自身的创建是和Git没有关系的,可以用windows的可视化操作创建,也可以用终端指令创建任意文件or目录。
\ No newline at end of file
+step1:文件自身的创建是和Git,【这里删除了“没有关系的”】可以用windows的可视化操作创建,也可以用终端指令创建任意文件or目录。
+step2:🧊使用命令`git add`将任意一个文件添加到Git仓库,可以认为是暂时提交到Git
仓库中的一个池子pool中
\ No newline at end of file

通过下面这一段可以发现,如果改动了文件a,中间保存过内容b,然后再把内容改回a,这样同样是能够被检测出来的。只要git目录下的已提交文件的同名文件被修改或删除了,就可以用git diff 来查看具体发生了什么修改(不需要等到add以后才能查)。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git diff
diff --git a/readme.txt b/readme.txt
index 80a2774..7d21f15 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
Git test:
-step1:文件自身的创建是和Git没有关系的,可以用windows的可视化操作创建,也可以用终端指令创建任意文件or目录。
\ No newline at end of file
+step1:文件自身的创建是和Git没有关系的,可以用windows的可视化操作创建,也可以用终端指令创建任意文件or目录。
+step2:🧊使用命令`git add`将任意一个文件添加到Git仓库,可以认为是暂时提交到Git仓库中的一个池子pool中
\ No newline at end of file

修改添加

🧊使用命令git add将修改动的文件再次添加到pool。

🧊使用命令git status再次查看仓库中文件的状态信息,文件modified: readme.txt准备被提交Changes to be committed:

1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.txt

修改提交

🧊使用命令git commit将pool中的文件提交给Git进行版本更新,提示 1 file changed, 2 insertions(+), 1 deletion(-)1个文件发生改动,添加2行,删除1处。

1
2
3
4
$ git commit -m "add:Step 2"
[master a71de4e] add:Step 2
1 file changed, 2 insertions(+), 1 deletion(-)

然后使用命令git status继续查看仓库文件状态信息,提示主分支On branch master下是整洁的,即没有改动也没有需要提交的文件nothing to commit, working tree clean

1
2
3
4
$ git status
On branch master
nothing to commit, working tree clean

仓库版本

每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

版本查看

🧊使用命令git log查看当前仓库下的所有commit版本,显示从最近到最远的提交日志

📌一大串类似a71de4e70d30...的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了,这种分布式计算方式简单地说就是让没有互相通信的人各自独立的生成自己的版本号,结果俩人版本号冲突发生的概率趋向于无穷小,这样就可以认为永远不会发生冲突。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git log
commit a71de4e70d30009b6f3dab4e25ed22e42d092929 (HEAD -> master)
Author: DESKTOP-SP0MN28\16485 <164854196@qq.com>
Date: Wed Feb 28 13:09:43 2024 +0800

add:Step 2

commit 55fc0ac6bcca68900cd342f8c48852ae55ecbd85
Author: DESKTOP-SP0MN28\16485 <164854196@qq.com>
Date: Wed Feb 28 12:39:33 2024 +0800

add:Step 1

版本回退/前进

📌在Git中,用HEAD表示当前版本,也就是最新的提交a71de4e70d30...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

🧊使用命令git reset来回到过去的commit版本,然后查看内容是否符合。

1
2
3
$ git reset --hard HEAD^
HEAD is now at 55fc0ac add:Step 1

🧊使用命令git log查看当前仓库下的所有commit版本,发现已经没有了add:Step 2那个版本(但是实际上还在)

📌Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向add:Step 1

1
2
3
4
5
6
7
$ git log
commit 55fc0ac6bcca68900cd342f8c48852ae55ecbd85 (HEAD -> master)
Author: DESKTOP-SP0MN28\16485 <164854196@qq.com>
Date: Wed Feb 28 12:39:33 2024 +0800

add:Step 1

🧊使用命令git reset来前进到未来的commit版本,只需要找到未来那个版本的commit id,只需要输入前几位,一般都可以自动索引到那个版本。

📌版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git reset --hard a71de4
HEAD is now at a71de4e add:Step 2

$ git log
commit a71de4e70d30009b6f3dab4e25ed22e42d092929 (HEAD -> master)
Author: DESKTOP-SP0MN28\16485 <164854196@qq.com>
Date: Wed Feb 28 13:09:43 2024 +0800

add:Step 2

commit 55fc0ac6bcca68900cd342f8c48852ae55ecbd85
Author: DESKTOP-SP0MN28\16485 <164854196@qq.com>
Date: Wed Feb 28 12:39:33 2024 +0800

add:Step 1

📌如果无法找回commit id,在Git中,当你用$ git reset --hard HEAD^回退到add:Step 1版本时,再想恢复到add:Step 2,就必须找到add:Step 2的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:这样就可以找到当初add:Step 2步骤的commit id

1
2
3
4
5
6
$ git reflog
a71de4e (HEAD -> master) HEAD@{0}: reset: moving to a71de4
55fc0ac HEAD@{1}: reset: moving to HEAD^
a71de4e (HEAD -> master) HEAD@{2}: commit: add:Step 2
55fc0ac HEAD@{3}: commit (initial): add:Step 1

Git理解

Git分区

工作区

就是所有与你工作相关的文件,或者说Git需要去管理的区域。

版本库

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

暂存区

📌第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

新建立一个LICENSE文件,并且给readme.txt文件添加一个step3的内容,再用命令git status查看仓库状态,Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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.txt

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

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

现在,使用两次命令git add或者git add --all,把readme.txtLICENSE都添加后,用git status再查看一下:

1
2
3
4
5
6
7
8
9
$ git add --all

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

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“整洁”的。

1
2
3
4
5
6
7
8
9
$ git commit -m "add:Step 3; addfile:LICENSE"
[master 6185ab1] add:Step 3; addfile:LICENSE
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 LICENSE

$ git status
On branch master
nothing to commit, working tree clean

Git修改

为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。

修改文件

首先将readme.txt文件改成a状态,再add,查看状态status,再将readme.txt文件改成b状态,再直接提交commit,再查看状态status。可以发现仍然存在着第二次修改没有被提交,但是我们此刻工作区中保存的文件已经是经历了两次修改的文件了,也就是说,我们在第一次修改之后就在这处修改已经打了一个标记,只要后续的修改没有被add到暂存区,那么都不会影响commit提交的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git add readme.txt

$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.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.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git commit -m "add:Step 4"
[master 674519f] add:Step 4
1 file changed, 2 insertions(+), 1 deletion(-)

$ 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.txt

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

撤销修改

如果编辑了文件保存了,那么就会在Git的监管下发现有文件状态变化,但是只要没有add到stage就可以在无状态更新情况下把文件手动改回原来状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git status
On branch master
nothing to commit, working tree clean

$ 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.txt

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

$ git status
On branch master
nothing to commit, working tree clean

也可以使用Git的命令git restore来回退到原来的文件,一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commitgit add时的状态。

另一种撤销修改的命令是git checkout -- readme.txt,意思就是,把readme.txt文件在工作区的修改全部撤销,git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git status
On branch master
nothing to commit, working tree clean

$ 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.txt

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

$ git restore readme.txt

$ git status
On branch master
nothing to commit, working tree clean

撤销添加

如果已经将文件修改添加到了暂存区,但是又想撤销这次添加,Git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区,但是这时候的工作区文件还是有修改:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
$ git status
On branch master
nothing to commit, working tree clean

$ 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.txt

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

$ git diff
diff --git a/readme.txt b/readme.txt
index b865854..016f23f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,4 +3,5 @@ step1:文件自身的创建是和Git没有关系的,可以用windows的可
step2:🧊使用命令`git add`将任意一个文件添加到Git仓库,可以认为是暂时提交到Git仓库中的一个池子pool中
step3:🧊使用命令`git commit`将前面add操作添加到池子pool中的文件提交到仓库,因此add只能添加一个文件,但是commit可以一次性将pool中的所有文件
提交。
step4:自定义修改文件内容,保存文件内容。
-step5:🧊使用命令`git status`查看当前仓库内的文件和上一次commit操作后的文件差异,提示在主分支`On branch master`被修改过了,`Changes not staged for commit:`但还没有准备提交的修改文件`modified: readme.txt`,推荐你使用命令`git add <file>`去将这个文件添加到pool中以备后续commit,或者使用命令`git restore <file>`去忽略这部分改动。`no changes added to commit`没有新的通过add文件到pool中去用于commit。
\ No newline at end of file
+step5:🧊使用命令`git status`查看当前仓库内的文件和上一次commit操作后的文件差异,提示在主分支`On branch master`被修改过了,`Changes not staged for commit:`但还没有准备提交的修改文件`modified: readme.txt`,推荐你使用命令`git add <file>`去将这个文件添加到pool中以备后续commit,或者使用命令`git restore <file>`去忽略这部分改动。`no changes added to commit`没有新的通过add文件到pool中去用于commit。
+这是一次没必要的添加
\ No newline at end of file

$ git add readme.txt

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


16485@DESKTOP-HCCK4RT MINGW64 /d/HZY/MyFiles/06_MyProject/08_Git/Test (master)
$ git restore --staged readme.txt

$ 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.txt

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

$ git diff
diff --git a/readme.txt b/readme.txt
index b865854..016f23f 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,4 +3,5 @@ step1:文件自身的创建是和Git没有关系的,可以用windows的可
step2:🧊使用命令`git add`将任意一个文件添加到Git仓库,可以认为是暂时提交到Git仓库中的一个池子pool中
step3:🧊使用命令`git commit`将前面add操作添加到池子pool中的文件提交到仓库,因此add只能添加一个文件,但是commit可以一次性将pool中的所有文件
提交。
step4:自定义修改文件内容,保存文件内容。
-step5:🧊使用命令`git status`查看当前仓库内的文件和上一次commit操作后的文件差异,提示在主分支`On branch master`被修改过了,`Changes not staged for commit:`但还没有准备提交的修改文件`modified: readme.txt`,推荐你使用命令`git add <file>`去将这个文件添加到pool中以备后续commit,或者使用命令`git restore <file>`去忽略这部分改动。`no changes added to commit`没有新的通过add文件到pool中去用于commit。
\ No newline at end of file
+step5:🧊使用命令`git status`查看当前仓库内的文件和上一次commit操作后的文件差异,提示在主分支`On branch master`被修改过了,`Changes not staged for commit:`但还没有准备提交的修改文件`modified: readme.txt`,推荐你使用命令`git add <file>`去将这个文件添加到pool中以备后续commit,或者使用命令`git restore <file>`去忽略这部分改动。`no changes added to commit`没有新的通过add文件到pool中去用于commit。
+这是一次没必要的添加
\ No newline at end of file

现在把工作区的文件修改也撤销了,使用命令git checkout -- readme.txt

1
2
3
4
5
6
$ git checkout -- readme.txt

$ git status
On branch master
nothing to commit, working tree clean

文件删除

在Git中,删除也是一个修改操作,一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ git status
On branch master
nothing to commit, working tree clean

$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
cancel.txt

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

$ git add cancel.txt

$ git commit -m "addfile:cancel.txt"
[master 241aeea] addfile:cancel.txt
1 file changed, 1 insertion(+)
create mode 100644 cancel.txt

$ git status
On branch master
nothing to commit, working tree clean

手动删除文件,被Git检测到

1
2
3
4
5
6
7
8
9
10
11
$ rm cancel.txt

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

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

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

📌注意使用git addgit rm效果是一样的,因为Git把删除也视为一次文件修改操作,并不因为这个操作让这个文件消失而变得特殊

1
2
3
4
5
6
7
8
9
10
11
$ git add cancel.txt

$ git commit -m "delfile:cancel.txt"
[master 7b48424] delfile:cancel.txt
1 file changed, 1 deletion(-)
delete mode 100644 cancel.txt

$ git status
On branch master
nothing to commit, working tree clean

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本,这里使用了前面提到过的版本回退,让我们退回到添加了cancel文件的commit状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git reset --hard HEAD^
HEAD is now at 241aeea addfile:cancel.txt

$ rm cancel.txt

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

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

$ git checkout -- cancel.txt

$ git status
On branch master
nothing to commit, working tree clean

📌git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

场景小结

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库如Github。

Git优势

远程仓库

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

Github远程仓库

请直接去Github官网注册一个账户。

Github SSH key设置

📌以下内容略写,请查阅相关其他资料

  • 第1步:创建SSH Key。
  • 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

Github仓库推送

按照Github提示执行指令将本地的仓库代码推送到Github,添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

1
2
3
git remote add origin git@github.com:Zhoufenmianfan/GitStudy.git
git branch -M main
git push -u origin main
1
2
3
4
5
6
7
8
9
10
11
12
$ git push -u origin main
Enumerating objects: 20, done.
Counting objects: 100% (20/20), done.
Delta compression using up to 16 threads
Compressing objects: 100% (17/17), done.
Writing objects: 100% (20/20), 2.14 KiB | 2.14 MiB/s, done.
Total 20 (delta 7), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (7/7), done.
To github.com:Zhoufenmianfan/GitStudy.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.

📌由于远程库是空的,我们第一次推送main分支时,加上了-u参数,Git不但会把本地的main分支内容推送的远程新的main分支,还会把本地的main分支和远程的main分支关联起来,在以后的推送或者拉取时就可以简化命令。

Github仓库绑定解除

想解除本地与远程仓库的连接,可以用git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息,这里的rm是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

1
2
3
4
5
6
7
8
$ git remote -v
origin git@github.com:Zhoufenmianfan/GitStudy.git (fetch)
origin git@github.com:Zhoufenmianfan/GitStudy.git (push)

$ git remote rm origin

$ git remote -v

远程库克隆

假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。

1
2
3
4
5
6
7
8
9
$ git clone git@github.com:Zhoufenmianfan/Zhoufenmianfan.github.io.git
Cloning into 'Zhoufenmianfan.github.io'...
remote: Enumerating objects: 570, done.
remote: Counting objects: 100% (569/569), done.
remote: Compressing objects: 100% (187/187), done.
remote: Total 570 (delta 241), reused 560 (delta 232), pack-reused 1
Receiving objects: 100% (570/570), 3.38 MiB | 1.99 MiB/s, done.
Resolving deltas: 100% (241/241), done.

📌GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

其他文章