给新手的github教程

我写东西废话向来很多,这次不扯东扯西,争取20分钟之内进入正题。

Just kidding.

今天来介绍一下Git和Github。本文必将有不少奇怪和模糊(但足够初学者大致理解)的比喻以及极度口语化的文字,请慎重阅读。

Git & Github:

Git是一个版本控制软件。你在写代码的时候想要测试一个新功能,却并不想在已经稳定的版本上做实验(万一删删改改出了问题,想要恢复到之上个版本怎么办?),这时就需要版本控制,将当前的代码保护起来,另起炉灶;如果测试结果不满意,把不稳定的炉灶全部推倒,还能滚回之前好用的版本。
你用git控制的文件和这些文件的修改记录都是保存在本地的,为了多人协作/不把鸡蛋放在一个篮子里,某位古神(应该是Linus)创建了网站github。你可以用git在本地控制每个文件,记录每一次增删,然后把这些文件连同所有的修改记录推送到github上。

好的,跟我重复重点:
Git是本地的版本控制软件,可以跟踪文件的所有修改记录;
Github是修改记录和文件的在线保存地。

Github和多人协作:

张三等人一起用github开发一个软件,他们认为该软件主要有3个功能。
张三写好了功能1,测试稳定了;
李四在张三的基础上写好了功能2,测试稳定了;
王五觉得自己能写出更高效的功能2,就从张三的版本上另起炉灶,写了功能2',测试稳定了,三人讨论后决定采用2'版本,于是王五把自己的功能2'推送回了主程序,成为主程序的一部分;
张三和李四也一起写好了功能3,和王五同步完成工作;

bad bad example, just for reference.

最简单的git指令以及工作流程

定义

  1. zelda.txt是我需要版本控制的文件
  2. 我的项目名称叫mario
    往下看之前确认你知道cd是什么意思。
    另外强烈建议边看教程边动手做一遍。

1. 创建repository

为了版本控制任何文件,你首先要创建一个修改记录储藏中心,又叫做repository。
这个中心可以

  1. 从无到有生成(如果你在写一个全新的项目)

或者

  1. 从别人已有的储藏中心拷贝一份过来(如果你想接着别人的进度继续写)

对于1,你又有两种方法
a. cd到任意一个文件夹里,比如说~/Desktop/,用git init mario来创建新的repository。这步之后你会在桌面上看到一个叫做mario的文件夹,点进去,把你的zelda.txt文件拷贝进去,之后就可以在mario这个repository之中开始版本控制啦。
b. 到github官网,点击一个绿色的按键(new repository),在新页面中给新repository起名叫mario,确定;然后他会在新页面中有一个地方让你复制链接(非常类似于https://github.com/chenxi-ge/mario.git的一个链接);复制,cd到任意一个文件夹里,用git clone 刚才的链接来把在线创建的repository联动到本地。

对于2,直接用git clone 别人的repository就可以了。

好的,重复重点:
本地生成,git init folder_name
在线拷贝下来(不管是自己的还是别人的),git clone repo_url

插一句,Github是可以免费使用的。但免费使用的代价是,你也要保持所有的代码开源:任何人都可以查看你的代码,你也可以下载别人的代码,程序员们在互相学习中成长。开源是我非常钦佩和坚持的精神——不然写啥教程啊。
当然对于企业用户,每人每月7刀,可以创建私人repository用于公司项目,也挺好。

2. 管理文件

那么现在你有一个文件夹,叫mario,在本地;这个文件夹里有一个幽灵(.git)在监视着所有你让他监视的文件;还有一个你刚刚拷贝进去的zelda.txt。
现在这个zelda.txt是没有被监视的,幽灵也是有拖延症的,不会主动帮你干活的。
何以见得?用git status查看当前管理进度。
git status之后,你会看到zelda.py是在'Untracked Files'里面的,并且是红色的。于是我们使用git add zelda.txt ,告诉git开始监视zelda.txt的每一行增删(把这个文件add到监视列表里)。
增加之后再用git status,会发现文件进入了'Changes to be committed'的列表里,并且名字前面显示'new file'。
那么我们来谈谈commit。什么叫commit呢?就是告诉git:在这儿存个档,记录一下当前文件和上一次commit的差异。这样追根溯源,之后就能恢复每个文件每个版本。
我习惯在add新文件之后进行一次commit。
git commit -a -m 备注内容是commit的常用方法,这里-a 是要求“记录所有修改”,-m是提示后面紧跟着备注,而备注内容当然是人类能看懂的语言,不好好写吊起来打。
在commit之后,再再再git status一下,发现所有的改动都已提交,无比清爽。

我猜这儿正经教程要开始讲什么叫stage,不然没法讲清git commit -a-a是什么。然而这种会搞乱新手的东西我也不能说完全能讲清,想了解的请自己去看官方文档。

这时我们手贱去改动一下zelda.txt的内容,然后git status,会发现zelda.txt又变成了modified,并且是红色状态。很好,如果改动是你需要的,就commit;如果是commit之后发现不需要的(比如十几个commit后发现性能反而降低了),之后会讲如何回滚。
在commit之前,如果你想了解一下你的改动,用git diff可以做到这一点。但绿色代表什么,加减号又代表什么,请查阅文档。

好的重复重点,
git add 跟踪文件
git status 查看当前跟踪进度
git commit 存档一下

3. 版本控制

最后光速讲一下log, resetpush然后我就去睡觉。
首先,之前吹了半天版本控制,到底怎么才能回滚到之前的一个稳定可用版本呢?

首先是查看记录,用git log可以查看到历史上所有的commit编号、commit的提交者和提交时间,还有当时的备注。假设你在有一个稳定可用版本时commit了一下,这条commit记录会留在log上。

然后是回滚版本,用git reset --hard log编号。所谓log编号是用git log查看时在每个commit最顶端的一串30个字母左右的乱码,在reset的时候只要输入前六位就可以回滚版本。执行完git reset指令后,再次查看zelda.txt就会发现回到了那条特定的commit时的样子。
git reset log编号和有--hard的版本不一样,前者是回滚所有commit但不修改本地文件,后者是回滚所有commit并且修改本地文件。新手不必在意

最后就是git push。之前所有的版本控制都是在本地的,如果想把本地的所有修改都推送到github上存储怎么办呢?git push origin master,认准这一条。其中git push很显然是推送,origin master是说推送目标是主分支,对于没有开其他分支的你——你要能读到这儿,肯定是还没用到啦——也是唯一选择。
git push的频率当然可以自己定,我习惯是每写好一个功能/最多15分钟commit一下,而每写完一个项目(比如说一次作业),如果是连续的几个小时写完就最后push一次,否则今天的份额写完了就push。

PS,如果忘记在写完项目之后做git push,这个project就拿零分了。

重点?
git log 查看所有commit
git reset 回滚版本
git push 推送修改到Github——在线的数据中心

4. 坑

说了是坑嘛,肯定不会填的。
这个教程最主要是面向新手,展示一个文件跟踪的流程,用到的都是最基本的几个指令:git init, git clone, git add, git commit, git log, git push, git reset,让人能跟踪一个文件,不断记录修改,可以方便回滚,也可以提交到github,这些足够啦。
度过了最开始的confusion,任何一个官方文档不比我说的严谨标准一万倍么。

所以这一块主要是说一下还有哪些没说到的,留给读者自行探索吧。

  1. git merge, git fetch, git branch分支控制
  2. git stash 暂存修改
  3. git pull 下载别人的修改
安得repository千万间,大庇天下丢失重要文件之人俱欢颜。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,638评论 4 54
  • 第一章 安装Git工具 下载GitHub for Windows,直接点击安装,安装完成后,可以看到“Git Sh...
    不圆的石头阅读 11,832评论 5 63
  • Hi,你现在还能找到自我吗?或者是你曾经迷失过吗?不管你有没有这样的困惑,请听我为你讲一个故事吧,或许听完这个...
    竹林逍遥阅读 307评论 2 1
  • 昨天死活打不开简书,现在打开了已经不太记得昨天要写什么。 早上起床的时候距闹铃设定的时间已经过了一小时,泡咖啡比平...
    Lebkuchen阅读 200评论 0 1
  • 感觉好久没去上班,好久没晚上在地铁更新简书。那为什么今天又在地铁更新呢?因为,又开始工作了。 简单回顾下最近找工作...
    闻舒阅读 262评论 0 1