最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
要使用Git,第一步当然是安装Git了。根据你当前使用的平台来阅读下面的文字:
在Linux上安装Git
首先,你可以试着输入git
,看看系统有没有安装Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。
如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git
就可以直接完成Git的安装,非常简单。
像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。
如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git
就可以直接完成Git的安装,非常简单。
老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core
,因为以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core
了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuit
,git-core
正式改为git
。
如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config
,make
,sudo make install
这几个命令安装就好了。
在Mac OS X上安装Git
如果你正在使用Mac做开发,有两种安装Git的方法。
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOS App的必选装备,而且是免费的!
在Windows上安装Git
实话实说,Windows是最烂的开发平台,如果不是开发Windows游戏或者在IE里调试页面,一般不推荐用Windows。不过,既然已经上了微软的贼船,也是有办法安装Git的。
Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。Cygwin的安装和配置都比较复杂,就不建议你折腾了。不过,有高人已经把模拟环境和Git都打包好了,名叫msysgit,只需要下载一个单独的exe安装程序,其他什么也不用装,绝对好用。
msysgit是Windows版的Git,从https://git-for-windows.github.io下载(网速慢的同学请移步国内镜像),然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git - 简明指南
创建新仓库
创建新文件夹,打开,然后执行 git init
以创建新的 git 仓库。
检出仓库
执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository
如果是远端服务器上的仓库,你的命令会是这个样子:git clone username@host:/path/to/repository
工作流
你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录
,它持有实际文件;第二个是 暂存区(Index)
,它像个缓存区域,临时保存你的改动;最后是 HEAD
,它指向你最后一次提交的结果。
添加和提交
你可以提出更改(把它们添加到暂存区),使用如下命令:git add <filename>
git add *
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:git commit -m "代码提交信息"
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。
推送改动
你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:git push origin master
可以把 master 换成你想要推送的任何分支。
如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:git remote add origin <server>
如此你就能够将你的改动推送到所添加的服务器上去了。
分支
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
创建一个叫做“feature_x”的分支,并切换过去:git checkout -b feature_x
切换回主分支:git checkout master
再把新建的分支删掉:git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:git push origin <branch>
更新与合并
要更新你的本地仓库至最新改动,执行:git pull
以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。
要合并其他分支到你的当前分支(例如 master),执行:git merge <branch>
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:git add <filename>
在合并改动之前,你可以使用如下命令预览差异:git diff <source_branch> <target_branch>
标签
为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 1.0.0 的标签:git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:git log
你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。
log
如果你想了解本地仓库的历史记录,最简单的命令就是使用: git log
你可以添加一些参数来修改他的输出,从而得到自己想要的结果。 只看某一个人的提交记录:git log --author=bob
一个压缩后的每一条提交记录只占一行的输出:git log --pretty=oneline
或者你想通过 ASCII 艺术的树形结构来展示所有的分支, 每个分支都标示了他的名字和标签: git log --graph --oneline --decorate --all
看看哪些文件改变了: git log --name-status
这些只是你可以使用的参数中很小的一部分。更多的信息,参考:git log --help
替换本地改动
假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:git fetch origin
git reset --hard origin/master
实用小贴士
内建的图形化 git:gitk
彩色的 git 输出:git config color.ui true
显示历史记录时,每个提交的信息只显示一行:git config format.pretty oneline
交互式添加文件到暂存区:git add -i
如何高效利用GitHub
正是Github,让社会化编程成为现实。本文尝试谈谈GitHub的文化、技巧与影响。
- Q1:GitHub是什么
- Q2:GitHub风格
- Q3: 在GitHub,如何跟牛人学习
- Q4: 享受纯粹的写作与演讲
- Q5: 代码帮你找工作
- Q6: GitHub还在影响一些什么
- Q7: 除了GitHub,还可以选择什么?
Q1:GitHub是什么
A1:一家公司
位于旧金山,由Chris Wanstrath, PJ Hyett 与Tom Preston-Werner三位开发者在2008年4月创办。迄今拥有59名全职员工,主要提供基于git的版本托管服务。
在此之前,它是由Tom与Chris 在本地程序员聚会中,开始的一个用于托管git的项目。正如每个伟大的传奇都开始于一场冒险,Tom在这篇文章我如何辞掉微软30万年薪邀约,创办GitHub中谈到:
当我老去,回顾一生,我想说,“哇,那是一场冒险“;而不是,“哇,我真的很安稳。“
另一位创始人Chris也详细描述了GitHub初创的前因后果,他说道:
Do whatever you want.
于是,在2008年4月10号这一天,GitHub正式成立。
Q2:GitHub风格
A2: GitHub只是GitHub
强调敏捷开发与快速原型,而又的确成功的创业团队,常具备一个重要气质:有自己的文化风格。如GitHub,又如37signals。通过他们的快速开发,向用户证明了团队在技术上的能力,并且时常有惊喜。同时,通过强调特立独行的文化,将对半衰期过短的产品族群的信任转为对GitHub团队的信任。
Gravatars的创始人(对,就是互联网最流行的头像托管系统)、Jekyll(对,它就是我近几年用的博客系统)作者、GitHub创始人,现任CTO Tom在GitHub第一年学到的10大教训、创业学校演讲中谈到GitHub文化的方方面面。我尝试将这种风格总结为以下要点:
- 专注创作,高创意
- 运营良好与较高的内外满意度
- 高利润,较低的融资额或零融资
创业公司多半死在钱上,就让我们先从钱谈起:
高利润,较低的融资额或者零融资
类似于GitHub这样的公司,拿到风险投资很难吗?恰恰相反,创始人PJ Hyett在Hacker News的一篇评论中提到,自从GitHub创办以来,已与几十个VC沟通过。但是,直到今天,GitHub的融资额还是为零,并引以为豪。让我们看看GitHub官网的自我介绍:
运营良好与较高的内外满意度
在Quora上有人问道,GitHub是否寻找被收购?,还是PJ Hyett ,他的回答是:No。
GitHub从一开始就运营良好,员工拥有较高满意度,看看这些不太一样的做法:
- 每一位GitHub公司的新员工,官方博客将发表文章欢迎。
- 在GitHub内部,没有经理,需求内容与优先级由项目组自行决策。
- 选择自己的工作时间、工作地点。
- 员工来自开源社区。
- 能开源的尽可能开源。
富有激情、创意的员工使得GitHub得到了社区的广泛认同,从而拥有极高的客户满意度,并从创业一开始就盈利。一份早期的调查表明,GitHub很快成为Git托管首选。
专注创作,高创意
GitHub59名全职员工仅有29名员工在本地工作!不仅仅是工作地点的安排富有创意,GitHub员工Holman, 详细介绍了GitHub的工作方式:
Q3:在GitHub,如何跟牛人学习
A3:在学习区刻意练习
追随牛人,与他们一起修行
修行之道:
关注大师的言行,
跟随大师的举动,
和大师一并修行,
领会大师的意境,
成为真正的大师。
正如这首禅诗所言,与其在墙内仰望牛人,不如直接在GitHub:
- watch、fork牛人们
- 对他们的项目提交pull request
- 主动给牛人们的项目写wiki或提交测试用例,或者问题
- 还可以帮他们翻译中文
GitHub本身建构在git之上,git成为勾搭大师们的必要工具,以下读物成为首选:
如果希望进一步深入,可以阅读已有中文翻译版的材料:
同样,如果希望了解更多GitHub自身的知识,GitHub官方文档值得推荐:
牛人在哪里?
-
GitHub官方推荐:GitHub自身的官方博客与GitHub员工们的个人博客推荐的项目与开发者
-
各类社交媒体上提到的的GitHub库:尤其是Hacker News上提到的GitHub库。
关于学习的心理学研究,常常会谈到一个术语:元认知、元学习、元知识。是的,关于认知的认知、关于学习的学习、关于知识的知识,你对这些信息的偏好与熟练掌握,会让你在学习一门新东西时更加轻车熟路。对一手信息进行回溯,比如作者、创始人、最初文献出处,总是会让你更容易理解知识。
在学习区刻意练习:借助GitStats进行项目统计
在如何学习一门新的编程语言?——在学习区刻意练习中,我已谈过:
学习编程最好的方式是在学习区刻意练习。
如何进行自我监督?
借助于GitStats,我们能很好地统计自己的每个项目的工作量,从而看到工作进展。
用法如下,
#复制GitStats项目到本地
cd ~/dev
git clone git://github.com/trybeee/GitStats.git
python ~/dev/gitstats/git-stats /youproject public
如果Fork别人的项目或者多人合作项目,最好每人都拥有一个独立分支,然后由项目维护人合并。如何建立自己的分支?
# 分支的创建和合并
# git branch yourbranch
# git checkout yourbranch 切换到yourbranch
# 开发yourbranch分支,然后开发之后与master分支合并
# git checkout master
# git merge yourbranch
# git branch -d yourbranch 合并完后删除本地分支
如何将牛人的远程分支更新到自己的本地分支?
# 查看当前项目下远程
# git remote
# 增加新的分支链接,例如
git remote add niuren giturl…
# 获取牛人的远程更新
git fetch niuren
# 将牛人的远程更新合并到本地分支
git merge niuren/master
生产力小技巧
codeshelver:给git库做标签
观察的项目如果多了,怎么管理?用codeshelver,安装扩展之后,可以对GitHub项目做标签。
gollum:利用git与github做wiki
gollum是一个基于git的轻型wiki系统。
GitHubwatcher: 监测重点项目
GitHubwatcher适用于通知不频繁的情景。
GitHub官方资源
GitHub官方列出了一些有用的脚本与书签。
社区驱动的安装与配置文件
GitHub中各类配置文件层出不穷,一些常用的:
- osh-my-zsh:将终端从bash改为zsh之后,可考虑安装社区驱动的zsh配置文件,含有多个插件。可参考旧文zsh与oh-my-zsh
- gitignore:GitHub官方出品
- yourchili:服务器各类安装shell,比如安装nginx等。
Q4: 享受纯粹的写作与演讲
A4:回归创作的初始
写作
早在2008年,就有技术图书作者通过Git来写作,以下是示范:
你能想到的技术前沿话题,大多能在GitHub找到相应的培训材料或者开源图书。
暖色调的灯光,足够宽度的工作台,听着清脆的键盘声音,基于Git、GitHub、Markdown与Jekyll来写作,不担心写废与排版,只关注最纯粹的写作,是一种享受。我有时候会想,如果Git、Github、Markdown、Jekyll,再加上Yaml、Json的作者,让这些作者们重新来设计今天互联网基础架构偏文本的部分,会诞生一些什么?
个人博客
借助于Jekyllbootstrap,可以在Github上快速搭建一个基于jekyll的博客系统。
除了这个简单易行的办法之外,还存在一些其他方法,例如:
- Jekyll:参考告别wordpress,拥抱jekyll
- Octopress:参考Ruby开源项目介绍(1):octopress——像黑客一样写博客
- GitHub Pages:参考GitHub Pages
演讲
借助于GitHub,可以享受更纯粹、更酷的演讲。GitHub 2011年收购Ordered List之后,从此可以通过speakerdeck更好的分享ppt文档。
我们还可以:
- 使用GitHub著名传教士、Progit作者Scott Chacon开发的showoff
- 来自开源社区的其他演讲库impress.js
Q5: 代码帮你找工作
A5:GitHub简历很诚实
NumEricR(非GitHub工作人员)基于GitHub Pages功能做了一个简历生成器,使用极其简单,登陆网站GitHub简历生成器,填入你的GitHub网站用户名即可。
fredwu是Ruby中文社区活跃份子,他的开源项目angel_nest,一个天使投资与创业者对接的网站,适合Ruby初学者升级为Ruby中级开发者时学习,也在Hacker News上被热烈讨论过,让我们来看看他的简历:
http://resume.GitHub.com/?fredwu
正是因为GitHub上的代码无法造假,也容易通过你关注的项目来了解知识面的宽度与深度。现在越来越多知名公司活跃在GitHub,发布开源库并招募各类人才,例如:Facebook、Twitter、Yahoo …
开始有了第三方网站提供基于GitHub的人才招聘服务,例如:
- GitHire:通过它,可以找出你所在地区的程序员。
- Gitalytics.com:通过它,能评估某位程序员在GitHub、LinkedIn、StackOverflow、hackernews等多个网站的影响力。
Q6: GitHub还在影响一些什么
A6:让计算机增强人类智慧
很多年前,在某个名声显赫的学府中,两位先后拿过图灵奖的牛人有一段对话:
- 牛人A:我们要给机器赋予智慧,让他们有自我意识!
- 牛人B:你要给机器做那么多好事?那你打算给人类做点什么呢?
这段对话来自《失控》。牛人A是明斯基,他最喜欢将人类看做有血肉的机器,他的框架理论成为认知心理学、人工智能入门基础。牛人B则是恩格尔巴特。当明斯基1961年发表他著名的文章人工智能走向时,恩格尔巴特还籍籍无名。直到次年,恩格尔巴特发表宏文:人类智力的增强:一种概念框架。提出不同于明斯基的另一条增强人类智力的道路:不要尝试发明自动打字的机器,而是尝试发明鼠标,并且他真的发明鼠标成功了!
从近些年的发展来看,仍然是明斯基占上风,但是,三十年河东,三十年河西,明斯基的人工智能方向又有多少年没有大突破了?相反,来自恩格尔巴特的群件、集体智慧等思想,逐步成为步入Web2.0时代之后的共识。无关对错,可以说,恩格尔巴特为增强人类智力,提供了可行的框架。与其去发明聪明的、昂贵的、功能一体化的智能机器人,还不如发明类似于鼠标这样笨笨的、廉价的、功能单一的人类智慧服务单件。明斯基的机器人很容易陷入死胡同,没有上升到哲学的高度。现在慢慢又回到恩格尔巴特这个方向来了。比如现在IBM开始宣传的认知计算。
从git与GitHub设计与解决的问题本质来看,明显加速了代码生产流程,促进了卓越智力产品的诞生。这就是一种典型的web2.0对智力生产流程的改良与人类智慧的增强。同样,某种意义上,小说写作网站也起到类似作用。但是,学术界尤其是社会科学类的智力产品生产似乎还停留在一个古老阶段。在开源领域,好想法层出不穷,极客影响极客,最终产生的是酷玩意。这些酷玩意抛弃浮华,直奔问题本质。那么,有没有科学界的GitHub??
类似问题层出不穷,以下为其他领域产品不完全名单。
学术研究
数据
- buzzdata:数据分享更容易
科学计算
- opani:雏形中,支持R、Python等多种。
教育
Q7:除了GitHub,还可以选择什么?
A7:nil
因为进化的需要,多数裸猿存在选择强迫症:哪种程序语言更好?哪个web开发框架更好?当然,最令宅男技术男们羡慕的问题是,高白瘦御姐还是青春小萝莉好?:D
除了GitHub之外,
- 中国山寨品是不是更好?(为什么不写他们名字,你懂的,山寨品总是善于争论谁是第一个山寨的,各自的排名先后:D)
- 免费的BitBucket是不是更适合Python程序员?
- 作为一名折腾族,我不自己搭建一个gitlabhq,是不是对不起自己?
我们可以理解,正是因为无数条分岔路口,让人类不再受制于某种基因、特定疾病、独裁家族,从而拥有无限的可能。但是,这种选择强迫症与远古时代可怜的信息量相比较,
- 今天这个大数据时代,它还会有助于人类作为族群的整体进化与作为个体的幸福吗?
- 今天一位一线城市30岁大学毕业生经历的选择与孔子整个一生经历的选择,纯论数量,谁多谁少?
生命如此短暂,为什么总要将青春浪费在不断的选择之中呢?罚你,回头阅读心理学家施瓦茨(Barry Schwartz)的TED演讲:选择之困惑——为何多即是少,1百遍啊1百遍。请记住施瓦茨的演讲要点:
- 更多的选择不代表更多的自由;
- 更多的选择导致决策的延迟和降低的满意感;
- 快乐之秘诀,在于降低自己的期望值。