操作系统:windows 64
主要参考:https://docs.github.com/cn/github
http://book.git-scm.com/book/zh/v2
https://www.runoob.com/git/git-tutorial.html
目录
7.配置本地 git 仓库和 github 仓库之间的验证信息
一、Git Bash
Git 有多种使用方式。 你可以使用原生的命令行模式,也可以使用 GUI 模式,这些 GUI 软件也能提供多种功能。
推荐使用命令行模式。 这是因为首先,只有在命令行模式下你才能执行 Git 的 所有 命令,而大多数的 GUI 软件只实现了 Git 所有功能的一个子集以降低操作难度。 如果你学会了在命令行下如何操作,那么你在操作 GUI 软件时应该也不会遇到什么困难,但是,反之则不成立。 此外,由于每个人的想法与侧重点不同,不同的人常常会安装不同的 GUI 软件,但 所有人一定会有命令行工具。
假如是 macOS 用户,需要懂得如何使用终端(Terminal);假如是 Windows 用户,需要懂得如何使用命令窗口(Command Prompt)或 PowerShell。
1.注册 github 账号
如果已有账号,在此登录(Sign in);如果没有,需要准备一个邮箱,然后进行注册(Create an account);
2. git 安装
Git 各平台安装包下载地址为:http://git-scm.com/downloads
本文直接下载windows版本;
点击下载的文件Git-2.30.1-64-bit.exe,一路next,就可以安装完成;
默认会将“C:\Program Files\Git\cmd”添加到环境变量的path,如果没有,则需要手动添加;
安装完成后,启动 Git Bash;查看当前Git版本:
若你使用 Git 时需要获取帮助,有三种等价的方法可以找到 Git 命令的综合手册(manpage):
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
$ git help config //例如,要想获得 git config 命令的手册
3. git 配置
安装了 Git,需要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。
Git 自带一个 git config
的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
-
/etc/gitconfig
文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行git config
时带上--system
选项,那么它就会读写该文件中的配置变量。 -
~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。 你可以传递--global
选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。 -
当前使用仓库的 Git 目录中的
config
文件(即.git/config
):针对该仓库。你可以传递--local
选项让 Git 强制读写此文件,虽然默认情况下用的就是它。
每一个级别会覆盖上一级别的配置,所以 .git/config
的配置变量会覆盖 /etc/gitconfig
中的配置变量。
配置个人的用户名称和电子邮件地址:
$ git config --global user.name "runoob" //配置用户名称
$ git config --global user.name //查看用户名称
//runoob
$ git config --global user.email test@runoob.com //配置用户邮箱
$ git config --global user.email //查看用户邮箱
//test@runoob.com
$ git config --global --list //查看全局配置
如果用了 --global 选项,那么更改的配置文件就是位于用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
4. git 三种状态
Git 有三种状态,你的文件可能处于其中之一:
-
已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
-
已暂存(staged):已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
-
已提交(committed):已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:
-
工作区:是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
-
暂存区:是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中, 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
-
Git 仓库目录:是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
基本的 Git 工作流程如下:
-
在工作区中修改文件。
-
将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
-
提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
如果 Git 目录中保存着特定版本的文件,就属于 已提交 状态。 如果文件已修改并放入暂存区,就属于 已暂存 状态。 如果自上次检出后,作了修改但还没有放到暂存区域,就是 已修改 状态。
5. git init 本地仓库初始化
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
本文创建一个新的目录“D:\github\repository_01”,在该目录下右键,选择“Git Bash Here”;
初始化仓库:
在执行完成 git init 命令后,将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
6. git clone 克隆远程仓库
从远程仓库中获得数据,可以执行:
$ git fetch <remote>
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone
命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin
会抓取克隆(或上一次抓取)后新推送的所有工作。
必须注意 git fetch
命令只会将数据下载到你的本地仓库,它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
如果你的当前分支设置了跟踪远程分支, 那么可以用 git pull
命令来自动抓取后合并该远程分支到当前分支。
默认情况下,git clone
命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master
分支(或其它名字的默认分支)。运行 git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
我们使用 git clone 从现有 Git 仓库中拷贝项目。拷贝一份远程仓库,也就是下载一个项目。
git clone <repo> <directory>
//repo:Git 仓库。
//directory:本地目录。
比如将 geth 源码拷贝到新建的本地仓库:https://github.com/ethereum/go-ethereum
Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。
git clone 时,可以用不同的协议,包括 ssh, git, https 等:
git clone git@github.com:ethereum/go-ethereum.git --SSH协议
git clone git://github.com/ethereum/go-ethereum.git --GIT协议
git clone https://github.com/ethereum/go-ethereum.git --HTTPS协议
7.配置本地 git 仓库和 github 仓库之间的验证信息
由于本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:数据保存在远端服务器一份,服务器需要对您的身份识别。
使用以下命令生成 SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
后面的 your_email@youremail.com 改为在 Github 上注册的邮箱,之后会要求确认路径和输入密码,使用默认的一路回车就行。
$ ssh-keygen -t rsa -C "yourEmail@sina.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/[user]/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): # 直接回车
Enter same passphrase again: # 直接回车
Your identification has been saved in /Users/[user]/.ssh/id_rsa.
Your public key has been saved in /Users/[user]/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI yourEmail@sina.com
The key's randomart image is:
+---[RSA 3072]----+
|E*+.+=**oo |
|%Oo+oo=o. . |
|%**.o.o. |
|OO. o o |
|+o+ S |
|. |
| |
| |
| |
+----[SHA256]-----+
成功的话会在 ~/ 下生成 .ssh 文件夹(本文操作后,目录在C:\Users\[user]\.ssh),进去,打开 id_rsa.pub,复制里面的 key(注意:需要copy文件里的全部内容,包括最开头的“ssh-rsa ”,这实际是一段RSA加密字符串)。
(1)把其中的私钥告诉本地 git 系统:
$ ssh-agent bash #第一步,本文操作中,为必须步骤
$ ssh-add ~/.ssh/id_rsa #第二步,仅有此步骤,本文操作中没有成功,两步后成功
(2)回到 github 上,配置SSH:
进入 Account => Settings(账户配置)。
左边选择 SSH and GPG keys,然后点击 New SSH key 按钮
title 设置标题,可以不填,粘贴刚刚在你电脑上生成的 key。点击按钮“Add SSH key”;每次增加新的 key,都要求输入密码,该密码为 github 账户登录密码:
密码正确,返回,显示添加成功:
测试是否成功,在本地 git bash:
$ ssh -T git@github.com
The authenticity of host 'github.com (52.0.0.1)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes #输入yes
Warning: Permanently added 'github.com,52.0.0.1' (RSA) to the list of known hosts.
Hi wonderBlock2020! You've successfully authenticated, but GitHub does not provide shell access. #成功信息,wonderBlock2020
8.在 github 创建仓库
正常登录github;在主菜单栏选择"New repository":
在界面填入相应的内容:
Repository name:仓库名称;
Description (optional):仓库描述;
Public:公共仓库,所有人都可以看到,但你许可的人才能 commit ;
Private:私有仓库,你许可的人才能看到或 commit ;
点击“Create repository”按钮,github 仓库创建成功,显示如下:
该页面的辅助信息告诉我们可以从这个仓库克隆出新的仓库,也可以把本地仓库的内容推送到GitHub仓库。
9. git add 添加文件
工作目录下的每一个文件都不外乎这两种状态:
- 已跟踪 :已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是 Git 已经知道的文件。
- 未跟踪:工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态,因为 Git 刚刚检出了它们, 而你尚未编辑过它们。
编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,如此反复。
如果在一个已存在文件的文件夹(而非空文件夹)中进行版本控制,你应该开始追踪这些文件并进行初始提交。 可以通过 git add
命令来指定所需的文件进行追踪。
git add 命令可将该文件添加到暂存区。
git add [file1] [file2] ... //添加一个或多个文件到暂存区
git add [dir] //添加指定目录到暂存区,包括子目录
git add . //添加当前目录下的所有文件到暂存区
本文创建一个新的目录“D:\github\repository_02”(与github新创建的仓库“repository_02”同名),拷贝刚刚下载的“D:\github\repository_01\go-ethereum”目录到新目录下:
可以用 git status
命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。 最后,该命令还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在,分支名是“master”,这是默认的分支名。
10. git commit 提交版本
git commit 命令将暂存区内容添加到本地仓库中:
$ git commit -m [message] #[message] 可以是一些备注信息
$ git commit [file1] [file2] ... -m [message] #提交暂存区的指定文件到仓库区
$ git commit -a #修改文件后不需要执行 git add 命令,直接来提交
本文实际操作:
$ git commit -m "go-ethereum"
[master (root-commit) cef0096] go-ethereum
1590 files changed, 642667 insertions(+)
create mode 100644 go-ethereum/.dockerignore
create mode 100644 go-ethereum/.gitattributes
...............................................................// 1590个文件
create mode 100644 go-ethereum/trie/trie.go
create mode 100644 go-ethereum/trie/trie_test.go
11. git push 发布版本
运行 git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个方便使用的简写。
$ git remote add origin https://github.com/wonderBlock2020/repository_02.git #先载入远程仓库,origin为远程仓库地址的别名
$ git push -u origin master #首次提交
$ git push origin master #之后再次提交,就不需要 -u
首次操作 git push ,需要登录密码或个人访问令牌 (PAT):https://docs.github.com/cn/github/authenticating-to-github/creating-a-personal-access-token
本文用的PAT,输入正确的PAT token后:
传输完成,在github就可以看到相应内容了:
12. git log 查看提交历史
可以用以下命令查看历史提交记录:
$ git log
$ git log --oneline #查看历史记录的简洁版本
本文通过以上操作:
不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
git log
有许多选项可以帮助你搜寻你所要找的提交, 其中一个比较有用的选项是 -p
或 --patch
,它会显示每次提交所引入的差异(按 补丁 的格式输出)。
此处解释一下 作者 和 提交者 之间究竟有何差别, 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。
所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。
至此,git bash 主要操作完成!
二、Git GUI
1.创建新仓库
启动Git GUI,在界面选择“Create New Repository”,写入目录,文本为“D:\github\repository_03”:
点击“Create”即创建了本地新仓库,并建立了相应目录;下次启动Git GUI,可以快捷直接点击进入该仓库;
本文将geth源码文件夹“D:\github\repository_02\go-ethereum”拷贝到该目录下:
主界面“Current Branch:master”是刚刚拷贝进来的文件夹内容。
2.权限验证
该步骤,与上面的“7.配置本地 git 仓库和 github 仓库之间的验证信息”类似:
选择菜单目录“ Help / Show SSH Key”,
拷贝期中的内容,回到 github 上,配置SSH:进入 Account => Settings(账户配置)。
之后的配置方法跟前面的“7.配置本地 git 仓库和 github 仓库之间的验证信息”一样。
本文实际添加后,并没有增加,还是只有之前git bash时增加的那一个,因此,本机git bash 和git GUI是使用同一个密钥;
3. Stage Changed 添加文件
在Git Gui中,如果Unstaged Changes(未缓存的改动)中包含文件,则先点击 Stage Changed,将未缓存的改动加入缓存,再进行 Commit ;否则需要先点击 Rescan 扫描项目中进行过改动的文件。
确定后,Unstaged Changes(未缓存的改动)中包含的文件,在Git GUI界面会转移到 Staged Changes(Will Commit),并在左下角显示“Ready to commit”:
4. Commit 提交版本
注意:提交描述(Initial Commit Message)信息必须要填写,否则无法提交。
提交完毕,如果无误,Staged Changes(Will Commit)的内容消失,左下角显示相应信息:
我们可以在菜单 Repository / Visualize All Branches History 中看到我们提交的历史记录(这是提交到本地而不是提交到远程服务器)。这样,本地版本库就提交成功了。
5. Add 添加远程仓库
选择 Remote / add 添加远程服务器仓库:
成功,显示如下界面:
6. Push 发布版本
接下来,我们便可以直接在Git Gui点击push提交至远程服务器;
成功,显示如下界面:
刷新一下github,便可以看到项目已经在repository中了。
至此,git GUI 主要操作完成!