写给小白的git教程 | OkyCode 

JerryXia 发表于 , 阅读 (0)

这是一个故事

众所周知,Linux 创建于1991年,其内核开源项目有着为数众广的参与者,这么多人在世界各地为 Linux 编写代码,那 Linux 的代码是如何管理的呢?

事实上,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给 Linus Torvalds( Linux 之父 ),然后由 Linus Torvalds 本人通过手工方式合并代码!

你会想象这是多么糟糕的一个情景,那么 Linus Torvalds 为什么不把 Linux 代码放到版本控制系统里呢?不是有 CVS、SVN 这些免费的版本控制系统吗?因为 Linus Torvalds 坚定地反对 CVS 和 SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比 CVS、SVN 好用,但那是付费的,和Linux的开源精神不符,Free,自由!

到了2002年,伴随着 Linux 代码库不断壮大,让 Linus Torvalds 很难继续通过手工方式管理了,于是 Linus Torvalds 不得不选择一款版本控制系统来管理 Linux,而 BitMover 的版本控制软件 BitKeeper 无疑是当时最好的选择,但 BitKeeper 是除商业付费版仅提供可免费使用但不允许修改释出的精简版本,这引起开社区群的不满,如自由软件之父 Richard Stallman 也严厉批评 Linus Torvalds 使用非自由软件开发 Linux核心。BitKeeper 的启用确实大大提高了不少 Linux 开发的效率。

生活总是充满意外,生活中总会有那么几个不按套路出牌的人。

在2005年,Samba 文件服务器开发人 Andrew Tridgell 写了个链接 BitKeeper 存储库的简单程式,呗 BitMover 创办人 Larry McVoy 指控对 BitKeeper 进行逆向工程,因此决定停止 BitKeeper 对 Linux 的支援,顿时 Linux 核心开发受到严峻挑战。

按理说,手下小弟犯错了,老大站出来向 BitMover 公司公开道个歉,并保证以后严格管教下面兄弟们。呃,好像这是不可能的。

Linus Torvalds 秉持「自己的版控自己写」,并基于使用 BitKcheper 时的经验教训,狂撸了三天三夜,隔周却如变戏法般的带着 Git 出现,这就是 Git!

历史就是这么偶然,同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代

他们对新的系统制订了若干目标:

  • 速度

  • 简单的设计

  • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)

  • 完全分布式

  • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

在Mac OS X上安装Git

最简单的方法是 AppStore 下载安装 Xcode,大家都知道 Xcode 是 Mac 和 IOS 的 IDE,它集成了一些好用的工具,包括 Git。安装好后,打开终端

1
$ git version

这时你会看到git的版本信息,说明你可以开始使用git了

1
git version 2.7.4 (Apple Git-66)

使用前配置,用户配置

配置用户信息,每次git提交时都会引用这两条信息,说明是谁提交的。

1
2
$ git config --global user.name "your_name"
$ git config --global user.email "your_email@example.com"

使用 --global 是指全局的,配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

更改局部配置

如果你想要在某个特定的项目中使用其他名字或者电邮,而又配置了 --global 配置,你可以这样,定位到当前目录,值得注意的是这个目录必须已经是git仓库,否则会报 fatal: not in a git directory错误,下面我们会讲如何创建一个git仓库。

1
$ git config user.name "new_name"

查看配置信息

1
$ git config --list

如何创建一个git仓库

首先,选择一个合适的地方,创建一个空目录:

1
2
3
4
$ mkdir mygit
$ cd mygit
$ git init
Initialized empty Git repository in /Users/Documents/mygit/.git/

这里的 mygit 就是我们创建的git仓库了,对,就是这么简单!.git/目录就是Git用来跟踪管理版本库的,细心的你会发现,mygit 目录文件下并没有看到 .git啊,那是因为这是个隐藏目录。这里我教大家两个实用的命令 :pwd 用于显示当前目录; ls -a 查看目录下所有文件,这里包含隐藏目录。

添加文件到版本库

上面我们建了一个空的git仓库,现在我们要添加一个文件到我们仓库,首先创建一个 myfile.txt 的文件,使用 git add myfile.txt 添加文件到仓库,此命令可以执行多次添加多个文件,也可以使用 git add .添加所有文件到仓库,然后使用 git commit -m "desc"提交到仓库,-m 添加修改描述。

1
2
$ git add myfile
$ git commit -m "desc"

查看版本库状态

用于查看仓库文件状态,哪些新添加,哪些删除的,哪些是修改的。

1
$ git status

查看修改

用于查看文件做了哪些修改。

1
$ git diff myfile

查看历史纪录

用于查看我们历史提交纪录。

1
2
3
4
5
6
7
8
9
10
11
12
$ git log
commit 7cb5f767328802ac97876f96acf947dcb506cc4e
Author: okycode <your_email@example.com>
Date: Tue Jun 14 18:24:32 2016 +0800

我是这次修改的描述

commit 62b22f52ddfce5851e04689f0c6a62fafe487c9a
Author: okycode <your_email@example.com>
Date: Tue Jun 14 17:34:50 2016 +0800

我是这次修改的描述

这里的 7cb5f7...06cc4e是我门的 commit id(版本号)。如果嫌输出信息太乱,看着比较乱,有没有简洁输出的方法,不妨添加 --pretty=oneline参数试试看呢。

1
2
3
$ git log --pretty=oneline
7cb5f767328802ac97876f96acf947dcb506cc4e 我是这次修改的描述
62b22f52ddfce5851e04689f0c6a62fafe487c9a 我是这次修改的描述

版本回退

不好,我们不小心提交了一个修改错误文件,怎么办,有没有方法让我们撤回上个版本呢,当然有了,那不岂不是很low。

1
$ git reset --hard 7cb5f76...b506cc4e

现在,你回退到了某个版本,电脑也关机了,第二天早上就后悔了,想恢复到新版本怎么办?但又找不到新版本的 commit id 了怎么办?

在Git中,总是有后悔药可以吃的,Git提供了一个命令 git reflog 用来记录你的每一次命令:

1
2
3
4
$ git reflog
62b22f5 HEAD@{0}: reset: moving to HEAD^
7cb5f76 HEAD@{1}: commit: 我是这次修改的描述
62b22f5 HEAD@{2}: commit (initial): 我是这次修改的描述

如果你只是想回到上个版本,你可以命令 git reset --hard HEAD^即可,在Git中,用 HEAD 表示当前版本。上上一个版本就是 HEAD^^,往上100个版本总不能写100个 ^ 吧,当然那样也不是不可以,不过我一般会写成 HEAD~100 这样。

撤销修改

使用命令 git checkout -- myfile,可以把 myfile文件在工作区的修改全部撤销,这里注意 -- 的使用是和 myfile文件件有空格的。如果此时文件已经 addcommit 暂缓区,那么撤销状态为放入暂缓区的状态,如果你想撤销到放入暂缓区之前的状态,你可以结合 版本回退 然后再去撤销。

远程仓库

说到远程仓库首先我们会想到 Github,这是一个神奇的网站,它提供了Git仓库托管服务的,你只需要注册一个自己的账号就可以使用了。不过在创建 Github 免费远程仓库之前我们要做一些准备工作:

具体配置详见 官方帮助文档

在GitHub上创建一个空的 mygit 仓库,如下图
Alt Image Text

推送一个存在的本地仓库到远程仓库

1
2
git remote add origin git@github.com:utouch/mygit.git
git push -u origin master

出现 SSH警告

当你第一次使用 Gitclone 或者 push 命令连接GitHub时,会得到一个警告:

1
2
3
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

1
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

出现 remote origin already exists 错误提示

1
2
$ git remote rm origin
$ git remote add origin git@github.com:*

从远程库克隆

1
$ git clone git@github.com:utouch/mygit.git

创建分支

1
$ git branch mybranch

切换当前分支

1
$ git checkout mybranch

创建并切换分支

1
$ git checkout -b mybranch

查看分支,* 标记为当前分支

1
$ git branch

查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话)

1
$ git branch -a

推送分支到远程仓库,origin为远程仓库,mybranch为本地分支

1
$ git push origin mybranch

删除本地分支

1
$ git branch -D mybranch

删除远程分支

1
$ git push origin --delete mybranch

也可以使用这种语法,推送一个空分支到远程分支,相当于删除远程分支

1
$ git push origin :mybranch

重命名本地分支

1
$ git branch -m mybranch develop

合并分支,把分支mybranch合并到master

1
2
$ git checkout master
$ git merge master mybranch

提交修改到远程仓库

1
$ git push origin mybranch

参考

Git参考手册:http://gitref.org/zh/index.html
大谈Git开发:http://www.ithome.com.tw/news/95088
Pro Git(中文版):http://git.oschina.net/progit/
git官网 :https://git-scm.com/downloads
官网文档 :https://git-scm.com/docs

如果觉得我的文章对您有用,请扫面关注下方微信公众号,以了解文章最新动态!

Alt Image Text