适合小白/外行的git与github最基础最浅显教程

首先声明,这是适合小白/外行/初学者/学生看的最基础最简单的git与github教程,已经能使用svn,git等工具的朋友请不要看这篇文章来浪费时间了。

想进一步学习git的,推荐去廖雪峰博客学习。java

这是以前帮助几个外行的朋友写的最基础git教程,仅让他们理解基本概念,可以简单使用。固然教程写的也算用心,因此就从新整理一下放到博客上了。(其实主要是由于这段太忙了,没时间写新文章了,写一篇好的文章真的太耗费心血了。因此手头正好有一篇以前写的教程就整理一下发表吧)。指望能让小白/外行/初学者/学生能理解版本控制工具的基本概念与使用。python

这篇教程共计一万八千字,花了个人不少时间精力,不过最后有人依旧没学会,不得不说,这真的是一个很悲伤的故事。linux

文章概要总结

必须记住的六条命令。

  • cd:用来切换工做目录,最经常使用的一个命令。简单来说,cd A文件夹就是进入到A文件夹里面的意思。
  • git status .:查看当前路径下的的状态。git下最最经常使用的一个命令。
  • git add .: 把工做区的全部变化,(就是你的全部改动),都添加到 版本库/暂存区。
  • git commit -m "提交时说明信息": 更进一步提交,并说明提交log。
  • git push: 把版本库的全部更新内容, 都推送到远程服务器。(就是推代码/推上去)
  • git pull: 把代码从远程服务器拉取到本地。(俗称拉代码)

当咱们修改了本地代码,向远程服务器推送时,咱们的操做步骤以下:git

  1. git add .
  2. git commit -m "提交时说明信息"
  3. git push
    当咱们想更新本地代码,就是把服务器上最新的代码拉取下来,只须要执行一个命令。
    git pull

这三条命令建议记住。

  • git log:查看提交历史,与各次的提交说明。
  • git diff:比较工做区与暂存区的差别,就是比较看看你到底都作了什么修改。
  • git clone url地址: 将远程服务器上项目克隆到新建立的目录中(第一次拉项目时使用, 后面的更新都用 git pull了)。

其余问题

  • 操做时 双击tab键的自动提示/补全功能。
  • q或者:q等命令表明退出(quit)。
  • ctrl+f,ctrl+b快捷键在termial能够翻页,就是 上一页,下一页

最重要的内容再强调一遍:

这是给小白/外行/初学者/学生看的最基础最简单的git与github教程,已经能使用svn,git等工具的朋友就不要看这篇文章来浪费时间了。

另外,这篇文章也不是讲述git安装的,或者github帐户建立,key上传的。相似的文章网上遍地都是,本身去搜索吧。程序员

文章正文

git是一个分布式版本控制系统。简单来说,若是有几我的同时开发维护一个项目的代码,那么咱们就找个中央服务器,放置一份公共的代码,每一个人在各自的电脑上去修改各自的代码,而后修改完,提交到中央服务器。这样你们拉代码时,就能更新到其余人修改的内容了。。github

Notice:代码只是为了便于说明。版本控制系统,管理的是文件,因此任何文件均可以。图片啦,视频文件啦,二进制文件啦,没有什么不能够的。只是咱们为了行文方便,直接说代码文件。编程

本教程会讲述 命令行 操做。不过也有不少人 使用图形化界面软件 好比source tree或者 俗称的小乌龟软件 来操做。可是基底的原理是同样的。source tree 软件操做也只是命令行的 封装。而且图形化操做更加直观一些。熟悉了命令行,图形化软件操做天然也会。不会命令行,图形化软件操做也能够会,可是会理解的比较肤浅。更重要的是会了其中一个,学习另外一个就很是容易了。vim

本篇文章之因此采用 终端(termial)命令行的方式,除了我本人平时一直使用命令行操做以外,还有重要的一点,命令行具备更普遍的适用性。换句话说,你熟悉了 git的命令行,那么利用命令行进行其余操做,好比java,python,运行测试脚本等,对你来讲很easy,理解了最底层的原理,学习图形化软件也会很容易,毕竟图形化软件那么多,你永远学不完的,可是理解了底层的,就能以不变应万变。api

理解几个概念

工做区(Working Directory), 版本库(Repository)/暂存区 ,(中央/远程)服务器.服务器

  • 服务器的概念已经清楚了。叫作 中央服务器/远程服务器都行。
  • 工做区:就是你电脑的工做目录
  • 版本库:工做区有一个隐藏的 .git文件夹,这个是叫作 版本库(有些文章也叫 暂存区,无论叫什么,知道这个意思就好)。.git 是隐藏文件夹。该文件内的内容很重要,由于git的控制配置等信息,都在这个隐藏文件夹里。电脑若是设置不显示隐藏文件夹,那么就会看不到。

我电脑上的一个项目,能够看到什么是工做区,暂存区.

图片名称:工做区与暂存区.png

工做区与暂存区.png-65.6kB

为何存在一个 版本库

我修改过的代码,直接从 工做区提交到服务器不就好了嘛,为何还要这么麻烦。svn 等集中式版本管理系统就是这么作的,简单明了,可是若是你没网络时怎么办?因此有了 版本库,那么你能够把代码先从工做区提交到版本库,等待有网络了,能够再提交到服务器。

.gitignore文件是干啥的?

工做区的目录下面,总会存在不少乱七八糟的文件,好比你本地的配置,编译生成的中间文件等,这些文件你不想(或不能)提交到 服务器。那怎么办呢。就把这些文件的规则写到 .gitignore文件中,这样git就会 ignore(忽略)这些文件,git就会像没看到这些文件同样。

好比个人.gitignore文件有些内容以下:

git忽略文件.png-3.6kB

这几句话的意思是 全部apk后缀的文件,class后缀的文件都忽略,bin/gen/目录下的文件也忽略。说的通俗一点,就是你git别管这些文件了,这些和git没屁关系。我无论怎么倒腾这些文件,都和git不要紧。另外, .gitignore 文件中,#号开头的行 表明注释,就像 编程文件中的//开头的行同样。

几个简单的命令。

怎么建立一个被git控制的项目,后面再讲,这里先讲述几个基本命令。

在此以前,先熟悉一个 cd命令。

cd命令用来切换工做目录,linux,mac环境下最经常使用的一个命令。 简单来说,cd A文件夹就是进入到A文件夹里面的意思。好比我要进入d盘个人代码文件夹, 输入命令 cd /d/code/github_blog/而后回车。

假设你在一个项目中修改了某些文件。

你想看看当前目录下是什么状态,命令 git status .

. : 一个点表明当前目录,..:两个点 表明上级目录。 (这和git无关,这是 计算机基本的常识)。那么请思考,cd ..,这个命令是啥意思?

可是你敲命令的时候,记不清楚了,或者 打错了了。看看termial会有什么反应?

$ git satds
git: 'satds' is not a git command. See 'git --help'.

Did you mean this?
        status

有不少的概念和操做,都和什么git无关,都是计算机领域中的基本常识,或者 全部(至少绝大部分)软件都遵循的操做常识,git天然也一样遵循这样概念和操做,这些内容我会用斜体的 计算机常识 来标注。

$ git satds一行,$ 表明的是命令行的开始,后面的内容表明的就是你的输入内容。而 它的下一行就是系统反馈/回应 你的内容。(或者说系统输出)。(计算机常识)

你看到什么?git会问你, 它不认识这个命令啊,你是否是敲错了,你能够用git --help寻求帮助哦。另外你是否是想打 status 这个词呢? 因此git的命令根本 不用背,有个简单的印象就好。

甚至,你在敲打命令的时候,根本不用敲完,输入头几个字符,而后直接 敲击 tab键,看看会发生什么?

$ git sta //敲击 tab
stage    stash    status

系统直接提示你了,sta开头的命令有三个,就看你想用哪一个了,这是为了你记忆。
而你敲击 git stat以后,再敲击 tab,再看看 会发生什么。由于此时 stat开头的命令只剩下一个了status,因此你也只能打这个命令了。因此git自动帮你补全了。。

点击tab键的 自动提示/补全功能颇有用,绝大部分命令行操做都有这个快捷键,毕竟那么长的命令,文件路径等,记忆很难,打字也很累。不过有些termial状况,是点击一次tab键,而有些则是双击tab键,反正你能够老是双击tab键,这总不会错。(计算机常识)

费了好大劲,咱们终于输入了正确的字符。看看 命令行 会输出什么内容。

图片名称:git_status.png

git_status.png-11.5kB

我在测试前,作了如下几件事情:

  • 新创建一个 test0908.txt 文件。
  • CachedThreadPool.java 文件中修改了一些内容。
  • 删除了 DirectThread文件。

而后你看看 git 输出的内容。咱们逐行进行分析。

On branch master
Your branch is up-to-date with 'origin/master'.

第一行不用管,这是 分支(branch)的概念,基础教程不涉及分支。(想进一步学习了去廖雪峰的博客)
第二行:你的分支与远程分支已经同步了。(就是远程服务器并不比你的代码新)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   java/src/thread_runnable/CachedThreadPool.java
        deleted:    java/src/thread_runnable/DirectThread.java

翻译一下:

改变尚未到提交阶段呢。
(使用   `git add <file>...`  命令 来更新 你的提交。)
(使用 `git checkout -- <file>...`命令来放弃你工做区的修改 )
 而后下面 列出了你修改的具体文件。
 `modified`表明修改,`deleted`表明 删除。(还有add表示增长,像svn中就直接简写M,D,A了,若是若是看到了这些简写了,要明白什么意思)

提示内容已经很是明明白白的告诉你了,你的修改内容,以及你下一步能够怎么作了。
你能够 使用git add命令来提交;也可使用 git checkout 来放弃修改。(就是 把工做区从新变干净,把你修改的东西都恢复了,就像 ctrl+z同样)。

而后还有几行:

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test0908.txt

no changes added to commit (use "git add" and/or "git commit -a")

翻译以下:

未跟踪的文件
(使用 `git add <file>...` 命令会包括下面这些提交)
  你添加的文件名
 如今还没走到commit地步呢。(可使用 `git add` 或者  `git commit -a`)

首先 test0908.txt为何是 Untracked files,由于我刚才就说了,个人这个文件是 新添加的,git以前没见过这个文件(git刚刚第一次见到这个文件,因此感受很面生,不认识啊)。因此它说这个文件未跟踪,而上面那两个文件 CachedThreadPool.javaDirectThread.java这两个文件,由于以前早就添加了,因此git系统会认识这两个文件。

那么如今工做区就是这个样子了。

我想看看我具体到某个文件进行了什么修改。该怎么操做呢。
git diff 操做。

git_diff.png-38kB

这个内容显示的有些乱七八糟。

首先你看到 它列出了第一个文件
diff --git a/java/src/thread_runnable/CachedThreadPool.java b/java/src/thread_runnable/CachedThreadPool.java
前面一个a,后面一个b,其实就是表明你修改先后的文件。(不用关心这些)。
而后下面,是具体内容,

  • 全部 + 开头的,表明的都是你添加的内容,
  • 全部 -开头的,表明的都是你删除的内容。
  • 那些既没有"+"也没有"-"开头的行,就是和你修改区域的相关上下文,有了这些上下文,能够更好的帮你回想起来,你到底都修改了什么了。

而且它们显示的颜色也不一样。

而后它列出了你修改的的第二个文件。

diff --git a/java/src/thread_runnable/DirectThread.java b/java/src/thread_runnable/DirectThread.java
deleted file mode 100644

它也提示你了,你把这个文件删除了。
而具体的提示,则所有是红色的 -号区域。为何是所有是 -号区域,由于你把这个文件都删除了,那天然是至关于你把全部的内容都删除了。

为何 你添加的 test0908.txt 文件没有被这个命令提示,由于 这个文件尚未被跟踪,再说,也不必显示啊。由于这个文件的全部内容 都是你新添加的。

我把termial的界面调整到最大了。因此能够所有输出,若是文件改动不少/termial界面过小,一屏幕输出不完。那么 ctrl+f,ctrl+b快捷键分别显示 上一页,下一页,q或者:q等命令表明退出(quit)。(计算机常识)

上面虽然解释了git diff 命令的意思。可是这个显示的确让人眼花缭乱。而 source tree等图形化工具,关于这个对比显示,的确直观了不少。

图形化界面是相似下面这样显示的,看着 直观了许多。

图片名称:git_diff_图形化界面.png

git_diff_图形化界面.png-113.8kB

(其实eclipse等IDE,都附带了相似的工具帮助你比较你都修改了什么,显示结果用图形化界面形式来显示,比较直观,不过这里就不作具体说明了。可是git diff的确比较少用,由于这种termial输出看的眼睛都花了)

咱们 已经知道了工做区的状态,也知道修改了哪些内容。
那么下面该作什么呢。

git status .时,已经很清楚的提示下一步命令是什么了。

咱们先把文件从 工做区提交到 版本库。
本次提交时,你能够只添加某一个文件,其余文件你没修完还不想提交呢: git add java/src/thread_runnable/CachedThreadPool.java
也能够 一次提交两个文件(文件中间空格分割): git add java/src/thread_runnable/CachedThreadPool.java test0908.txt
你固然也能够一块儿提交全部的修改。git add .(通常经常使用的就是这个命令,修改了就所有添加,省的麻烦)

思考一下最后一个命令为何是这样,不要忘记一个点.表明什么。
更别忘记了刚才强调的tab快捷键, 不然那么长的文件路径打字累不累啊。(固然,你复制粘贴也能够的)

好。咱们把 全部文件提交了,
$ git add .

这一步没有没有任何输出。

此时 git status .看看 什么状态。

图片名称:git_status_after_add.png
git_status_after_add.png-19.4kB

提示区域已经告诉咱们了能够怎么作了。

你可使用 `git reset HEAD <file>...` 来恢复上一步操做。

这里提示了怎么进行恢复。而上面那句话是啥?你能够进行committed啊,(固然,git直接提示使用git commit进行更进一步的提交才完美。)
而后 我执行 下面命令,进行更进一步的提交操做。

git commit -m "我这只是一次提交测试,进行教学的提交测试"

命令的 -m "提交说明" 是添加说明的。

此时你的代码改动都已经放到了 版本库了。

而后再 git status .,看看提示了什么:

图片名称:git_status_after_commit.png
git_status_after_commit.png-25.5kB

下面几句话值得注意:

Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

origin是原点,远程的意思。因此这句话是这个意思。

你能够 使用 `git push` 来向远程 发布你的 变化。(其实就是推送到远程服务器>)

那么咱们就 git push吧。。把 版本库的东西,推送到远程服务器。由于你写了代码,原本就是为了提交到远程服务器嘛。。

咱们来看看 git push以后,提示了什么。

图片名称:git_push .png
git_push .png-30.6kB

此次操做输出的内容也是让人眼花缭乱,上面的那一部分一样是相关提示,告诉咱们可使用更详细的命令,这个区域不用管。我也没研究过什么内容,关注一下我红框画出来的内容。

其实在输入git push命令时,输出会停留在下面这一行,等待你输入密码。

Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa':

这个是咱们在最初设置git环境时,设置的ssh密码,好比个人电脑上设置的是 123456。输入了密码,而后才能输出下面那些内容,表明此时咱们的操做已经完成了。

有些人的电脑上,使用 git push时, 并无输入密码这一步骤,那是由于他们在最初配置git环境时,把密码这步省略了(或者记住了密码),因此他们不用输入密码。

下面这几句内容。

Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 671 bytes | 0 bytes/s, done.
Total 7 (delta 4), reused 0 (delta 0)

是一些push时的 提示内容,没必要关心(反正我也看不懂)。。
再下面两句。

To git@git.oschina.net:yaowen369/ConcurrentDemo.git
   5c53c8f..0e522fe  master -> master

To 表明的意思是目的地,你本地提交到了哪里?由于个人这个项目放在了 oschina 托管网站上了,(oschina地址:http://git.oschina.net/) 因此就是说,个人代码被提交到了 那个地址了。 本地master分支到 远程master分支。

oschina和github同样,都是代码托管网站。(固然,你托管其余文件天然也能够)。相似的网站有不少,还有gitlab之类的, 不过github最有名罢了。 所谓托管,意思就是至关于他们提供了一个远程服务器,供你放置你的文件。这个问题下面的内容会讲到。

到了这个步骤,咱们修改的内容,都已经被提交到了远程服务器上,虽然有时候敲击命令时,termial提示了咱们不少乱七八糟看不懂的内容,可是这不重要,看不懂也很正常,彻底看懂也不必,由于咱们的目的已经达到了,就是 把本地修改 提交到了 远程服务器上了。

此时咱们再使用 git status,看看当前状态是什么。

图片名称:git_status_after_pull.png
git_status_after_pull.png-14.9kB

上面的意思是说

你当前的分支已经和`origin/master`同样新了(就是内容一致了)。
没有什么东西要提交,你的工做区很干净。

此时,我打开了个人mac电脑,个人mac电脑上也有这个项目。我有时候在公司电脑上写代码,有时候在本身的mac电脑上写代码,因此有了git,均可以方便的在不一样电脑上切换。

我在本身的mac电脑上,进入到对应的代码目录,使用了 git pull命令,看看什么反应。

有些时候,也会要求你输入ssh的命令,才能拉代码,直接输入以前设置的123456密码就好了。

图片名称:git_pull.png-
git_pull.png-149.1kB

最上面的那几句话不用看(我也看不懂,也彻底没看懂的必要)。
只看最重要的部分

From https://git.oschina.net/yaowen369/ConcurrentDemo 

   5c53c8f..0e522fe  master     -> origin/master
Updating 5c53c8f..0e522fe
Fast-forward
 java/src/thread_runnable/CachedThreadPool.java |  5 ++++-
 java/src/thread_runnable/DirectThread.java     | 24 ------------------------
 test0908.txt                                   |  1 +

这个文件从 oschina远程服务器拉下来了,而且此次 拉取 更新了那些文件呢。。就是下面三个。

java/src/thread_runnable/CachedThreadPool.java |  5 ++++-
 java/src/thread_runnable/DirectThread.java     | 24 ------------------------
 test0908.txt                                   |  1 +

这不就是我在本身办公电脑上修改的那三个文件吗?而且看到后面的 +,- 符号,它还告诉你了,有些咱们添加内容了,有些咱们删除内容了。因此到了这个时候,
咱们经过status,add,commitpush,pull这五个简单的命令,咱们就能简单的使用 git了。。这已经能知足咱们平常80%的需求了。(对于一我的开发的项目,而不是 团队多人开发模式来说,这五个命令已经能知足95%的平常需求了)

至于有些命令的提示输出内容等,看不懂就看不懂了,都看懂又有啥用。咱们只要会用就能够了。好比 git push命令以后,termial提示输出了那么多的内容,你只要简单的能看懂,咱们推送成功(仍是失败)了这就ok了。其余的不用管。

冲突问题

但是人生哪有到处都如意的时候呢,代码也是如此。若是A和B都同时修改了同一个文件会发生什么呢,此时就会发生冲突。

好比张三修改了 A.java文件上传到了中央服务器,而后李四在本地也修改了 A.java文件,李四想提交文件时,会提示由于冲突而没法提交。系统要求你先把代码拉下来,合并了A.java的冲突(这个合并过程,其实有时候git会自动合并,可是复杂的合并git作不了,因此就要求李四本身去合并冲突),而后李四才能提交上去。。。

固然,你工做电脑上提交,而后 本身私人笔记本上又修改了同一个文件,这和上面是一样的意思,只是 咱们用张三李四来方便表达。

因此为了不潜在冲突一个好习惯就是 你在修改你的代码以前,先git pull一下,把服务器的最新代码拉下来,这是一个好习惯。

所以咱们开发时,有时候早晨来了第一件事情,就是先把代码git pull一下,进行更新。这是个好的开发习惯。避免你写了不少代码,你同事也写了不少代码,而后冲突了,大家俩合并的时候,比较浪费时间。

我如今就实际作一个冲突的demo,演示冲突是怎么发生的,又怎么解决。其实都很好解决。。

我在本身的mac电脑上修改了 FixedThreadPool.java文件,而后 在mac电脑上 操做了 add,commit,push操做,提交到了远程服务器上。

而同时,我在本身的工做电脑上, 也对 FixedThreadPool.java文件 进行了修改。而后我在本身的工做电脑上, 执行了add,commit操做,如今我要提交了,我执行了 push操做,看看会发生什么。

图片名称:git_push_error_because_confilt.png
git_push_error_because_confilt.png-63.2kB

此时再看看对方 termial提示了什么。输出了一大串内容,前面的内容不用关心。
咱们只看最后一段主要内容。

To git@git.oschina.net:yaowen369/ConcurrentDemo.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@git.oschina.net:yaowen369/ConcurrentDemo.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.

翻译其中的主要内容:

! [拒绝]        master -> master (fetch first)
错误:向'git@git.oschina.net:yaowen369/ConcurrentDemo.git'执行 `push`时,发生了某些错误。
提示:更新之因此被拒绝是由于 远程分支包含了你本地没有的内容,这一般是由于 另外一个库推送了一样的文件(ref是索引的意思,能够翻译成文件)。你能够在推送以前先合并这些远程的变化(好比,试试 git pull)。

你能够看看 `git push --help`中的 `Note about fast-forwards`了解更多的细节。

其实在命令行中,help是颇有用的,能够提示不少有用的帮助信息,不过有些termial要求直接 命令后面输入 help就行了,有些要求输入 -help,有些要求输入 --help,或者有些直接输入 -h/--h也行,可是咱们始终要有这个意识,由于太多东西不用记忆,有个大概的印象就好。(计算机常识)

看到这些提示内容,即便你第一次碰到这个问题,你下一步准备怎么作?人家已经给你提示了啊。直接 git pull啊。

Notice:在你输入 git pull时,有时候termial会要求你输入密码,有时候不会,可是 很快的,termial就会彻底的跳转到一个新的页面,这应该是你第一个碰到这种状况。

图片名称:git_pull_confilit_vi.png
git_pull_confilit_vi.png-35kB

这实际上是个vi编辑器,(vimvi的升级版,由于vim颜色高亮作的比较好,看起来更舒服)。
咱们在以前执行 git commit -m "相关提交的log内容"这个命令时, 直接输入 一行提交说明内容,因此没那么复杂,咱们就写一句话 说明一下而已(搞那么复杂干啥子)。可是你若是执行 git commit, 不带-m 而后你直接敲击回车,也会进入这个vi页面。(由于你没使用一行的提交说明模式,系统会觉得你想长篇大论的去写提交信息呢,因此专门给你准备个编译器,你好好写吧,想写多少,就写多少)

说简单点,vi和你的word,notepad,sublime text没啥区别,包括和你电脑上新建个 文本文档,都是一回事, 都只是一个文本编译器, 可是这个 vi的历史可比后面的那几个历史早太多了,上世纪八十年代,电脑图形化界面还没发明呢,当时电脑操做都是黑乎乎的命令行窗口操做(其实如今window,linux也能够直接黑乎乎的termial操做,只是那么多命令,你们都记不住,有了鼠标和图形化界面,黑乎乎的命令行操做都被忘记了,只剩下程序员使用termial了)。word 等更无从谈起,可是你们不少时候也要 编译文本啊,又没有word等,因此vi就是一个当时环境下的 termial环境操做的 文本编译器,彻底 键盘操做,有无数复杂的 快捷键,你使用vi操做,彻底不用接触鼠标,因此操做也比较快(固然是在你比较熟悉快捷键的状况下,不然你就尴尬了)。

咱们这里呢,不讨论vi。vi的操做是另外一个话题。(其实也不是难,而是那么多复杂的快捷键组记忆着比较困难而已)。

咱们能够看看 它上面的内容说了什么。

Please enter a commit message to explain why this merge is necessary, 

Lines starting with '#' will be ignored

翻译内容:

请输入一些提交内容来解释为何此次合并是必须的。
以`#`号开头的行都会被忽略(注释的做用)

其实上面那句Merge branch 'master' of git.oschina.net:yaowen369/ConcurrentDemo,就是它默认帮你生成的 提交信息。
反正你不用管(由于你要搞定这个,这是另外一个学习内容,可是你学习这些彻底不必,虽然也不难。这也是source tree等软件的好处,使用了 source tree等图形化软件,你怎么着也不会碰到vi界面),还记得 怎么退出不?

输入:q, 字符q表明是退出(quit)的意思,不过这个 vi的退出要 一个冒号+q,因此你输入 :q,直接退出就行了。(git有些界面退出也是:q,只是你输入命令操做的时候,git自动帮你前缀一个冒号了,因此给你省事了而已)

你输入 :q,注意左下角。

vi_q.png-60.2kB

vi当中: 开头的都是命令模式,命令模式显示都在左下角。你输入 :q回车后, 左下角出现了这么一行红色的文字。

E37: No write since last change (add ! to override)

你输入:q居然没用,相关区域提示你,由于这个文件你啥都没改动,因此你要加个!号去覆盖(其实就是强制退出模式)。 而后你直接输入 :q!就行了。(直接输入:号就行了,那行红色的提示就消失了,而后你接着输入q!就行了,你试图用键盘上的delte等按键去删除红色文字没用的)

还要讨论vi的相关内容。可是不讨论用户十有八九又会碰到这个问题,当年我第一次碰到vi问题,连怎么退出都搞不定,急的满头大汗。因此不得不讨论。

终于咱们退出了 vi,看看具体提示了什么。。

confilit_after_vi.png-29.1kB

红色方框内的内容不要管,那是由于我第一次在vi中输入命令 时,输错了 :!q,因此vi提示 q命令找不到,我又从新进入输入了 :q!,就ok了。。

咱们看重点内容:

Auto-merging java/src/thread_runnable/FixedThreadPool.java

Merge made by the 'recursive' strategy.
 java/src/thread_runnable/FixedThreadPool.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

注意:Auto-merging自动合并了。也就是说, 由于我刚才测试的冲突比较简单,因此 git自动比较合并了。(好比张三修改了文件的第一行,李四修改了文件的最后一行,这种简单的,git就能自动合并,可是张三李四都修改了 文件的第一行,那就只能手动合并了)。

那么此时你使用git status来查看状态,

$ git status .
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

你的工做区很干净,没啥可commit的,可是 注意上面那句话
Your branch is ahead of 'origin/master' by 2 commits.
你当前的分支领先 远程分支 两次提交。

为啥是两次,由于原本你就commit了一次,而后 git pull时,又自动合并commit一次,因此就两次了。

不用关心几回,看到重点就对了,你当前的分支领先远程分支。
另外,扯了这么大一段,别忘记了最初我们的目的是什么,我们最初的目标就是 推送代码到远程服务器。

因此接下来直接 git push,将 代码直接推送到远程服务器就行了。

此次的冲突由于我制造的比较简单,因此自动合并了,可是有些冲突比较复杂,git没法自动合并,
那么此时就须要你手动合并了。

下面的demo直接借用了网上别人的代码冲突内容 ,我针对输出进行解释。

$ git pull
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

系统提示你,test.txt文件冲突了,自动合并失败了,你须要解决冲突,而后并提交。。

好,我打开test.txt文件,会看到下面的状况。

Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

其中冲突的部分都是用 <<<<<<<=======>>>>>>>来进行标记了,他们都表明了不一样分支(或者远程/本地)不一样的内容,你本身看着代码,把<<<<<<<=======>>>>>>>进行删除,该删除的代码部分也进行删除。

若是是你本身写的代码,你确定知道该删除那些内容,若是不是你写的代码,好比李四写的,那么你要叫着李四讨论,把大家两个的代码合并掉。李四写的代码你又不了解业务逻辑,你不和他讨论, 就瞎合并,这在多人团队中,是大忌。

由于你可能把李四写的代码给覆盖掉。而程序员基本上写完某个文件就再也不关心了,因此李四也不知道你把他的内容覆盖掉了,这确定会引发问题,若是测试人员能发现业务逻辑不对,那还好,最多被测试人员提个代码臭骂一顿,但若是测试不能发现,那等着线上事故吧。

好比上面的那段冲突,咱们合并成以下形式,并进行文件保存。

Creating a new branch is quick and simple.

合并以后,至关于你又从新 修改了文件。
因此在此从新进行提交步骤。。

$ git add readme.txt 
$ git commit -m "老子把冲突合并了"
[master 59bc1cb] 老子把冲突合并了

最后再push就行了。。

到了这里咱们就理解了平时的提交代码,拉取代码的步骤,以及怎么解决冲突。
咱们再来学习一个命令。git log

git log: 查看以前每次提交的说明信息:

git_log.png-78kB

直接看输出应该一目了然了。每次提交的版本号。做者,时间,提交的信息说明 都直接列出来了。我们以前在 git commit -m "说明信息",这里就有用了,不然那么屡次提交,谁也没本事都记住啊。

尤为是你注意最上面那个 说明信息:

commit fb095209cc6adf53a98035cc7661d109a2024de9
Merge: 5b90fa3 c63c40b
Author: yaowen <yw43194@ly.com>
Date:   Sat Sep 9 11:45:40 2017 +0800

    Merge branch 'master' of git.oschina.net:yaowen369/ConcurrentDemo

最上面的是 版本号(就是那一长串奇怪的字符串),git的版本号是一长串字符串,而svn的版本号就是很简单的1,2 ,3, 4阿拉伯数字,简单来说,由于svn你每次提交拉取时,都是直接与中央服务器交互,而git则是先与版本库(暂存区)交互,多人都使用git来提交代码,他们本地的电脑时间都不必定准确,不能使用1, 2, 3,4做为版本号,由于不能简单的依据时间戳来比较。而svn则能够直接使用服务器时间。

此次提交信息,还很贴心的给你提示了,你此次提交实际上是一个 合并冲突操做merge,而且提交的说明信息Merge branch 'master' of git.oschina.net:yaowen369/ConcurrentDemo,就是刚才合并时系统帮咱们生成的。(由于当时咱们在vi界面并无修改默认的提交说明信息啊)。

注意右下角的冒号, 由于我这个项目提交不少次了,因此log说明比较多,一页显示不完,你还记得怎么上下翻页,怎么退出log提示不?(翻页通常用不到,由于咱们通常看提交log也都是看最近的几回说明,不过怎么退出这确定是要知道额)

那么下面咱们要讨论怎么结合github使用。

github

咱们为何要使用github,由于咱们须要一个远程服务器啊。

在本文最初的时候,就说了须要一个远程服务器,咱们上面那么多的操做,都是客服端的操做。都是假设咱们已经搭建好了远程服务器,而在公司里,也已经搭建好了代码服务器,因此咱们平时的代码等都是发布到那里的,可是单独的我的的小项目,你代码托管到哪里呢?固然,你能够用本身的电脑搭建个git服务器,可是这是一个很是复杂的过程。因此咱们就能够托管到github上之类的,这样不就给咱们省了不少事情吗?反正又不要钱,对吧。

github帐号的建立,ssh key的上传本身去google搜索吧,咱们就直接来建立一个项目..

图片名字:github_new_repository.png

github_new_repository.png-65kB

注意那个箭头,点击加号, New repository, 这就是建立一个新项目的意思。

图片名称:github_create_new_repository.png
github_create_new_repository.png-53.3kB

关于这个界面:

  • Repository name: 项目的名字,我此次的项目就叫作 TeachDemo(这个名字后面会说明,和你eclipse的项目名字保持一致最好)。
  • Description (optional),描述(可选),这个不用多介绍了。
  • 咱们只能建立Public,由于 private是要money的。(不过oschina上你能够免费建立私有项目,你能够建立个项目,放你的一些电子书之类的不那么隐私的资料)。
  • Initialize this repository with a README,是否初始化一个 readme文件,是markdown格式的, 建议 勾选吧。
  • Add .gitigonre:这时候再说看不懂这栏啥意思,那就说明以前的文章都白写了。既然你写java代码,那就选择个java的。
  • Add a license:这个不用管。

此时咱们填写和勾选都已经完毕了, 点击蓝色确认按钮吧 Create repository,
此时进入了这个页面。

github_teachDemo_ok.png-60kB
此时该项目建立ok了。。。你会看到项目当中给你初始化了两个文件,.gitignoreREADME.md文件,这都是刚才咱们勾选要求建立的。注意左边的蓝色的 Clone or download按钮,点击会出现下面界面,而后鼠标放在右边那个小图标上,会直接给予提示 Copy to clipboard。(这几个英文要是还看不懂,那让别学编程了)。

github_ok_can_clone.png-21.4kB

也就是说,咱们点击那个 小图标,会把前面的那个 ssh地址。git@github.com:yaowen369/TeachDemo.git复制到剪切板,(这不就是ctrl+c嘛)。

咱们的项目已经建立完毕了,换句话说,咱们已经在远程服务器上建立了这个项目,那么下面咱们的本地就已经能够用了。

在你的电脑上,看你平时喜欢把代码项目放在哪里,就像我平时代码都是放在D盘的某个文件夹,因此我是这样操做的。

termial_git_clone.png-24.7kB

cd /d/code/github_blog/

git clone git@github.com:yaowen369/TeachDemo.git

我先经过cd命令进入了 d盘的code/github_blog/文件夹下,而后我再clone这个代码。

先来解释这两条命令。

  • git clone : 将远程服务器上的项目克隆到新建立的目录中,解释简单点,将你在远程服务器上的项目,第一次拉到本地,供你在本地使用。其实严格来说, 该过程是将 项目代码,从服务器拉到 本地版本库,而后再从 版本库解析到 工做区。不过你关心那么多干吗?记得 这个命令是 你在第一次想拉取某个本地没有的项目时使用就好了。(为何是第一次? 由于你第一次使用 git clone在本地弄好以后,从此再更新服务器上的代码就使用 git pull了。)。
  • 那么如今你理解github那个 标签为何叫作 Clone or download了吧。(若是你想查看github项目,直接下载也行。clone也行)

好的。如今咱们已经将 服务器上的代码,拉到本地了。 可是这个目录不是你eclipse下的项目目录。你又不想重现建立项目,我想将eclipse下的某个项目直接和github的远程服务器发生关联,由于你平时写代码都是用eclipse啊。其实很简单,将我D盘这个文件夹的全部文件,都复制到 你eclipse的某个项目的目录下,就行了。。

图片名称:teach_demo_on_d.png
teach_demo_on_d.png-61.8kB

说简单点,将该目录下的 全部文件 都复制到 你eclipse的项目的代码路径下就ok了。。。
注意如下几点:

某些人的电脑上可能没有打开 显示隐藏文件选项,因此要打开这个,由于你复制过程当中,真正起做用的就是 .git文件夹,最重要的隐藏文件都漏掉了,那你复制还有啥用?

由于咱们在 github上给项目取的名字就叫作 TeachDemo,为了保险起见,咱们建议这个名字和eclipse工程中你的项目名称保持一致。

另外 关于代码路径,建议不要带中文字符,由于有些时候,带中文路径的代码,编译等可能有很奇怪的问题,因此你看个人电脑中代码的文件路径全都是英文的。

咱们已经拷贝完成了,而后你再 利用termial 进入到 你的 eclipse下的项目路径,而后 git status,你看看会发生什么。下面的操做就会了吧。

结束

到了这里,咱们的基础教程都已经讲完了,只要求你记住六个名字,六个英文字符而已。会了以上的内容,对于你一我的开发项目来讲,基本上 已经能应付95%的需求了。更进一步的内容,你能够去廖雪峰的博客上学习。他写的比较通俗易懂,而且涵盖了平时团队多人开发所使用的全部基本操做了。

有如下几点想说:

  • 整篇文章,就是在讲述 status,add,commit,push,pull,外加一个cd,记住这六个命令,六个单词就够了,
  • 更重要的是,这几个命令,借助 git status,tab键自动补全/提示功能,下一步该作什么很简单啊,有些东西掌握了方法剩下的学习成本很低的。
  • 包括什么学习java,学习python,你会了其中任何一门,剩下的掌握其余的,都很容易。 你学习java,那么多的api方法你怎么记得住? 因此要知道查询API文档的重要性,只要有个大概印象,而后知道怎么搜索,能上google,百度这就够了了,不然那么多东西谁能记得住呢?
  • 固然, 无论是git,仍是java,或者任何一个领域学科。你要想深刻的去理解学习,那真的很难,要想精通,那对于咱们这种人来讲基本是不可能的,git的命令多如牛毛,你要想成为git的专家级人才,那学习过程,难的使人发指,可是问题是,对于咱们平时使用来讲,就那几个命令就够了啊,你要想成为该领域的专家那就是 另一回事了。
  • 另外,英语水平不要太差,不过我想大学出来的,再加上各类翻译软件,google,百度,这也不是个什么难的问题。

做者: www.yaoxiaowen.com

博客地址: www.cnblogs.com/yaoxiaowen/

github: https://github.com/yaowen369

欢迎对于本人的博客内容批评指点,若是问题,可评论或邮件(yaowen369@gmail.com)联系

欢迎转载,转载请注明出处.谢谢

相关文章
相关标签/搜索