Blog

docker入门概述-(2)-能干嘛

一、之前的虚拟机技术

虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows 系统里面运行Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。


虚拟机的缺点:
1    资源占用多                2    冗余步骤多                  3    启动慢

二、容器虚拟化技术

由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统 ,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
比较了 Docker 和传统虚拟化方式的不同之处:
*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
*而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核, 而且也没有进行硬件虚拟 。因此容器要比传统虚拟机更为轻便。
* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

三、Docker虚拟化优势

图 1.4.1.1 – 传统虚拟化
图 1.4.1.2 – Docker

对比传统虚拟机总结

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

1、更高效的利用系统资源【比虚拟机】

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

2、更快速的启动时间【比虚拟机】

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

3、更轻松的维护和扩展【比虚拟机】

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

4、一致的运行环境【同虚拟机】

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

5、持续交付和部署【同虚拟机】

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

6、更轻松的迁移【同虚拟机】

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

四、docker应用举例

携程 docker 使用情况:

https://www.v2ex.com/t/404193

今天心情还可以,就放点干货节约点你搜索的时间。

.Net 大户的选择:Windows Container 在携程的应用
https://www.v2ex.com/t/335653

Virtualization Documentation
https://docs.microsoft.com/zh-cn/virtualization/#pivot=main&panel=containers

https://yq.aliyun.com/articles/62375

docker入门概述-(1)-是什么

惨痛教训:

docker的镜像相当于是一个部署环境,主要用于生产环境,不适合开发环境,因为第一次在镜像上安装完软件后,第二次打开镜像发现,自己安装的软件都不在了。所以每次自己装完软件后,都需要打包成新的镜像。

一、docker简史

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

二、docker出现原因

一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题, 软件可以带环境安装? 也就是说, 安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。


之前在服务器配置一个应用的运行环境,要安装各种软件,就拿尚硅谷电商项目的环境来说吧,Java/Tomcat/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。

传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式, 开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况 。Docker镜像的设计, 使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。

三、docker介绍

Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到 “一次封装,到处运行”


Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。 只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。

总结:
解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

四、docker大白话总结

1、Docker 不是虚拟机,和宿主共享内核的,所以 Linux 内核下的 Docker 只能装linux 的 Container。
2、Windows container 目前支持的系统是 Windows server 2016 ,这个版本是去年 10 月份正式发布的(携程是国内比较早的一批拿到了他们的 RTM 版本),支持两类 server ,一类是 server core ,另一类是 nano server 。 nano server 是微软比较推荐的一类服务器系统,启动非常快,可以大幅度缩短计划内维护宕机时间,通常几秒钟就起来了,不包含硬件检测的时间,几十秒都能够起来。
简单来说:
linux下面的docker只支持linux 容器,Windows下面的类docker只支持Windows容器。
因为linux 容器可以 通过 XWindows 协议 进行图像 传递,所以  linux容器 可以 运行GUI软件。

Does Docker for Windows Server 2016 support GUI-based applications? 

At this time, no, Docker for Windows Server 2016 does not support GUI-based applications. This is because Windows containers are based on either Nano or Core Server, which do not allow users to start up a GUI-based interface nor RDP into the container.

五、docker下载

docker官网:http://www.docker.com<
docker中文网站:https://www.docker-cn.com/
Docker Hub官网: https://hub.docker.com/

六、dock学习路线图

 

七、dock参考书

https://yeasy.gitbooks.io/docker_practice/content/introduction/what.htmlhttps://github.com/yeasy/docker_practice/blob/master/SUMMARY.md

git概述-git工作流

一、 概念

在项目开发过程中使用 Git 的方式。

二、分类

1、集中式工作流

像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到 Master 这个分支上。这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。

2、GitFlow 工作流

Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。

3、Forking 工作流

Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受不信任贡献者的提交。

三、GitFlow 工作流详解

1、主干分支 master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境 完全一致。
2、开发分支 develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
3、bug 修理分支 hotfix
主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
4、准生产分支(预发布分支)release
较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后,可以视情况删除。
5、功能分支 feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。开发完成后会合并到开发分支。

git原理-hash与文件管理与分支管理

一、hash

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示:

二、Git 保存版本的机制

1、集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

2、Git 的文件管理机制

Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,
Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。

3、Git 文件管理机制细节

(1)Git 的“提交对象”

(2)提交对象及其父对象形成的链条

三、Git 分支管理机制

1、分支的创建

2、分支的切换

 

git客户端-eclipse项目的git操作

最开始的时候,应该先从远程库fetch 到本地,本地merge后,才能提交到远程库,否则远程库会拒绝接收提交。

一、提交到本地库

1、新项目首先需要添加到暂存区

2、提交至本地库

3、图形化界面拖拽和快捷键

新建好的类可以,可以不用 Add to index 直接 commit 就行了,此时

还可以使用快捷键  cmmand + alt + 3

二、推送到远程库

三、从远程库clone到本地

eclipse 因为新建版本稍有变化,有的版本不能直接clone到工作区,需要在clone到别的地方,然后再从外部导入到工作区。

四、转换clone到本地的项目

因为上传到远程仓库的文件不包括eclipse的项目配置文件,所以clone到本地后,我们需要convert项目。

五、解决冲突

冲突文件→右键→Team→Merge Tool
修改完成后正常执行 add/commit 操作即可。

六、新建分支与合并分支

项目-->Team-->Switch To Other 页面中:可以对分支进行新建、删除、重命名和切换。 

主开发者:

本地新建 hot_fix分支:

修改好后,提交到本地库,然后push到远程仓库。【push到远程库方法也可以是如下方法】

协开发者:

从远程库下载hot_fix分支:

从本地master分支 切换到 远程hot_fix分支:

然后先切换到本地master分支:

接着再合并本地的 hot_fix分支:

最后 push 到 远程库。

 

 

git客户端-eclipse项目的git配置

一、eclipse查看git用户配置文件

二、eclipse项目初始化git

工程→右键→Team→Share Project→Git【我这边已没有git选项了,直接进入git配置页面】

三、eclipse项目配置git

1、配置项目的本地签名

2、配置git项目忽略文件

eclipse中的 Quick Access  搜索框中 输入  navigator,就能查看项目的所有文件了。

概念:Eclipse 特定文件
这些都是Eclipse 为了管理我们创建的工程而维护的文件,和开发的代码没有
直接关系。最好不要在Git 中进行追踪,也就是把它们忽略。
.classpath 文件
.project 文件
.settings 目录下所有文件
为什么要忽略Eclipse 特定文件呢?
同一个团队中很难保证大家使用相同的IDE 工具,而IDE 工具不同时,相关工
程特定文件就有可能不同。如果这些文件加入版本控制,那么开发时很可能需要为
了这些文件解决冲突。

GitHub 官网样例文件
https://github.com/github/gitignore
https://github.com/github/gitignore/blob/master/Java.gitignore
编辑本地忽略配置文件,文件名任意。

Java.gitignore 忽略配置文件如下:

# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

.classpath
.project
.settings
target

注意啦:下面这些是自己添加的忽略文件,其余的忽略文件是模板提供的。

.classpath
.project
.settings
target

在~/.gitconfig 【git的用户配置文件】文件中引入上述文件
[core]
excludesfile = /Users/cool/Java.gitignore
[注意:如果是Windows系统,这里的路径中就要使用“\”,不能使用“/”]

git基础-(7)-使用SSH登录github仓库

一、新建 SSH 的密钥

运行命令生成.ssh 密钥目录
$ ssh-keygen -t rsa -C [email protected]

打开用户根目录的 .ssh文件夹,查找里面的公钥文件:选中并复制

二、 SSH 的密钥

打开github账号的setting设置,找到  SSH and GPG keys 并将 步骤一中的 公钥信息,复制到 SSH keys 栏目中。

三、获取SSH连接

1、在仓库的下载中,Clone or download–>Use SSH–> Clone with SSH 获得项目仓库的 SSH链接。

2、在本地客户端中,添加远程仓库的SSH连接别名:

cooldeMacBook-Pro:git-learn cool$ git remote add origin_ssh [email protected]:sky123/huashan.git

3、执行提交到远程库操作

cooldeMacBook-Pro:git-learn cool$ git push origin_ssh master
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 848 bytes | 848.00 KiB/s, done.
Total 9 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 1 local object.
To github.com:sky123/huashan.git
   e416c03..a4fe921  master -> master
cooldeMacBook-Pro:git-learn cool$ 

 

git基础-(5)-远程团队内部协作

一、主力开发登录github创建项目仓库

参考图片:

创建完后,拷贝仓库地址 比如 https://github.com/sky123/huashan.git

二、主力开发将本地库提交到github远程仓库

1、设置远程仓库别名

git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程库地址]
git remote add rr https://github.com/i12dream/huashan.git
【rr 是 远程仓库 自己取的 别名,以后还是取 origin 好,这样方便统一】

cooldeMacBook-Pro:git-learn cool$ git remote add rr https://github.com/sky123/huashan.git
cooldeMacBook-Pro:git-learn cool$ git remote -v
rr https://github.com/sky123/huashan.git (fetch)
rr https://github.com/sky123/huashan.git (push)
cooldeMacBook-Pro:git-learn cool$

2、将本地库上传到远程服务器

git push [远程库地址别名] [远程库分支名]

### 上传做法:osx 有弹窗 获取密码,我拒绝了 然后就在 命令行 输入了用户名和密码
cooldeMacBook-Pro:git-learn cool$ git push rr master
Username for 'https://github.com': sky123
Password for 'https://[email protected]': 
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 471 bytes | 471.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/sky123/huashan/pull/new/master
remote: 
To https://github.com/sky123/huashan.git
 * [new branch]      master -> master
cooldeMacBook-Pro:git-learn cool$ 

三、协作开发下载修改并提交到远程

1、协作开发先clone到本地

git clone [远程库地址]   作用:
1、完整的把远程库下载到本地
2、创建origin 远程地址别名
3、初始化本地库

新建一个目录,直接 git clone 就好了。git clone 会新建一个 仓库名文件夹,里面项目已经下载好了,git已经初始化好了 ,远程地址别名也设置好了。
特别注意:远程库 别名这里是 origin 【所以下次都用orign 当做远程库别名好了】

cooldeMacBook-Pro:desktop cool$ git clone
...
..

### 特别注意:远程库 别名这里居然是 origin 【所以下次都用orign 当做远程库别名好了】
cooldeMacBook-Pro:huashan cool$ git remote -v
origin	https://github.com/sky123/huashan.git (fetch)
origin	https://github.com/sky123/huashan.git (push)
cooldeMacBook-Pro:huashan cool$

2、修改了一些文件后,就先提交到本地库

3、提交到远程库的一些问题

当协作开发直接 推送到远程库时,发现 新创建的用户 需要邮箱验证一下。

cooldeMacBook-Pro:huashan cool$ git push origin master
Username for 'https://github.com': skyman
Password for 'https://[email protected]': 
remote: You must verify your email address.
remote: See https://github.com/settings/emails.
fatal: unable to access 'https://github.com/sky123/huashan.git/': The requested URL returned error: 403
cooldeMacBook-Pro:huashan cool$

登录邮箱验证完后,再一次推送提交,发现无法授权 ,需要仓库创建者【主力开发】的邀请。

邀请怎么添加呢?


“主力开发”通过各种方式把邀请链接发送给“协作开发”,“协作开发”登录自己的 GitHub账号,访问邀请链接。

成为合作者后,协作开发就能提交到远程仓库了。
cooldeMacBook-Pro:huashan cool$ git push origin master

四、主力开发从远程仓库拉取并合并到本地

 pull=fetch+merge
 git fetch [远程库地址别名] [远程分支名]
 git merge [远程库地址别名/远程分支名]
 git pull [远程库地址别名] [远程分支名]

1、可以使用 fetch 和 merge  两步操作

远程仓库管理者【主力开发】 :拉取远程已经修改的仓库。rr 是 之前远程仓库地址的别名。

cooldeMacBook-Pro:git-learn cool$ git remote -v
rr	https://github.com/sky123/huashan.git (fetch)
rr	https://github.com/sky123/huashan.git (push)

cooldeMacBook-Pro:git-learn cool$ git fetch rr master
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/sky123/huashan
 * branch            master     -> FETCH_HEAD
   4a234e2..97806e9  master     -> rr/master
cooldeMacBook-Pro:git-learn cool$ 

下载到本地的目录是 rr/master ,也就是说本地有 master  rr/master 两个分支。

cooldeMacBook-Pro:git-learn cool$ git checkout rr/master
Note: checking out 'rr/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 97806e9 令狐冲
cooldeMacBook-Pro:git-learn cool$

接下来就是合并操作了:【如果合并时出现冲突,可以根据分支冲突一文来处理】
cooldeMacBook-Pro:git-learn cool$ git merge rr/master

2、也可以使用 pull 操作 一步到位

pull 等于 fetch + merge
cooldeMacBook-Pro:git-learn cool$ git pull rr master

五、主力开发和协作开发同时提交到远程问题

两个开发者 同时向 远程库 提交的情况下:第二个 开发者 提交时 会报错 。

cooldeMacBook-Pro:huashan cool$ git push origin master
Username for 'https://github.com': skyman
Password for 'https://[email protected]': 
To https://github.com/sky123/huashan.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/sky123/huashan.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
cooldeMacBook-Pro:huashan cool$ 

我们需要从远程库中将最新的版本下载下来,先合并 然后再提交!!!

cooldeMacBook-Pro:huashan cool$ git pull origin master
From https://github.com/sky123/huashan
 * branch            master     -> FETCH_HEAD
Auto-merging apple.txt
CONFLICT (content): Merge conflict in apple.txt
Automatic merge failed; fix conflicts and then commit the result.
cooldeMacBook-Pro:huashan cool$ vim apple.txt
cooldeMacBook-Pro:huashan cool$ git add apple.txt
cooldeMacBook-Pro:huashan cool$ git commit -m "conflict resolve"
[master e416c03] conflict resolve
cooldeMacBook-Pro:huashan cool$ git push origin master
Username for 'https://github.com': skyman
Password for 'https://[email protected]': 
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 687 bytes | 687.00 KiB/s, done.
Total 6 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/sky123/huashan.git
   ff6f1a1..e416c03  master -> master
cooldeMacBook-Pro:huashan cool$