git 零基础介绍

120
Git 网易有道 宇辰 Monday, February 27, 12

Upload: ethan-zhang

Post on 18-Nov-2014

2.557 views

Category:

Technology


28 download

DESCRIPTION

Git 背景、基本原理、基本命令和与 SVN 协同开发介绍

TRANSCRIPT

Page 1: Git 零基础介绍

Git

网易有道 张宇辰

Monday, February 27, 12

Page 2: Git 零基础介绍

Agency

• Git 历史

• 为什么用 Git

• Git 基础知识

• 基本命令

• 暂存区与指针控制 (git reset/git checkout)

• 与 SVN 协同 (git svn)

Monday, February 27, 12

Page 3: Git 零基础介绍

Git 历史

开源社区又一神作

Monday, February 27, 12

Page 4: Git 零基础介绍

Linus Torvalds

• Linux 项目的发起者

• 痛恨 VCS&SVN

• 大神、脾气火爆、非常固执

Monday, February 27, 12

Page 5: Git 零基础介绍

1991~2002 大神只用邮件收集开源社区的 patch,手工集成到自己电脑里

手工集成……手工……手工……伤不起啊!

开源社区Monday, February 27, 12

Page 6: Git 零基础介绍

2002~2005 大神终于选了 Bitlocker 做版本控制,一个商业软件

商业软件……商业……商业……

开源社区Monday, February 27, 12

Page 7: Git 零基础介绍

2005 年,Bitlocker 结束了对开源社区的授权。

Monday, February 27, 12

Page 8: Git 零基础介绍

2005 年,Bitlocker 结束了对开源社区的授权。

我只是好奇...

Andrew TridgellMonday, February 27, 12

Page 9: Git 零基础介绍

2005 年,Bitlocker 结束了对开源社区的授权。

我只是好奇...

Andrew Tridgell

一夜回到解放前

开源社区Monday, February 27, 12

Page 10: Git 零基础介绍

2005 年,Bitlocker 结束了对开源社区的授权。

我只是好奇...

Andrew Tridgell

一夜回到解放前

开源社区

咱自己写一个!

Linus TorvaldsMonday, February 27, 12

Page 11: Git 零基础介绍

• 2005 年 4 月 3 日,开始开发 Git

• 同年 4 月 6 日,项目发布

• 同年 4 月 7 日,Git 作为自身的项目控制工具,仅仅用了 5 天

• 同年 4 月 18 日,第一次多分支合并

• 同年 4 月 29 日,Linus 表示对 Git 的性能满意了

• 同年 6 月 16 日,Linux 2.6.12 发布,开始用 Git 维护,此时仅仅经过 74 天

Monday, February 27, 12

Page 12: Git 零基础介绍

Git 今日

Perl

Qt

3,500,000+ repositories

Monday, February 27, 12

Page 13: Git 零基础介绍

为什么选择 Git

SVN 为什么不爽

Monday, February 27, 12

Page 14: Git 零基础介绍

Bad case

• 开发过程中接到紧急需求

• 等待 review 的代码污染工作区

• 离线开发怎么办

• 写 Log 时不知道写什么

Monday, February 27, 12

Page 15: Git 零基础介绍

SVN

remoterepository working copycheckout

commitmodify

所有的修改只能发生在没有版本控制的本地 working copy 中

developer’s computer

Monday, February 27, 12

Page 16: Git 零基础介绍

Git

remoterepository

localrepository

pullworking copypush commit

developer’s computer

checkout

Monday, February 27, 12

Page 17: Git 零基础介绍

Git

remoterepository

localrepository

pullworking copypush commit

developer’s computer速度快

历史记录可控可以离线工作

checkout

Monday, February 27, 12

Page 18: Git 零基础介绍

Git -- DVCS

remoterepository

devArepository

devBrepository

...

Distributed Version Control System

Monday, February 27, 12

Page 19: Git 零基础介绍

除此之外

• 无处不在的自动分页 (less)

• diff 支持逐字比较 (git diff --word-diff)

• 版本库又小又快

• 支持多种网络传输协议 (http/ssh) 以及更强大的 git 协议,可以显示传输进度

• 丰富且简单的 config 配置

Monday, February 27, 12

Page 20: Git 零基础介绍

安装 Git

Monday, February 27, 12

Page 21: Git 零基础介绍

Linux & Mac

• Git: http://git-scm.com

Monday, February 27, 12

Page 22: Git 零基础介绍

Windows

• Cygwin + git (推荐)

• 命令更丰富

• msysGit + TortoiseGit

• 图形界面

• 对中文目录名和文件名处理有问题

Monday, February 27, 12

Page 23: Git 零基础介绍

Git 基础知识

Git 就是个文件系统

Monday, February 27, 12

Page 24: Git 零基础介绍

Git 内部对象

FileA

FileB

FileC

Tree 1

Commit 1

FileA 2

Tree 2

Commit 2null

Monday, February 27, 12

Page 25: Git 零基础介绍

Git 内部对象

FileA

FileB

FileC

Tree 1

Commit 1

FileA 2

Tree 2

Commit 2null

一次提交中所有的文件Monday, February 27, 12

Page 26: Git 零基础介绍

Git 内部对象

FileA

FileB

FileC

Tree 1

Commit 1

FileA 2

Tree 2

Commit 2null

一次提交 又一次提交Monday, February 27, 12

Page 27: Git 零基础介绍

Git 内部对象

FileA

FileB

FileC

Tree 1

Commit 1

FileA 2

Tree 2

Commit 2null

同一个文件的历史版本

Monday, February 27, 12

Page 28: Git 零基础介绍

Git 内部对象

Commit 1 Commit 2null HEAD

提交对象不可变且拥全局唯一 id除第一个提交外,每个提交都保存上一个提交的引用-- Git 里面就是个大链表

Monday, February 27, 12

Page 29: Git 零基础介绍

Git 基础命令

Monday, February 27, 12

Page 30: Git 零基础介绍

git clone remote_repo_url

克隆一份远程仓库成为本地仓库

不是检出 (checkout)

remoterepository

localrepository

cloneworking copycheckout

Monday, February 27, 12

Page 31: Git 零基础介绍

commit239d5 HEADmaster

origin/master

remoterepository

localrepository

clone

working copy

checkout

commit239d5 master

Monday, February 27, 12

Page 32: Git 零基础介绍

HEAD: 指向当前工作的 branchmaster: 默认的主干分支指针origin/master: 远程仓库 origin 中 master 分支的指针

origin: 远程仓库名,在 git clone 时默认创建

commit239d5 HEADmaster

origin/master

Monday, February 27, 12

Page 33: Git 零基础介绍

echo “hello” > worldgit add world

将文件加入版本库

svn add

commit239d5 HEADmaster

origin/master

Monday, February 27, 12

Page 34: Git 零基础介绍

git commit -m “init commit”

第一个提交

svn commit

commit7ca54 HEADmaster

origin/master

commit239d5

Monday, February 27, 12

Page 35: Git 零基础介绍

git push origin master

将本地仓库推送到远程仓库上

svn commit

Monday, February 27, 12

Page 36: Git 零基础介绍

HEADmaster

origin/master

commit239d5

remoterepository

localrepository

working copy

commit239d5 master

commit

Monday, February 27, 12

Page 37: Git 零基础介绍

HEADmaster

origin/master

commit239d5

remoterepository

localrepository

working copy

commit239d5 master

commit

commit7ca54

Monday, February 27, 12

Page 38: Git 零基础介绍

HEADmaster

origin/master

commit239d5

remoterepository

localrepository

working copy

commit239d5 master

commit

commit7ca54

push

commit7ca54

Monday, February 27, 12

Page 39: Git 零基础介绍

HEADmaster

origin/master

commit239d5

remoterepository

localrepository

working copy

commit239d5 master

commit

commit7ca54

push

commit7ca54

Monday, February 27, 12

Page 40: Git 零基础介绍

git branch featureAgit checkout featureA

在本地仓库创建一个分支

commit7ca54 HEAD

masterorigin/master

featureA

Git 分支

Monday, February 27, 12

Page 41: Git 零基础介绍

git branch -a

查看所有分支

commit7ca54 HEAD

masterorigin/master

reatureA

master * foo remotes/origin/master

Git 分支

Monday, February 27, 12

Page 42: Git 零基础介绍

echo “r2” >> world; git add world; git commit -m ‘r2’

Git 分支

commit7ca54 HEAD

masterorigin/master

reatureAMonday, February 27, 12

Page 43: Git 零基础介绍

echo “r2” >> world; git add world; git commit -m ‘r2’

commit7ca54 HEAD

masterorigin/master

featureAcommit6539d

Git 分支

Monday, February 27, 12

Page 44: Git 零基础介绍

git checkout master

Git 分支切换

commit7ca54 HEAD

masterorigin/master

featureAcommit6539d

Monday, February 27, 12

Page 45: Git 零基础介绍

git checkout master

commit7ca54

HEADmasterorigin/master

featureAcommit6539d

Git 分支切换

Monday, February 27, 12

Page 46: Git 零基础介绍

git merge master

commit7ca54

HEADmasterorigin/master

featureAcommit6539d

Git 分支切换

快进 (fast forward) 合并

Monday, February 27, 12

Page 47: Git 零基础介绍

git merge featureA

commit7ca54

HEADmasterorigin/master

featureAcommit6539d

Git 分支合并

快进 (fast forward) 合并

Monday, February 27, 12

Page 48: Git 零基础介绍

git branch -d featureA

commit7ca54

HEADmasterorigin/master

featureAcommit6539d

Git 分支合并

Monday, February 27, 12

Page 49: Git 零基础介绍

git branch -d featureA

commit7ca54

HEADmasterorigin/master

commit6539d

Git 分支合并

Monday, February 27, 12

Page 50: Git 零基础介绍

Git 冲突解决

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit7ca54 master

commit6539d

commitae78f

push

Monday, February 27, 12

Page 51: Git 零基础介绍

Git 冲突解决

git push

类似 svn 的 out of date 提示

Monday, February 27, 12

Page 52: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit7ca54 master

commit6539d

pull

commitae78f

Monday, February 27, 12

Page 53: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit7ca54 master

commit6539d

pull

commitae78f

commitae78f

Monday, February 27, 12

Page 54: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit7ca54 master

commit6539d

pull

commitae78f

commitae78f

commit36dc2

Monday, February 27, 12

Page 55: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit7ca54 master

commit6539d

pull

commitae78f

commitae78f

commit36dc2

Monday, February 27, 12

Page 56: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit7ca54 master

commit6539d

push

commitae78f

commitae78f

commit36dc2

Monday, February 27, 12

Page 57: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit6539d

push

commitae78f

commit36dc2

commit7ca54

commitae78f

commit6539d

commit36dc2

master

Monday, February 27, 12

Page 58: Git 零基础介绍

HEADmaster

origin/master

commit7ca54

remoterepository

localrepository

working copy

commit6539d

push

commitae78f

commit36dc2

commit7ca54

commitae78f

commit6539d

commit36dc2 master

Monday, February 27, 12

Page 59: Git 零基础介绍

暂存区与指针控制

git addgit checkoutgit reset

Monday, February 27, 12

Page 60: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

暂存区

commit7dae1

commit86dea

commit763da

a.jsb.js

Monday, February 27, 12

Page 61: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

暂存区

commit7dae1

commit86dea

commit763da

a.jsb.js

git add a.js b.js

a.jsb.js

Monday, February 27, 12

Page 62: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit7dae1

commit86dea

commit763da

a.jsb.js

git commit

暂存区a.jsb.js

Monday, February 27, 12

Page 63: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

git commit

暂存区a.jsb.js

Monday, February 27, 12

Page 64: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

git commit

暂存区a.jsb.js

Monday, February 27, 12

Page 65: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

git commit

暂存区a.jsb.js

Monday, February 27, 12

Page 66: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

git commit

暂存区a.jsb.js

Monday, February 27, 12

Page 67: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

git commit

Monday, February 27, 12

Page 68: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

Monday, February 27, 12

Page 69: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

Monday, February 27, 12

Page 70: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

Monday, February 27, 12

Page 71: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

Monday, February 27, 12

Page 72: Git 零基础介绍

Git 暂存区

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

暂存区a.jsb.js

Monday, February 27, 12

Page 73: Git 零基础介绍

Git 分支指针控制

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

暂存区a.jsb.js

git reset --soft 763da

Monday, February 27, 12

Page 74: Git 零基础介绍

Git 分支指针控制

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

暂存区a.jsb.js

git reset --soft 763da

1

Monday, February 27, 12

Page 75: Git 零基础介绍

Git 分支指针控制

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

暂存区a.jsb.js

git reset [--mixed] 763da

1

Monday, February 27, 12

Page 76: Git 零基础介绍

Git 分支指针控制

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

暂存区

git reset [--mixed] 763da

12

Monday, February 27, 12

Page 77: Git 零基础介绍

Git 分支指针控制

工作区 版本库HEAD

master

commit86dea

commit763da

a.jsb.js

commit12caa

暂存区

git reset --hard 763da

12

Monday, February 27, 12

Page 78: Git 零基础介绍

Git 分支指针控制

工作区 版本库HEAD

master

commit86dea

commit763da

commit12caa

暂存区

git reset --hard 763da

12

3*

* 此处仅做演示 --hard 的效果,实际上 git 不会删除暂存区中不存在的文件,只会添加新文件和重置文件修改Monday, February 27, 12

Page 79: Git 零基础介绍

Git 分支指针控制

工作区

版本库HEAD

master

commit86dea

commit763daa.js

b.js

commit12caa

暂存区

--soft: 1--mixed: 1 & 2--hard: 1 & 2 & 3

123* I’m lost*

git reset

* 可以通过 git reflog 查看 HEAD 指针最近的移动历史Monday, February 27, 12

Page 80: Git 零基础介绍

Git 分支指针控制

工作区

版本库HEAD

master

commit86dea

commit763daa.js

b.js

暂存区

123

== git checkout .3

Monday, February 27, 12

Page 81: Git 零基础介绍

Git HEAD 指针控制

工作区 版本库HEAD

master

暂存区

commit7dae1

commit86dea

commit763da

a.jsb.js

git checkout 86dea

a.jsb.js

Monday, February 27, 12

Page 82: Git 零基础介绍

Git HEAD 指针控制

工作区 版本库HEAD

master

暂存区

commit7dae1

commit86dea

commit763da

a.jsb.js

git checkout 86dea

a.jsb.js

1

Monday, February 27, 12

Page 83: Git 零基础介绍

Git HEAD 指针控制

工作区 版本库HEAD

master

暂存区

commit7dae1

commit86dea

commit763da

a.jsb.js

git checkout 86dea

12

Monday, February 27, 12

Page 84: Git 零基础介绍

detached HEAD 状态

HEAD master

commit7dae1

commit86dea

commit763da

git checkout 86deaNote: checking out '86dea'.

You are in 'detached HEAD' state. You can look around, make experimentalchanges and commit them, and you can discard any commits you make in thisstate without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you maydo so (now or later) by using -b with the checkout command again. Example:

git checkout -b new_branch_name

HEAD is now at 78f871f... remove doc

Monday, February 27, 12

Page 85: Git 零基础介绍

detached HEAD 状态

HEAD

master

commit7dae1

commit86dea

commit763da

commit45cdd

Monday, February 27, 12

Page 86: Git 零基础介绍

detached HEAD 状态

HEAD

master

commit7dae1

commit86dea

commit763da

commit45cdd

git checkout master

Monday, February 27, 12

Page 87: Git 零基础介绍

detached HEAD 状态

HEAD

master

commit7dae1

commit86dea

commit763da

commit45cdd

I’m lost

Monday, February 27, 12

Page 88: Git 零基础介绍

在 detached HEAD 状态上创建分支

branch

master

commit7dae1

commit86dea

commit763da

commit45cdd

HEAD

git checkout -b branch

Monday, February 27, 12

Page 89: Git 零基础介绍

在 detached HEAD 状态上创建分支

branch

master

commit7dae1

commit86dea

commit763da

commit45cdd

HEAD

git checkout master

Monday, February 27, 12

Page 90: Git 零基础介绍

修改历史记录

git rebase

Monday, February 27, 12

Page 91: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

mastercommit6539d

commit832ac

git rebase master

Monday, February 27, 12

Page 92: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git rebase master

Monday, February 27, 12

Page 93: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git rebase master

Monday, February 27, 12

Page 94: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git rebase master

commit35ce5

Monday, February 27, 12

Page 95: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git rebase master

commit35ce5

Monday, February 27, 12

Page 96: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git rebase master

commit35ce5

Monday, February 27, 12

Page 97: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git rebase master

commit35ce5

Monday, February 27, 12

Page 98: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEADfoo

master

commit6539d

commit832ac

git checkout master; git merge foo

commit35ce5

Monday, February 27, 12

Page 99: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEAD

foo

master

commit6539d

commit832ac

git checkout master; git merge foo

commit35ce5

Monday, February 27, 12

Page 100: Git 零基础介绍

通过 rebase 合并分支

commit7ca54

HEAD

master

commit6539d

commit35ce5

Pros:提交记录更简单

Cons:操作略微复杂

Monday, February 27, 12

Page 101: Git 零基础介绍

Git + SVN 协同

Monday, February 27, 12

Page 102: Git 零基础介绍

git svn clone -r 310135:HEAD --trunk=trunk --branches=branches --branches=milestones https://..../YNote/Client

Monday, February 27, 12

Page 103: Git 零基础介绍

git 命令 svn 命令

git pull svn update

git push svn commit

Monday, February 27, 12

Page 104: Git 零基础介绍

git 命令 git svn 胶水命令 svn 命令

git pull git svn rebase svn update

git push git svn dcommit svn commit

Monday, February 27, 12

Page 105: Git 零基础介绍

Git 技巧

Monday, February 27, 12

Page 106: Git 零基础介绍

Git revert

HEADmastercommit239d5

commit7ca54

a.js +++

Monday, February 27, 12

Page 107: Git 零基础介绍

Git revert

HEADmastercommit7ca54

commit7865a

commit239d5

a.js +++ a.js ---

Monday, February 27, 12

Page 108: Git 零基础介绍

git commit --amend

HEADmastercommit239d5

commit7ca54

MOD: blahblah

Monday, February 27, 12

Page 109: Git 零基础介绍

git commit --amend

Monday, February 27, 12

Page 110: Git 零基础介绍

git commit --amend

HEADmaster

commit239d5

commit7ca54

MOD: blahblah

commit7ca54

MOD: ...

Monday, February 27, 12

Page 111: Git 零基础介绍

通过 rebase 合并提交记录

commit7ca54

HEAD

master

commit6539d

commit35ce5

git rebase -i origin/master # -i 进入交互式 rebase

origin/master

Monday, February 27, 12

Page 112: Git 零基础介绍

通过 rebase 合并提交记录

commit7ca54

HEAD

master

commit6539d

commit35ce5

git rebase -i origin/master # -i 进入交互式 rebase

origin/mastercommitd32ab

Monday, February 27, 12

Page 113: Git 零基础介绍

通过 rebase 合并提交记录

commit7ca54

HEAD

master

git rebase -i origin/master # -i 进入交互式 rebase

origin/mastercommitd32ab

Monday, February 27, 12

Page 114: Git 零基础介绍

通过 rebase 丢弃提交记录

git rebase -i origin/master # -i 进入交互式 rebase

commit7ca54

HEAD

master

commit6539d

commit35ce5

origin/master

Monday, February 27, 12

Page 115: Git 零基础介绍

通过 rebase 丢弃提交记录

git rebase -i origin/master # -i 进入交互式 rebase

commit7ca54

HEAD

master

commit6539d

commit35ce5

origin/mastercommitd32ab

Monday, February 27, 12

Page 116: Git 零基础介绍

Git rebase tip

• 文件只要进了 git 的版本库,就是安全的

• rebase 本质上是基于已有提交构造新提交

• 永远不要 rebase 已经推送到公共仓库的提交

Monday, February 27, 12

Page 117: Git 零基础介绍

Git 学习资源

Monday, February 27, 12

Page 118: Git 零基础介绍

Pro git

免费的在线电子书http://progit.org

Monday, February 27, 12

Page 119: Git 零基础介绍

Git 权威指南

Monday, February 27, 12

Page 120: Git 零基础介绍

Q&A

张宇辰 [email protected] 学习 POPO 群: 1195049

Monday, February 27, 12