日常生活记录

Git与GitHub入门教程

Git与GitHub

  • Git是Linus Torvalds为解决Linux Kernel社区大规模协同开发而创建的分布式版本管理系统。服务器端需要提供Git服务,而客户端需要安装对应的Git客户端。如果您对FTP等采用Client-Server模型的软件有所了解,您应该明白我的意思。
  • GitHub是GitHub公司的产品(刚被微软收购),主要是一个网站,用来提供Git服务。GitHub不仅提供了Git服务器让任何人都能把代码保存(术语:托管)到它的网站上去,还提供了一系列完善的代码相关服务,让开发者用得很舒心。
    因此,Git和GitHub是完全不同的概念,请不要混淆,也不可乱用。

本文假定:

  1. 您具备软件开发基础。不然您根本不用上Git ╮(╯▽╰)╭
  2. 您具备给自己的电脑(Mac/Linux/Unix/Windows)安装软件的能力。不然请您退出IT界,Thanks♪(・ω・)ノ
  3. 您具备使用命令行工具的能力。
  4. 您具备足够的耐心和细心,能够逐字逐句看完本文,能够自行察觉出拼写错误。
  5. 遇到问题多Google,实在不行您还可以Baidu啊,Bing啊,DuckDuckGo啊~~~

准备工作

工欲善其事必先利其器,请您先完成以下准备工作:

  1. 注册一个GitHub账户
  2. 安装git客户端。Mac OS X自带,Linux发行版请sudo apt install git或者yum install git
  3. 用你最熟悉的语言和IDE,写一段最简单的Hello, World!代码

Hello, World!

git与特定的编程语言和IDE无关,但我总要有个东西能够给大家演示。
本文用Xcode+Swift为例,您只需要用您最熟悉的语言和IDE照着做即可。
Xcode已经高度集成了git服务,为了教学方便,请在创建项目时,取消勾选自动创建Git仓库的选项。
jietu20180716-035717
创建项目以后,Xcode已经为我们准备了一段Hello, World!,跑一下看看
jietu20180716-040244
到这里,我们就完成了所有的准备工作,下面开始进入正题

在GitHub上创建一个空的Git仓库

在GitHub首页,创建一个仓库,名字就叫HelloWorld。
jietu20180716-033917-2x

  • Public意味着这个仓库的代码全世界都可以看到
  • Private私有仓库则是要收费的。如果您今后有私有仓库的需求,除了付费购买GitHub服务,还可以考虑自己搭建GitLab服务器
  • 请暂时不要初始化README文件,也不要添加.gitignore文件和License许可证。不然它就不是一个空的仓库了。
    jietu20180716-034058-2x
    创建好空的Git仓库以后,你就会看到这个详细的提示内容。之后的学习中,你会读懂每一行命令的,请不用担心。
    jietu20180716-052915-2x

git init

打开Terminal,进入工作目录,执行git init

$ cd HelloWorld/
$ ls
HelloWorld		HelloWorld.xcodeproj
$ git init
Initialized empty Git repository in /Users/ailion/Developer/HelloWorld/.git/

git init的作用

$ ls -la
total 0
drwxr-xr-x  5 ailion  staff  160  7 16 05:39 .
drwxr-xr-x  4 ailion  staff  128  7 16 03:57 ..
drwxr-xr-x  9 ailion  staff  288  7 16 05:39 .git
drwxr-xr-x  3 ailion  staff   96  7 16 03:57 HelloWorld
drwxr-xr-x@ 5 ailion  staff  160  7 16 03:57 HelloWorld.xcodeproj

我们可以看到,git init只是在项目根目录创建了一个隐藏文件夹.git,这就是它的作用。
多一个文件夹并不会对项目的编译、运行、打包造成任何影响,也就是说git不会通过任何黑科技来染指你的代码。它的存在,仅仅是一个独立运转的隐藏文件夹而已。

.git文件夹

$ cd .git/
$ ls -la
total 24
drwxr-xr-x   9 ailion  staff  288  7 16 05:39 .
drwxr-xr-x   5 ailion  staff  160  7 16 05:39 ..
-rw-r--r--   1 ailion  staff   23  7 16 05:39 HEAD
-rw-r--r--   1 ailion  staff  137  7 16 05:39 config
-rw-r--r--   1 ailion  staff   73  7 16 05:39 description
drwxr-xr-x  12 ailion  staff  384  7 16 05:39 hooks
drwxr-xr-x   3 ailion  staff   96  7 16 05:39 info
drwxr-xr-x   4 ailion  staff  128  7 16 05:39 objects
drwxr-xr-x   4 ailion  staff  128  7 16 05:39 refs

日常操作中,你只会偶尔和1个文件打交道,那就是config文件。
其他文件,不用碰它
我们稍后会慢慢深入到git内部,但是现在,config文件是我们唯一要关心的事情。

空的config文件

$ cat config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true

git init之后的config文件,基本是空的,这让人有点失望

git status

切记:所有git命令,都是在项目的根目录执行。你当你位于子目录中,必须要先回到根目录,才能执行git命令。

回到项目根目录,让我们看看当前的git状态。

$ git status
On branch master

No commits yet

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

	.DS_Store
	HelloWorld.xcodeproj/
	HelloWorld/

nothing added to commit but untracked files present (use "git add" to track)

On branch master:我们现在位于默认的分支上,名字叫master
No commits yet: 我们还没有提交过任何commit呢
Untracked files: :.DS_Store HelloWorld.xcodeproj/ HelloWorld/ git还没有开始追踪这3个文件(夹)的变更
(use "git add <file>..." to include in what will be committed): 如果你想提交这些文件的变更,用git add 文件名就可以了

我们中出了个叛徒

我们还没有真正开始用Git呢,就发现了叛徒!
.DS_Store文件是苹果系统自动生成的,它的作用是生成文件夹的背景、图标的位置等等信息。虽说它有点用,可是和我们的项目完全不相关,更糟糕的是,Git仿佛在考虑把它也提交上去?
于此同时,聪明的你可能也会想到:项目编译过程中产生的一大堆文件,并不属于源代码,会不会也被Git错误地提交上去呢?

.gitignore文件

在Git中,除了.git这个文件夹之外,Git都会考虑追踪它。
你可以在根目录中新建一个.gitignore文件,把不希望Git追踪的文件列进去。


关于Git的漫画

Git
Git