第一章 由来
GitHub是为开发者提供Git仓库的托管服务。
Git与GitHub的区别:在Git中,开发者将源代码存入名叫“Git仓库”的资料库中并使用;而GitHub则是在网络上提供Git仓库的一项服务。
Pull Request使得地球上不同位置不同时间的开发者共同开发软件。
GitHub Flavored Markdown语法被用于GitHub作文字标记使用。
GitHub以人为中心,我们可以看到一个人公开的所有源代码,还能看出其他的信息,包括提交信息等。
Issue功能是将一个任务或问题分配给一个Issue进行追求和管理的功能。
第二章 基本知识简介
版本管理就是管理更新的历史记录。
集中型,将所有数据集中存放在服务器中,便于管理,但一旦开发者所处环境无法连接服务器时,就无法获取最新的源代码,使得开发停滞下来。万一翻身服务故障导致数据消失,那就一切前功尽弃了。
分散性,GitHub将仓库Fork给了每一个用户,分散性拥有多个仓库,开发者本地就有仓库,无需连接远程服务器就可以进行开发。
Fork就是将GitHub的某个特定仓库复制到自己的账户下,Fork的仓库与原仓库是两个不同的仓库,开发者可以随便编辑。
所有仓库之间可以push和pull,即使不通过GitHub,开发者A也可以直接向开发者B的仓库进行push和pull。
linux和mac系统自带Git,windows安装git应用程序git bash。
设置姓名和邮箱地址,输入内容会在
~/.gitconfig
中显示
git config --global user.name "Firstname Lastname"
git config --global user.email "email@example.com"
- 另外,为了提高可读性,可以设置
git config --global corlor.ui auto
第三章 初始操作
3.1 注册账号
注册账号https://github.com/
设置SSH Key,GitHub上连接已有仓库时的认证,是通过使用了SSH的公开密钥认证方式进行的。
$ ssh-keygen -t rsa -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key
(/Users/your_user_directory/.ssh/id_rsa): 按回车键
Enter passphrase (empty for no passphrase): 输入密码
Enter same passphrase again: 再次输入密码
需求:注册有限,密码,生成的ssh密钥会放置在/Users/your_user_directory/.ssh/
,包括id_rsa
和id_rsa.pub
。
然后将id_rsa.pub
其添加至注册GitHub账号的SSH keys中,id_rsa
是私钥,需要自己慎重保存,切勿公开。添加位置
之后就可以使用手中的私人密钥与GitHub进行认证和通信了。测试:
ssh -T git@github.com
Hi hugechuanqi! You've successfully authenticated, but GitHub does not provide shell access.
表示成功。
3.2 创建仓库
创建仓库repository,参考笔记
.gitgnore
文件记录不需要在Git仓库中进行版本管理的文件。README.md文件标明本仓库所包含的软件的概要、使用流程、许可协议等信息。
clone仓库,将已有仓库clone到本地电脑上进行开发:
git clone https://github.com/hugechuanqi/MachineLearing.git
然后编写代码或其他文件,例如
.md, .py, .cpp, .c, .java, .txt
等,此处假设为hello_world.php,内容自定。提交,通过
git add
命令将文件加入暂存区,再通过git commit
命令提交
git add hello_world.php
git commit -m "Add very good script by php"
-m表示提交说明
可以通过git log
查看日志;公开的源代码也拥有软件著作权,协议包括BSD修正协议,Apache许可协议,MIT许可协议。
- 然后执行push,GitHub上的仓库就会被更新:
git pull
第四章 具体实际操作
4.1 初始化仓库及相关操作
- git init初始化仓库,要使用版管理,首先得初始化一个仓库,实际建立一个目录并初始化仓库:
mkdir git-tutorial
cd git-tutorial
git init
目录底下会生成.git目录,存储着管理当前目录内容所需的仓库数据。在Git中,这个目录的内容成为“附属于该仓库的工作树”,文件编辑等操作在工作树中进行。
git status显示Git仓库的状态。
git add表示向暂存区中添加文件。
git commit命令可以将当前的暂存区中的文件实际保存到仓库的历史纪录中,保存仓库的历史记录。
git log查看提交日志
git log -p
显示文件的改动
git log -p README.md
仅查看README.md文件的提交日志。
git diff
查看更改前后的差别,可以查看工作树、暂存区、最新提交之间的差别。
4.2 分支操作
分支操作:从master分支创建feature-A分支和fix-B分支,每个分支中都拥有自己的最新代码;master分支是Git默认创建的分支。
git branch命令可以显示分支名列表;
git checkout -b创建和切换分支;
git checkout -b feature-A
git checkout master
表示切换到master分支
git checkout -
切换回上一个分支
特性分支,是集中实现单一特性,除此之外不进行任何作业的分支,往往特性分支会有数个,如feature-A,而保留一个可以随时发布软件的稳定分支,如master。
主干分支,master,是特性分支的原点,也是特性分支的终点。
git merge合并分支,假设分支feature-A上的内容已经实现完毕,这时应该先切换到主干分支master中,然后
git merge --no-ff feature-A
- git reset 回溯历史版本
git reset --hard 3e3e67a1a94cc6180dcd0bbdd2efa91076073422
其中这一长串数字是时间节点的哈希值。git log之后就可以看到,在commit后面。
git checkout -b fix-B
创建特性分支
4.3 消除冲突
- 消除冲突,系统在合并README.md时,feature-A分支更改的部分与本次想要合并的fix-B分支更改的部分发生了冲突,因此需要解决这个冲突。打开README.md文件会发现以下内容:
<<<<<<< HEAD
- Feature-A
=======
- fix-B
>>>>>>> fix-B
其中,=======以上的部分是当前HEAD的内容,以下的部分是要合并的fix-B分支中的内容。我们在编辑器中将其改成想要的样子,即
- Feature-A
- fix-B
这样,就可以让feature-A和fix-B的内容并存于文件之中;但是在实际中,往往需要删除其中一个。然后提交:git add README.md
git commit -m "solve the conflict"
- git commit --amend修改提交信息
git commit --amend
然后在编辑器中修改并保存
随后git log --graph就可以看到提交日志的相应内容已经被修改。
4.4 压缩历史
- git rebase -i 压缩历史,若发现前一个提交内容有错,则提交一个修改,并将这个修改包含到前一个提交之中,压缩成一个历史记录。过程为:
-
git checkout -b feature-C
#创建新分支 -
git commit -am "Add feature-C"
#提交内容 -
git diff
#查看修改后的差别,如何修改内容就是对文件的操作了 -
git commit -am "Fix typo"
#Fix typo英文意思是错字和漏字 -
git rebase -i HEAD~2
#将修改的内容“Fix typo”与前一次的提交合并
-
- git checkout master 切换到主分支
- git merge --no-ff feature-C 将分支feature-C与master主分支合并
4.5 推送至远程仓库
Git是分散型版本管理系统,为防止与其他仓库混淆,仓库名请与本地仓库保持一致,即git-tutorial。为了提高整合性,创建仓库时不要勾选初始化README文件。
-
git remote add 添加远程仓库。在GitHub上创建的仓库路径为"git@github.com: 用户名/git-tutorial.git"。用git remote add命令将其设置成本地仓库的远程仓库。例如:
-
git remote add original git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git
上述操作之后,Git会自动把git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git远程仓库的名称设置为origin(标志符)。
-
-
git push 推送至远程仓库
-
git push -u origin master
把当前分支的内容推送给远程仓库origin的master分支。-u阐述可以在推送的同时,将origin仓库的master分支设置为本地仓库当前分支的upstream(上游)。添加-u阐述有利于之后运行git pull
命令从远程仓库获取内容时,省去了另外添加的麻烦。
-
-
git push 推送至master以外的分支
-
git checkout -b feature
创建分支 -
git push -u origin feature-D
将当前分支push给远程仓库并保持分支名称不变。之后就可以在远程仓库的GitHub页面就可以查看到feature-D分支。
-
4.5 从远程仓库获取
git clone 获取远程仓库。
切换到非仓库目录名
下后,执行git clone git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git
,我们会默认处于master分支,同时系统会自动将origin设置成该远程仓库的标识符。即当前仓库的master分支与GitHub端的远程仓库(origin)的master分支在内容上完全相同。git branch -a 命令查看当前分支的相关信息。
-
获取远程的feature-D分支(??此处有点问题,今天暂时没时间修改)
-
git checkout -b feature-D origin/feature-D
. -b参数后面是本地仓库中新建分支的名称。为了与远程仓库origin/feature-D
保持同名,此处-b后面也起名为feature-D
,过程如下:
-
git init
git remote add origin git@github.com:hugechuanqi/Algorithms-and-Data-Structures.git #将远程仓库名称设置为origin
git checkout -b feature-D origin/feature-D #新建分支,并获取远程分支内容
- git pull 获取最新的远程仓库分支
-
git pull origin feature-D
将本地的feature-D分支更新到最新状态。如果两人同时修改了同一部分的源代码,push时就很容易发生冲突,所以多人同时在同一个分支中进行作业时,为减少冲突情况的发生,建议更频繁地进行push和pull操作。
-
推荐资料:
1、Pro Git:http://git-scm.com/book/zh/v1,是一本零基础Git学习资料。 由 Scott Chacon书写。
2、LearnGiBranching:http://pcottle.github.io/learnGitBranching/,是学习Git基本操作的网站,偏重树形结构。
3、tryGit:http://try.github.io/ 可以在Web上一边操作一边学习Git的基本功能。
97/286 未完待续
参考:书籍:github入门与实践