一 .Git和GitHub的关系
1.什么是Git?
2.什么是GitHub以及和git的关系?
二.Git和Github的使用
1.Git初始设置
2.GitHub使用前准备
设置SSH Key
添加公开密钥
三.GitHub使用
四.Git的基本操作
1.git init——初始化仓库
2.git status——查看仓库的状态
3.git commit——保存仓库的历史记录
一 .Git和GitHub的关系
1.什么是Git?
Git是目前世界上最先进的分布式版本控制系统,可能这样说很多人懵逼,版本控制?就好比做一个软件1.0、2.0····(这个就是版本),但是每个版本你又想保存着,或者是删除,修改等等(版本控制)。
版本管理系统分为 Subversion 这类集中型的与 Git 这 类分散型的。
以 Subversion 为代表的集中型,会如图 2.1 所示将仓库集中存放在
服务器之中,所以只存在一个仓库。这就是为什么这种版本管理系统会 被称作集中型。
集中型将所有数据集中存放在服务器当中,有便于管理的优点。但 是一旦开发者所处的环境不能连接服务器,就无法获取最新的源代码, 开发也就几乎无法进行。服务器宕机时也是同样的道理,而且万一服务 器故障导致数据消失,恐怕开发者就再也见不到最新的源代码了。
图 2.2 是以 Git 为代表的分散型的示意图。如图中所示,GitHub 将
仓库 Fork 给了每一个用户。Fork 就是将 GitHub 的某个特定仓库复制到 自己的账户下。Fork 出的仓库与原仓库是两个不同的仓库,开发者可以随意编辑。如图所示,分散型拥有多个仓库,相对而言稍显复杂。不过,由于 本地的开发环境中就有仓库,所以开发者不必连接远程仓库就可以进行 开发。
图中只显示了一般的使用流程。实际上,所有仓库之间都可以进行
push 和 pull。即便不通过 GitHub,开发者A也可以直接向开发者 B 的 仓库进行 push 或 pull。因此在使用前如果不事先制定规范,初学者往 往会搞不清最新的源代码保存在哪里,导致开发失去控制。不过不用 担心,只要各位随着本书的讲解亲自动手尝试,想掌握要领并不是一 件难事。
2.什么是GitHub以及和git的关系?
GitHub 是为开发者提供 Git 仓库的托管服务。这是一个让开发者与 朋友、同事、同学及陌生人共享代码的完美场所。可能这样说有人会懵逼,存放版本的地方就是 Git (版本)仓库,而GitHub是一个可以让你存放这些仓库,与 朋友、同事、同学及陌生人共享代码的完美场所。
GitHub 除提供 Git 仓库的托管服务外,还为开发者或团队提供了一
系列功能,帮助其高效率、高品质地进行代码编写。(BUG跟踪系统、代码审查工具、邮件列表、IRC 等众多工具组合)
二.Git和Github的使用
1.Git初始设置
首先来设置使用 Git 时的姓名和邮箱地址。名字请用英文输入。
$ git config --global user.name "Firstname Lastname"
$ git config --global user.email "your_email@example.com"
这个命令,会在“~/.gitconfig”中以如下形式输出设置文件。
[user]
name = Firstname Lastname
email = your_email@example.com
windows下全局配置文件通常在【C:\Users\Administrator.gitconfig】
想更改这些信息时,可以直接编辑这个设置文件。这里设置的姓名 和邮箱地址会用在 Git 的提交日志中。由于在 GitHub 上公开仓库时,这 里的姓名和邮箱地址也会随着提交日志一同被公开,所以请不要使用不 便公开的隐私信息。 在 GitHub 上公开代码后,前来参考的程序员可能来自世界任何地
方,所以请不要使用汉字,尽量用英文进行描述。当然,如果您不想使 用真名,完全可以使用网络上的昵称。
●●提高命令输出的可读性
顺便一提,将 color.ui 设置为 auto 可以让命令的输出拥有更高的可
读性。
$ git config --global color.ui auto
~/.gitconfig”中会增加下面一行
[color]
ui = auto
这样一来,各种命令的输出就会变得更容易分辨。
2.GitHub使用前准备
●●创建账户
●●设置头像:头像并不是使用 GitHub 时的硬性要求,但如果为代码配上编码者
的相貌或标识,会让人觉得安心,同时还可能让对方对您产生兴趣。毕 竟我们要使用的是能将关注点聚集在人身上的 GitHub,所以建议各位积 极地设置头像。
●●设置SSH Key(当然也可以不设置,不过这样的话每次push,pull都要输密码,比较麻烦)
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:添加公开密钥
登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key。
添加成功之后,创建账户时所用的邮箱会接到一封提示“公共密钥 添加完成”的邮件。 完成以上设置后,就可以用手中的私人密钥与 GitHub 进行认证和 通信了。让我们来实际试一试。
$ ssh -T git@github.com
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is fingerprint值 .
Are you sure you want to continue connecting (yes/no)? 输入yes
出现如下结果即为成功。
Hi hirocastest!
You've successfully authenticated, but GitHub does not provide shell access.
●●使用社区功能:既然说 GitHub 能够以人为焦点,那么在创建账户后不妨试试
Follow(关注)别人。
这样一来,您所 Follow 的用户的活动就会显示在您的控制面板页面 中。您可以通过这种方法知道那个人在 GitHub 上都做了些什么。 对于仓库,也可以使用Watch 功能获取最新的开发信息。如果您经 常使用的某个软件正在 GitHub 上进行开发,不妨去Watch 一下。
三.GitHub使用
1.创建仓库
~~Public、Private:在这一栏可以选择 Public 还是 Private。这里我们选择 Public,创建 公开仓库,仓库内的所有内容都会被公开。 选择 Private 可以创建非公开仓库,用户可以设置访问权限,但这项 服务是收费的。
~~nitialize this repository with a README:在 Initialize this repository with a README 选项上打钩,随后GitHub 会自动初始化仓库并设置 README 文件,让用户可以立刻clone 这个仓库。如果想向 GitHub 添加手中已有的 Git 仓库,建议不要 勾选,直接手动 push。
Add .gitignore:
下方左侧的下拉菜单非常方便,通过它可以在初始化时自动生 。这个设定会帮我们把不需要在Git仓库中进行版本管理的文件记录在 .gitignore 文件中,省去了每次根据框架进行设置的麻 烦。下拉菜单中包含了主要的语言及框架,选择今后将要使用的即可。 由于本书中我们并不使用任何框架,所以不做选择。
Add a license
右侧的下拉菜单可以选择要添加的许可协议文件。如果这个仓库中 包含的代码已经确定了许可协议(表明著作者相应的著作权),那么请在这里进行选择。随后将自动 生成包含许可协议内容的 LICENSE 文件,用来表明该仓库内容的许可 协议。输入选择都完成后,点击 Create repository 按钮,完成仓库的创建。
README.md
README.md 在初始化时已经生成好了。README.md 文件的内容 会自动显示在仓库的首页当中。因此,人们一般会在这个文件中标明本 仓库所包含的软件的概要、使用流程、许可协议等信息。如果使用 Markdown 语法进行描述,还可以添加标记,提高可读性。
2.clone 已有仓库(ssh)
打开仓库的code,点击 use ssh
这里会要求输入 GitHub 上设置的公开密钥的密码。认证成功后,
仓库便会被 clone 至仓库名后的目录中。将想要公开的代码提交至这个 仓库再 push 到 GitHub 的仓库中,代码便会被公开。
$ git clone git@github.com:hirocastest/Hello-World.git
Cloning into 'Hello-World'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done.
$ cd Hello-World
1.编写代码文件hello.c
2.由于 hello_word.php 还没有添加至 Git 仓库,所以显示为 Untracked files。
$ git status
# On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # #
hello_world.php nothing added to commit but untracked files present (use "git add" to track
3.提交:将 hello_word.c 提交至仓库。这样一来,这个文件就进入了版本 管理系统的管理之下。今后的更改管理都交由 Git 进行
$ git add hello_world.c
$ git commit -m "Add hello world script by php" [master d23b909] Add hello world script by php 1 file changed, 3 insertions(+) create mode 100644 hello_world.c
通过git add命令将文件加入暂存区 提交。再通过git commit命令, 添加成功后,可以通过git log命令查看提交日志。如果想同步到仓库可以用git push命令
四.Git的基本操作
1.git init——初始化仓库:
要使用 Git 进行版本管理,必须先初始化仓库。Git 是使用 git
init命令进行初始化的。请实际建立一个目录并初始化仓库。
$ mkdir git-tutorial
$ cd git-tutorial
$ git init Initialized empty Git repository in /Users/hirocaster/github/github-book /git-tutorial/.git/
如果初始化成功,执行了git init命令的目录下就会生成 .git 目
录。这个 .git 目录里存储着管理当前目录内容所需的仓库数据。 在 Git 中,我们将这个目录的内容称为“附属于该仓库的工作树”。 文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件 的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前 的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。 具体操作指令我们将在后面详细解说。
2.git status——查看仓库的状态
git status命令用于显示 Git 仓库的状态。这是一个十分常用的 命令,请务必牢记。
工作树和仓库在被操作的过程中,状态会不断发生变化。在 Git 操 作过程中时常用 git status命令查看当前状态,可谓基本中的基本。 下面,就让我们来实际查看一下当前状态。
$ git status
# On branch master #
# Initial commit #
nothing to commit (create/copy files and use "git add" to track)
结果显示了我们当前正处于 master 分支下。接着还显示了没有可提交的内容。所谓提交(Commit),是指“记录工作树中所有文件的当前状态”。这里,我们建立 README.md 文件作为管理对 象,为第一次提交做前期准备。
$ touch README.md $ git status
# On branch master #
# Initial commit ## Untracked files:# (use "git add <file>..." to include in what will be committed)# #
README.md
nothing added to commit but untracked files present (use "git add" to track)
可以看到在 Untracked files 中显示了README.md文件。类似地,只要对 Git 的工作树或仓库进行操作,git status命令的显示结果就 会发生变化。
3.git add——向暂存区中添加文件
如果只是用 Git 仓库的工作树创建了文件,那么该文件并不会被记
入 Git 仓库的版本管理对象当中。因此我们用 git status命令查看 README.md 文件时,它会显示在 Untracked files 里。要想让文件成为 Git 仓库的管理对象,就需要用git add命令将其 加入暂存区(Stage 或者 Index)中。暂存区是提交之前的一个临时区域。
$ git add README.md $ git status
# On branch master
#
# Initial commit #
# Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # #
new file: README.md
4.git commit——保存仓库的历史记录
git commit命令可以将当前暂存区中的文件实际保存到仓库的历 史记录中。通过这些记录,我们就可以在工作树中复原文件。
$ git commit -m "First commit"
[master (root-commit) 9f129ba] First commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md
-m 参数后的 "Firstcommit"称作提交信息,是对这个提交的概述。
当然不加也行,执行后编辑器就会启 动,并显示如下结果。
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master #
# Initial commit
#
# Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # #
new file: README.md
在编辑器中记述提交信息的格式如下。
●第一行:用一行文字简述提交的更改内容
● 第二行:空行
● 第三行以后:记述更改的原因和详细内容
只要按照上面的格式输入,今后便可以通过确认日志的命令或工具 看到这些记录。 在以 #(井号)标为注释的Changes to be committed(要提 交的更改)栏中,可以查看本次提交中包含的文件。将提交信息按格式 记述完毕后,请保存并关闭编辑器,以 #(井号)标为注释的行不必删 除。随后,刚才记述的提交信息就会被提交。
执行完 git commit命令后再来查看当前状态。
4.git log——查看提交日志
git log命令可以查看以往仓库中提交的日志。包括可以查看什么人在什么时候进行了提交或合并,以及操作前后有怎样的差别。关于 合并我们会在后面解说。
我们先来看看刚才的 git commit命令是否被记录了
$ git log
commit 9f129bae19b2c82fb4e98cde5890e52a6c546922
Author: hirocaster <hohtsuka@gmail.com> Date: Sun May 5 16:06:49 2013 +0900
First commit
如上图所示,屏幕显示了刚刚的提交操作。commit 栏旁边显示的
“9f129b……”是指向这个提交的哈希值。Git 的其他命令中,在指向提 交时会用到这个哈希值。 Author 栏中显示我们给 Git 设置的用户名和邮箱地址。Date 栏中显 示提交执行的日期和时间。再往下就是该提交的提交信息。
只显示提交信息的第一行
$ git log --pretty=short
只显示指定目录、文件的日志
只要在git log命令后加上目录名,便会只显示该目录下的日志。 如果加的是文件名,就会只显示与该文件相关的日志。
$ git log README.md
显示文件的改动
如果想查看提交所带来的改动,可以加上-p参数,文件的前后差 别就会显示在提交信息之后。
$ git log -p
比如,执行下面的命令,就可以只查看 README.md 文件的提交日 志以及提交前后的差别。
$ git log -p README.md
如上所述,git log命令可以利用多种参数帮助开发者把握以往
提交的内容。不必勉强自己一次记下全部参数,每当有想查看的日志就 积极去查,慢慢就能得心应手了。
查看工作树和暂存区的差别
参考廖雪峰的git教程:
https://www.liaoxuefeng.com/wiki/896043488029600
参考 《Github入门与实践》