第一章 由来

  • 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_rsaid_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入门与实践

github入门书籍总结的更多相关文章

  1. 搜刮一些开源项目的APP

    iOS完整App资源收集 <iOS完整app资源收集>  <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...

  2. 结合个人经历总结的前端入门方法 (转自https://github.com/qiu-deqing/FE-learning)

    结合个人经历总结的前端入门方法 (https://github.com/qiu-deqing/FE-learning),里面有很详细的介绍. 之前一直想学习前端的,都不知道怎么下手都一年了啥也没学到, ...

  3. 前端工作面试问题--摘取自github

    前端工作面试问题 本文包含了一些用于考查候选者的前端面试问题.不建议对单个候选者问及每个问题 (那需要好几个小时).只要从列表里挑选一些,就能帮助你考查候选者是否具备所需要的技能. 备注: 这些问题中 ...

  4. 转:怎么使用github(通俗易懂版)

    转:  https://www.zhihu.com/question/20070065 作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/ans ...

  5. github使用-知乎的某小姐的一篇文章

    作者:珊姗是个小太阳链接:http://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一个文科 ...

  6. MAC使用GITHUB

    作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. #什么是 ...

  7. 文科妹学 GitHub 简易教程

      #什么是 Github ?必须要放这张图了!!!<img src="https://pic4.zhimg.com/7c9d3403bf922b1663f56975869c829b_ ...

  8. 【Git和GitHub】学习笔记

    1. 书籍推荐: 先看一本比较简单并且好的入门书籍 Git - Book https://git-scm.com/book/zh/v2 2. 书籍理解: Git 有三种状态,你的文件可能处于其中之一: ...

  9. 文科妹学 GitHub 简易教程(转)

    文科妹学 GitHub 简易教程     #什么是 Github ?必须要放这张图了!!! Git 是由 Linux 之父 Linus Tovalds 为了更好地管理linux内核开发而创立的分布式版 ...

随机推荐

  1. x盒子

    0换成1切回

  2. Intellij IDEA 安装配置Gradle

    1.安装 到官网链接下载最新的bin版本,解压到 D:\Program Files (x86)\JetBrains\IDEA Configuration And Cache\gradle 配置环境变量 ...

  3. Sorting arrays in NumPy by column

    https://stackoverflow.com/questions/2828059/sorting-arrays-in-numpy-by-column I suppose this works:  ...

  4. oracle 之创建定时器

    ---创建定时执行任务declare job20 number;beginsys.dbms_job.submit(job20,'test1;',sysdate,'sysdate+1/1440');en ...

  5. AtomicReference实现单例模式

    CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试. 乐观锁的一种实 ...

  6. Collection与Collections的区别

    Collection是集合类的上级接口,继承与他有关的接口主要有List和Set Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全等操作 稍微举 ...

  7. File类文件的常见操作

    boolean exists() 判断文件或者目录是否存在 boolean isFile()  判断是否是文件 boolean isDirectory() 判断是否是目录 String getPath ...

  8. 【Django】【问题集锦】

    参考:http://www.linuxidc.com/Linux/2013-03/80649.htm 1. Django的shell模式下,如果报warning,则再执行一次,也许就好了 2. Dja ...

  9. linux中日历命令显示

    cal 显示当前月的日历 cal 年份 显示特定一年的年历 [jasmine.qian@]$ cal January 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 ...

  10. R语言多层绘图

    #########################################################第一种实现方法close.screen(all.screens = T)split.s ...