用人话讲,就是能控制代码版本的东西。最为开发者,往往更多的是用它与 Github 交互,当然,git 也可以提交代码到别的平台,这一点我们后面再讲。
这里,我们先给一个简明教程的链接,可以帮助你在5分钟内熟悉 git 的使用。当然,它过于简略,也许你需要本文来帮助你解读当中的一些要点。git - the simple guide
这里还有一个网页教程,采用游戏的方法学习 git ,不妨玩一玩,增进你对 git 的理解。Learn Git Branching
当然,如果你已经熟练掌握了 git,不妨看看事无巨细的 git documention
好耶!废话终于讲完了!进入正题!
工欲善其事,必先利其器。
程序员欲善 git,必先安装 git。
——《论语 · 没有说过》
首先你需要下载安装 git 。地址在这里git-scm.com/downloads。
下载并安装。按照如图所示进行选择。
在见到如下界面时,按照你的喜好进行选择。例如我自己选择的是 vim 。如果你不熟悉 vim ,你就先去学习 vim你也可以选择 notepad 或者 vscode 等编辑器。
注意!网上不少教程在下图所示界面会让你选择 Let Git Decide,但由于 GitHub 已经将主分支名字改为 main
,所以为了后续方便,把它改成 main!
接下来一路next,完成安装。
前面说到,git 是用来进行版本控制的。为了实现这一目标,我们需要首先告诉 git ,我们需要进行版本控制的代码在哪里。
新建或使用原有的文件夹,进入文件夹,右键点击 Git Bash Here
,打开如下所示页面
我的电脑用户名是83442@chenyang
,前面选择的文件夹为E:\code
,这个每个人都不一样。
输入git init
,界面上会显示
83442@Chenyang MINGW64 /e/code
$ git init
Initialized empty Git repository in E:/code/.git/
83442@Chenyang MINGW64 /e/code (main)
$
说明我们已经初始化成功。
下面,我们在版本库中创建版本。
首先我们通过touch
命令新建一个文件,比如叫做code.txt
,并使用vim进行编辑,我们将它的内容修改为Hello, world!
(程序员的 DNA 动了):
83442@Chenyang MINGW64 /e/code (main)
$ touch code.txt
83442@Chenyang MINGW64 /e/code (main)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
如果你不会使用 vim,也可以在文件夹中打开文件,用别的编辑器修改。
然后我们为 code.txt 创建一个版本version1.0。
83442@Chenyang MINGW64 /e/code (main)
$ git add code.txt
warning: LF will be replaced by CRLF in code.txt.
The file will have its original line endings in your working directory
83442@Chenyang MINGW64 /e/code (main)
$ git commit -m "version1.0"
[main (root-commit) 7be1bd8] version1.0
1 file changed, 1 insertion(+)
create mode 100644 code.txt
其中,version1.0
可以替换成你想要的内容,用来命名你当前的版本。
查看我们刚刚创建的版本:
83442@Chenyang MINGW64 /e/code (main)
$ git log
commit 7be1bd88fe8def114c34acc8f51617ce90044a34 (HEAD -> main)
Author: ** <**@**.com>
Date: Fri Jan 1 00:00:00 2021 +0800
version1.0
Author
处是我的 Github 用户名和邮箱所以隐去了。
这里面显示的一些信息非常重要,我们后面会进行讲解。
下面,我们再在 code.txt 中增加一行AMD, YES!
(Intel低声说了句:F**k)
83442@Chenyang MINGW64 /e/code (main)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
再创建一个版本version1.1
83442@Chenyang MINGW64 /e/code (main)
$ git add code.txt
warning: LF will be replaced by CRLF in code.txt.
The file will have its original line endings in your working directory
83442@Chenyang MINGW64 /e/code (main)
$ git commit -m "version1.1"
[main 5090356] version1.1
1 file changed, 1 insertion(+)
83442@Chenyang MINGW64 /e/code (main)
$ git log
commit 50903560253d0f177d8433dcd4a766c1731e9ab1 (HEAD -> main)
Author: ** <**@**.com>
Date: Fri Jan 1 00:00:01 2021 +0800
version1.1
commit 7be1bd88fe8def114c34acc8f51617ce90044a34
Author: ** <**@**.com>
Date: Fri Jan 1 00:00:00 2021 +0800
version1.0
如果我们不小心 commit 错了代码,想回到以前的版本怎么办?
如果你观察仔细的话,会发现我们之前每次 commit 都会出现 (HEAD -> main)
。这个 main 是我们的默认分支,而HEAD
就指向我们的最新版本!因此,要想回退,只要改变HEAD的指向就行了。
83442@Chenyang MINGW64 /e/code (main)
$ git reset --hard HEAD^
HEAD is now at 7be1bd8 version1.0
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
可以看到,code.txt 回到了第一次 commit 时的样子。
上面的指令中,HEAD^
是什么意思呢?我们用HEAD^
表示当前版本的上个版本,用HEAD^^
表示当前版本的上上个版本,……以此类推。
当然我们也可以使用HEAD~1
表示当前版本的上个版本,用HEAD~2
表示当前版本的上个版本,……以此类推。
现在,产品经理打了个电话给我,又想要version1.1了怎么办?git log
看看:
83442@Chenyang MINGW64 /e/code (main)
$ git log
commit 7be1bd88fe8def114c34acc8f51617ce90044a34 (HEAD -> main)
Author: ** <**@**.com>
Date: Fri Jan 1 00:00:00 2021 +0800
version1.0
发现只剩下version1.0了!!!呜呜呜,回不去了~~~
真的吗?我不信。
——鲁豫
假的。
git 要是这都干不了,趁早卸载得了。
但是,HEAD
指针就跟我的成绩一样,只退不进。我们得想点别的法子。git reflog
查看操作记录:
83442@Chenyang MINGW64 /e/code (main)
$ git reflog
7be1bd8 (HEAD -> main) HEAD@{0}: reset: moving to HEAD^
5090356 HEAD@{1}: commit: version1.1
7be1bd8 (HEAD -> main) HEAD@{2}: commit (initial): version1.0
妙啊!我们看到了每次操作都有一串代号(也就是代码中的7be1bd8
,5090356
,7be1bd8
),我们把刚刚的操作撤回不就好了嘛!
83442@Chenyang MINGW64 /e/code (main)
$ git reset --hard 5090356
HEAD is now at 5090356 version1.1
可以看到,我们又回到了版本 version1.1 。
再看一遍我们创建版本 version1.1 时的代码:
$ git add code.txt
$ git commit -m "version1.1"
发现了吗,在 commit 之前,我们还有 add 操作。这是干什么的呢?请看下图
一图胜千言。
——不著名计算机科学家chenyang
这张图应当说是一目了然了。在 commit 之前,我们要把需要 commit 的文件塞到缓冲区,告诉 git:“你给我 commit 这些文件!”不然,要是我们不小心把学习资料放在文件夹里,git 岂不是也一并帮我们 commit 上去了?
我们用实例来验证一下这个机制。编辑code.txt
83442@Chenyang MINGW64 /e/code (main)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
不经过add,直接提交
83442@Chenyang MINGW64 /e/code (main)
$ git commit -m "version1.2"
On branch main
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: code.txt
Untracked files:
(use "git add ..." to include in what will be committed)
no changes added to commit (use "git add" and/or "git commit -a")
83442@Chenyang MINGW64 /e/code (main)
$ git log
commit 50903560253d0f177d8433dcd4a766c1731e9ab1 (HEAD -> main)
Author: ** <**@**.com>
Date: Fri Jan 1 00:00:01 2021 +0800
version1.1
commit 7be1bd88fe8def114c34acc8f51617ce90044a34
Author: ** <**@**.com>
Date: Fri Jan 1 00:00:00 2021 +0800
version1.0
果然,没有成功提交。
现在我们把 code.txt add 进去:
83442@Chenyang MINGW64 /e/code (main)
$ git add code.txt
这时候,你的女朋友说:“我今天才学会了vim(而你却不会),我来给你展示一下!”说罢,便修改了你的 code.txt:
83442@Chenyang MINGW64 /e/code (main)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
cai guai!
哎呀!谁动了我的代码!
幸好,原来的代码已经存在缓存区了,我们使用checkout
命令把缓存区的代码调进工作区:
83442@Chenyang MINGW64 /e/code (main)
$ git checkout -- code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
你长呼了一口气。这时候,产品经理突然来电话了:“不要 commit!不要 commit!把它从缓存区拿出去!”
???血压飙升!
都杀好了,让我不要做成菜,再把它还原成?
抱歉,git 还就真可以。
使用git status
查看缓存区:
83442@Chenyang MINGW64 /e/code (main)
$ git status
On branch main
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: code.txt
Untracked files:
(use "git add ..." to include in what will be committed)
看到 code.txt 已经在里面了。
使用git reset HEAD
撤掉缓存区里面的内容
83442@Chenyang MINGW64 /e/code (main)
$ git reset HEAD code.txt
Unstaged changes after reset:
M code.txt
83442@Chenyang MINGW64 /e/code (main)
$ git status
On branch main
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: code.txt
Untracked files:
(use "git add ..." to include in what will be committed)
no changes added to commit (use "git add" and/or "git commit -a")
受写作文本的编辑器所限,在文章中看不出来一个变化:modified: code.txt
从绿色变为了红色。我们成功撤掉了缓存区里面的内容。
如果我想知道这次提交和上次相比有哪些改动,怎么办?
使用diff
命令:
83442@Chenyang MINGW64 /e/code (main)
$ git diff HEAD -- code.txt
diff --git a/code.txt b/code.txt
index cb42fce..52c8da4 100644
--- a/code.txt
+++ b/code.txt
@@ -1,2 +1,3 @@
Hello, world!
AMD, YES!
+chenyang is so shuai!
我们解读一下结果:---
这里代指HEAD,+++
这里代指工作区。能够看到,工作区比HEAD多了一行。
我们还可以比较提交的两个版本:
83442@Chenyang MINGW64 /e/code (main)
$ git diff HEAD HEAD^ -- code.txt
diff --git a/code.txt b/code.txt
index cb42fce..af5626b 100644
--- a/code.txt
+++ b/code.txt
@@ -1,2 +1 @@
Hello, world!
-AMD, YES!
我们首先 commit 一个 code2.txt 上去:
83442@Chenyang MINGW64 /e/code (main)
$ touch code2.txt
83442@Chenyang MINGW64 /e/code (main)
$ vi code2.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code2.txt
F**k!
83442@Chenyang MINGW64 /e/code (main)
$ add code2.txt
bash: add: command not found
83442@Chenyang MINGW64 /e/code (main)
$ git add code2.txt
warning: LF will be replaced by CRLF in code2.txt.
The file will have its original line endings in your working directory
83442@Chenyang MINGW64 /e/code (main)
$ git commit -m "version1.2"
[main 2157ebb] version1.2
1 file changed, 1 insertion(+)
create mode 100644 code2.txt
然后删除工作区的 code2.txt(删库跑路ing)
83442@Chenyang MINGW64 /e/code (main)
$ rm code2.txt
再查看status
83442@Chenyang MINGW64 /e/code (main)
$ git status
On branch main
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
deleted: code2.txt
Untracked files:
(use "git add ..." to include in what will be committed)
no changes added to commit (use "git add" and/or "git commit -a")
我们智慧的 git 已经发现 code2.txt 被删除了!
如果你是公司老板,那必然会赶紧补救:
83442@Chenyang MINGW64 /e/code (main)
$ git checkout -- code2.txt
83442@Chenyang MINGW64 /e/code (main)
$ ls
code.txt code2.txt
而如果你想删库跑路,必然坏事做绝,把它彻底删除
83442@Chenyang MINGW64 /e/code (main)
$ git rm code2.txt
rm 'code2.txt'
83442@Chenyang MINGW64 /e/code (main)
$ git status
On branch main
Changes to be committed:
(use "git restore --staged ..." to unstage)
deleted: code2.txt
Untracked files:
(use "git add ..." to include in what will be committed)
83442@Chenyang MINGW64 /e/code (main)
$ git commit -m "version1.3"
[main bac3110] version1.3
1 file changed, 1 deletion(-)
delete mode 100644 code2.txt
83442@Chenyang MINGW64 /e/code (main)
$ git log --pretty=oneline
bac311061c0f58187c0eefddda3af1eb7dc6793b (HEAD -> main) version1.3
2157ebbc4d9b83edf128f0bf2cf7d7f79c5c7234 version1.2
50903560253d0f177d8433dcd4a766c1731e9ab1 version1.1
7be1bd88fe8def114c34acc8f51617ce90044a34 version1.0
药药切克闹,我开个玩笑。
删库跑不掉,必然要坐牢。
为什么要分支?比如你要开发一个同时兼容 Windows 和 Linux 的系统,我们一拨人写 Linux,另一拨人写 Windows,最后再合并:
这里面有个问题:如何让写 Linux 的和写 Windows 的互不干扰?最后又如何把两个工程合并起来?
这是我们在上一章节中提交的 commit
容易发现,所有的 commit 都在 main 分支上,连成了一条线。
我们可以通过git branch
查看目前的分支
83442@Chenyang MINGW64 /e/code (main)
$ git branch
* main
如果我们创建一个新分支dev
83442@Chenyang MINGW64 /e/code (main)
$ git checkout -b dev
Switched to a new branch 'dev'
83442@Chenyang MINGW64 /e/code (dev)
$ git branch
* dev
main
此时,分支变成了下图所示
可以看到,HEAD 指针移动到了 dev 上。
我们尝试着向 dev 上 commit
83442@Chenyang MINGW64 /e/code (dev)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (dev)
$ git add code.txt
83442@Chenyang MINGW64 /e/code (dev)
$ git commit -m "version2.0"
[dev 5529510] version2.0
1 file changed, 1 insertion(+)
83442@Chenyang MINGW64 /e/code (dev)
$ git log --pretty=oneline
55295104dbba9a21b8ed6f7a7f1fe5842798ccfd (HEAD -> dev) version2.0
bac311061c0f58187c0eefddda3af1eb7dc6793b (main) version1.3
2157ebbc4d9b83edf128f0bf2cf7d7f79c5c7234 version1.2
50903560253d0f177d8433dcd4a766c1731e9ab1 version1.1
7be1bd88fe8def114c34acc8f51617ce90044a34 version1.0
这时候分支变化了
差不多得了
——抗吧
差不多得了。
我们想要把 main 并到 dev 上。
首先切换回 main 分支
83442@Chenyang MINGW64 /e/code (dev)
$ git checkout main
Switched to branch 'main'
83442@Chenyang MINGW64 /e/code (main)
$ git branch
dev
* main
我们看看刚刚的 code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
哎呀!刚刚添加的一行没了!——这是因为,刚刚添加的内容在 dev 分支上,而我们现在在 main 分支。
现在我们将两者合并
83442@Chenyang MINGW64 /e/code (main)
$ git merge dev
Updating bac3110..5529510
Fast-forward
code.txt | 1 +
1 file changed, 1 insertion(+)
83442@Chenyang MINGW64 /e/code (main)
$ git log --pretty=oneline
55295104dbba9a21b8ed6f7a7f1fe5842798ccfd (HEAD -> main, dev) version2.0
bac311061c0f58187c0eefddda3af1eb7dc6793b version1.3
2157ebbc4d9b83edf128f0bf2cf7d7f79c5c7234 version1.2
50903560253d0f177d8433dcd4a766c1731e9ab1 version1.1
7be1bd88fe8def114c34acc8f51617ce90044a34 version1.0
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
可以看到,main 和 dev 在一起了
然后放心大胆地删除 dev(渣男行为:用完就扔)
83442@Chenyang MINGW64 /e/code (main)
$ git branch -d dev
Deleted branch dev (was 5529510).
83442@Chenyang MINGW64 /e/code (main)
$ git branch
* main
让我们构造一个分支冲突的情况。
创建 dev 分支,并 commit
83442@Chenyang MINGW64 /e/code (main)
$ git checkout -b dev
Switched to a new branch 'dev'
83442@Chenyang MINGW64 /e/code (dev)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (dev)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
lou shang shuo de dui!
83442@Chenyang MINGW64 /e/code (dev)
$ git add code.txt
83442@Chenyang MINGW64 /e/code (dev)
$ git commit -m "version2.1.0"
[dev 9d381a1] version2.1.0
1 file changed, 1 insertion(+)
切换回 main 分支,commit 一个不一样的内容
83442@Chenyang MINGW64 /e/code (dev)
$ git checkout main
Switched to branch 'main'
83442@Chenyang MINGW64 /e/code (main)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
great!
83442@Chenyang MINGW64 /e/code (main)
$ git add code.txt
83442@Chenyang MINGW64 /e/code (main)
$ git commit -m "version2.1.1"
[main 51ff862] version2.1.1
1 file changed, 1 insertion(+)
这时,我们的分支状况变成了
这时候来问题了,怎么合并?
本着瞎折腾的宗旨,我们试着合并一下
83442@Chenyang MINGW64 /e/code (main)
$ git merge dev
Auto-merging code.txt
CONFLICT (content): Merge conflict in code.txt
Automatic merge failed; fix conflicts and then commit the result.
哎呀,合并失败了!
此时我们有两种选择:
我们先看合并。查看两个分支上文件的不同
83442@Chenyang MINGW64 /e/code (main|MERGING)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
<<<<<<< HEAD
great!
=======
lou shang shuo de dui!
>>>>>>> dev
根据需要修改文件并 commit
83442@Chenyang MINGW64 /e/code (main|MERGING)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main|MERGING)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
great!
lou shang shuo de dui!
83442@Chenyang MINGW64 /e/code (main|MERGING)
$ git add code.txt
83442@Chenyang MINGW64 /e/code (main|MERGING)
$ git commit -m "version2.2"
[main 6b8b715] version2.2
83442@Chenyang MINGW64 /e/code (main)
$ git log --graph --pretty=oneline
* 6b8b71527dc70717a7eccd12161199a2dff3b332 (HEAD -> main) version2.2
|\
| * 9d381a1a6e6911080dab656e788ec8e1236d7cb2 (dev) version2.1.0
* | 51ff86201bf8843109a9598ede17d1eaca770291 version2.1.1
|/
* 55295104dbba9a21b8ed6f7a7f1fe5842798ccfd version2.0
* bac311061c0f58187c0eefddda3af1eb7dc6793b version1.3
* 2157ebbc4d9b83edf128f0bf2cf7d7f79c5c7234 version1.2
* 50903560253d0f177d8433dcd4a766c1731e9ab1 version1.1
* 7be1bd88fe8def114c34acc8f51617ce90044a34 version1.0
可以看到,分支变成了
修改完成后,我们不再需要 dev,把它删除
83442@Chenyang MINGW64 /e/code (main)
$ git branch -d dev
Deleted branch dev (was 9d381a1).
83442@Chenyang MINGW64 /e/code (main)
$ git branch
* main
分支变为
下面再说变基。回到我们先前构造的分支冲突,然后变基。这里,我们是将 mian 变基到 dev 上
83442@Chenyang MINGW64 /e/code (main)
$ git rebase dev
error: could not apply 81df12a... version2.1.1
Resolve all conflicts manually, mark them as resolved with
"git add/rm " , then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort"
.
Could not apply 81df12a... version2.1.1
Auto-merging code.txt
CONFLICT (content): Merge conflict in code.txt
83442@Chenyang MINGW64 /e/code (main|REBASE 1/1)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
<<<<<<< HEAD
great!
=======
lou shang shuo de dui!
>>>>>>> dev
83442@Chenyang MINGW64 /e/code (main|REBASE 1/1)
$ vi code.txt
83442@Chenyang MINGW64 /e/code (main|REBASE 1/1)
$ cat code.txt
Hello, world!
AMD, YES!
chenyang is so shuai!
great!
lou shang shuo de dui!
83442@Chenyang MINGW64 /e/code (main|REBASE 1/1)
$ git add code.txt
83442@Chenyang MINGW64 /e/code (main|REBASE 1/1)
$ git commit -m "version2.2"
[detached HEAD 0fd3a40] version2.2
1 file changed, 1 insertion(+)
变为如下分支
再回头看一看我们分支合并时的情景
$ git merge dev
Updating bac3110..5529510
Fast-forward
code.txt | 1 +
1 file changed, 1 insertion(+)
也许你想问,这个 Fast-forward
是什么意思?
上面我们合并两个有冲突的分支,必然要解决这个冲突。fast-forward 便提供了一个能拿诺贝尔和平奖的和平解决方法:两个分支都给你,你选择要哪一个。
如果和同事闹矛盾了,合并时看都不看,他的修改我一个也不采纳!那我们也可以强制禁用 fast-forward 模式,禁用的参数是 --no-ff
。下面演示一下:假设当前 main 和 dev 不相同
$ git merge --no-ff -m "" dev
上面的 -m
参数表示新建一个 commit。
不过,在操作完成后,你同事的提交依然还在,小心他直接回退,把你的提交给干掉!
注册 GitHub 账号,并新建 repository,创建.gitignore
文件
如果你这都不会,建议重开
回到我们刚刚编辑代码的目录下,新建/修改.gitignore
文件为
[filter "lfs"]
process = git-lfs filter-process
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
[user]
name = [Github用户名]
email = [Github邮箱]
请将上面的[Github用户名]
和[Github邮箱]
替换为你自己的用户名和邮箱。
右键 Git Bash Here,我们需要获取 SSH Key
83442@Chenyang MINGW64 /e/code (main)
$ ssh-keygen -t rsa -C "**@**.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/83442/.ssh/id_rsa):
/c/Users/83442/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/83442/.ssh/id_rsa
Your public key has been saved in /c/Users/83442/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:i8DZS7z8urty9bJ/tQH5OqXGduDFny36OiwPwn***** **@**.com
The key's randomart image is:
+---[RSA 3072]----+
| .. |
| . E|
| .. |
| . + o .o |
| + + S o + |
| ******** B |
| ****** B +o|
| . ....o.% +.o|
| o==o+.*+B.. |
+----[SHA256]-----+
83442@Chenyang MINGW64 /e/code (main)
$ cd ~/.ssh
83442@Chenyang MINGW64 ~/.ssh
$ ls
id_rsa id_rsa.pub known_hosts
83442@Chenyang MINGW64 ~/.ssh
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCsT/hRIihxZDbNbsAO5HXDXft4NFfthD01WrE6rsha+xb1wvBzdYZIxytwQ6kOZfeoXG5JTq9d9iWIBpIf4Dts8qeGJt12DNU+Oz20TJ1khlh093srDTUKExr/hQi7mAU5ENA6TsA9nDe5dJBs25ScBSnYMWCxR9C3ZLTG5id0nok+YF4RkOHChcbbzYv2KOomuLztGR44RBgmZLzdULLzzFVJ2UqHpyZ46XEZRgj5N*****/a7+*****/qYkrdQbmWxC01NJGoreY2XECbp1ckpSN6Q02ZRIh0Z9osEpe4KsL5hMSG2NDi0mNCAFUh1GbEEjWvrmt9gNePkfV83+OBch4LNtF3KQPRBldptyu1prSehJ3j/*****pwMVJTSi9Lv4bf614wpmNCPS2lq9PGnBTTY1D2n4iheEekpfsmVPy/qEi262xRc7qmvd6lDqqfg6IHN5Ae*****/Y/C3cdoFEflfuJZ/QhcUrzecAkpD8nIwQ6zEwJ57OJCou6LM= **@**.com
以上内容的隐私部分已经过处理。
文件夹~/.ssh
中有两个文件,其中id_rsa
为私钥,id_rsa.pub
为公钥。我们需要复制公钥。
现在回到 GitHub,点击头像,选择settings
然后创建一个 SSH Key
这里的 Title 可以选取你自己想要的名字。然后点击 Add SSH Key 即可完成创建。
天下代码一大抄。
——不知道谁说的,有可能我自己说的
以往我们下载代码会使用 Download ZIP,但现在我们有了 git,就应当用一些逼格更高的方法。点击 clone,选择 SSH,复制链接
然后在本地git clone
83442@Chenyang MINGW64 /e/code (main)
$ git clone [email protected]:**/**.github.io.git
Cloning into '**'...
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
哎呀,克隆失败!
因此我们需要配置一下 git。查看你的端口,比如我的是7890。然后输入命令
83442@Chenyang MINGW64 /e/code (main)
$ git config --global http.proxy 'http://127.0.0.1:7890'
83442@Chenyang MINGW64 /e/code (main)
$ git config --global https.proxy 'https://127.0.0.1:7890'
这里还需要注意一下,由于我们使用了代理,所以只能从 http/https 上 clone 项目(无奈.jpg)
所以我们还是得 clone https 地址:
83442@Chenyang MINGW64 /e/code (main)
$ git clone https://github.com/**/**.github.io.git
Cloning into '**.github.io'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
成功了!
维基百科https://zh.wikipedia.org/wiki/Git ↩︎
参考自 https://www.cnblogs.com/charlesblc/p/6132384.html ↩︎