Git 入门实战
关于我n   ⺩王燊 aka icyleafn   http://github.com/icyleaf
个人 SCM 使用经历n   2008 文件打包备份 (个人解决方案)n   2008 1-2 个月 CVS (同事解决方案)n   2008 - 2009 SVN(源于 Wordpress)n   2009 - 至今 Git (源于 ...
什么是版本控制
本地
集中式
分布式
为什么 使用 Git
Linus Torvaldsn   05.4.3 Git 项目启动n   05.4.6 项目第一版发布n   05.4.7 Git 作为自身的版本控制工具n   05.4.18 发布第一个多分支合并n   05.4.29 Git 性能...
git 与 svnn   git 是分布式,svn是集中式n   git 速度快,svn 慢的一塌糊涂n   git 把内容按元数据方式存储,svn 是按文件n   git branch 灵活且强大,svn 仅仅是文件复制管理n   ...
体积⽐比较Clone (Checkout) 速度
SVNGit
快速入门
平台支持n   Linuxn   Mac OS Xn   Windows (Msysgit on Google Code)
CLI 才是王道n   建议使用 Unix/Linux 系统n   GUI 只包含基本功能n   CLI 让你感受到 git 的强大
初次配置 git config --global user.name “icyleaf” git config --global user.email “icyleaf.cn@gmail.com”Windowsgit config --glob...
创建仓库# 本地创建仓库git init# 创建纯净的仓库(多适⽤用于服务器端)git init --bare --shared
克隆仓库# 本地⽂文件路径git clone /opt/git/project.git# ⽂文件协议git clone file://opt/git/project.git# HTTP 协议git clone https://github.co...
工作流
添加&提交touch READMEgit add READMEgit commit -m “add README”touch LICENSEgit statusecho “Hello, World” > READMEgit commit -am...
查看历史git log# 查看最近 3 次提交的详细修改内容git log -p -3# 查看 icyleaf ⽤用户最近⼀一个星期提交信息git log --author icyleaf --since=‘one week ago’# ⽤用简...
恢复echo “Hellp, icyleaf” > READMEgit checkout -- READMEecho “Hello, icyleaf” > READMEgit add READMEgit reset -- READMEecho ...
回滚历史# 回滚到最近历史提交的倒数第⼆二个 commitgit reset --soft HEAD~2# 回滚到某个特性的 commitgit reset --hard {hash}
分支# 列出当前所有本地分⽀支git branch# 新建⼀一个名为 develop 的分⽀支并切换到它git branch developgit checkout master# 下⾯面⼀一⾏行命令等同于上⾯面两⾏行(快速⾼高效,推荐!)gi...
本地远程仓库# 查看本地远程仓库git removte -v# 添加本地远程仓库git remote add upstream http://github.com/icyleaf/repo.git# 改名本地远程仓库git remote ren...
推送至服务器# 推送本地 master 分⽀支到远程 origin 上⾯面git push -u origin master           -u 的作用是保持分支合并的图形完整           性,如果不带的话历史只有一条主线# 删除...
跟踪分支(拉取代码) # 更新远程仓库的最新代码索引 git fetch origin git merge origin/master # 直接更新病合并最新的分⽀支代码 git pull --no-ff orign master       ...
合并代码git checkout -b hotfix# 开始修复代码git checkout master# 合并 hotfix 的代码git merge hotfix# 如果没有冲突⽂文件会以 Fast forward 的⽅方式顺利合并# 如...
衍合(变基)分支# 假如想修改最近三个的 commitgit rebase -i HEAD~3# 回滚到某个特性的 commitpick f7f3f6d changed my name a bitedit 310154e updated REA...
标签# 查看当前所有标签git tag# 标记当前分⽀支为 v1.0 版本作为归档git tag -a v1.0# 添加带备注的标签git tag -a v1.2.1225 -m ‘圣诞节特别版本’# 把历史特定 commit 标记标签git ...
servicesn   Github (git) (public free)n   Bitbucket (hg/git) (public & private all free)n   Google Code (svn/hg/git) (p...
实战
1    我们禁⽌止提交不能编译通过(未完成功能代码)的    代码,尽量不提交缺陷代码。对于很复杂的模块,    有⼈人⼏几乎⼀一个月都没提交过⼀一次。但⼏几经修改的代    码其实从来没有作版本控制。    怎样保证提交的完整性和可运⾏行性?
2    在没有⺴⽹网络的情况下,突然发现 bugs 或者被告知    需要完成紧急项⺫⽬目的开发。    但是没有⺴⽹网络(有本地开发环境),怎么办?
commit & pushgit add READMEgit commit -m “first commit”echo “hello world” > READMEgit commit -am “updated README”echo “mis...
3    某⼈人写了⼀一个模块,总是有 bug 没有修改完,⽽而不    敢提交。这个时候,另⼀一个⼈人希望协助他找问题,    却没有合适的途径提交那段完成了⼀一半的模块。    怎么解决多模块同步开发的问题?
分⽀支⼯工作流•master•develop•hotfixesvia (a successful git branching model)
4    我的项⺫⽬目中有⽤用到⼀一些 Github 上开源的项⺫⽬目,开    源项⺫⽬目避免不了会有缺陷和新特更新。    怎么保证多项⺫⽬目共存性和同步性?
子模块# 假设有⼀一个 blog 的项⺫⽬目,所有外部模块都放在 vendor 下⾯面。# ⾸首先添加⼀一个 twig 模板引擎的⼦子模块git submodule add https://github.com/fabpot/Twig.git ...
5    随着不断的 commit,突然发现有⼀一天,历史    commit 有些⽂文件包含私密数据,在 reset 的时    候,⼀一不⼩小⼼心把另外重要数据抹掉了,再看 log 的    时候发现最新的⼏几个 commit 不⻅见了!!...
最后的后悔药git reset --hard 3d2x9# 发现回滚错了,⽽而之前的 HEAD 已经没有了!怎么办!git reflogb8981f0 HEAD@{0}: reset: moving to b8981f03e15a82 HEAD...
6    这个话题都讲那么⻓长时间了,我⼼心⾥里痒痒的很,可    是...可是...我们公司⽤用的还是 svn 啊!啊!!    啊!!!!!!!!    哈,git 其实还拥有⼀一种秘密武器:git-svn
git-svn# Clone 指定⺫⽬目录下,相依起始版本号的代码git svn clone https://intra.leju.com/svn/mobile -s -r524:HEAD# 其他操作(如,add,commit,log 等)全部...
Subgithttp://subgit.com/
7    我们公司开发环境为了⽅方便开发测试和部署,特意    部署了两套 svn:⼀一个专⻔门提交到测试机器,另外    ⼀一个专⻔门提及到产品机器上⾯面部署。    如果使⽤用 git 的话,怎么能把两者代码完美且快速    的融合,推送到...
继续利用分支特性创建两个 remote(production)/test 和两个 branch(master/develop)git remote add production http://pro.xxx.com/pro.gitgit rem...
资源n   http://git-scm.comn   https://help.github.comn   https://github.com/schacon/whygitisbettern   https://github.com...
Q&A
Thanks
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Git 入门实战
Upcoming SlideShare
Loading in …5
×

Git 入门实战

3,183 views
3,045 views

Published on

随着 Git 越来越受欢迎,目前开始大部队开始尝试使用 Git,但是 Git 的强大不仅仅在于机制和使用上,更在于命令的灵活性,它和其他版本控制有何不同,使用它又能帮助开发者解决哪些问题,这个就是本话题分享的抛砖引玉的开篇。

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,183
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
69
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Git 入门实战

  1. 1. Git 入门实战
  2. 2. 关于我n ⺩王燊 aka icyleafn http://github.com/icyleaf
  3. 3. 个人 SCM 使用经历n 2008 文件打包备份 (个人解决方案)n 2008 1-2 个月 CVS (同事解决方案)n 2008 - 2009 SVN(源于 Wordpress)n 2009 - 至今 Git (源于 Kohana PHP 3.0)
  4. 4. 什么是版本控制
  5. 5. 本地
  6. 6. 集中式
  7. 7. 分布式
  8. 8. 为什么 使用 Git
  9. 9. Linus Torvaldsn 05.4.3 Git 项目启动n 05.4.6 项目第一版发布n 05.4.7 Git 作为自身的版本控制工具n 05.4.18 发布第一个多分支合并n 05.4.29 Git 性能已经达到预期n 05.6.16 Git 正式维护 Linux 内核代码
  10. 10. git 与 svnn git 是分布式,svn是集中式n git 速度快,svn 慢的一塌糊涂n git 把内容按元数据方式存储,svn 是按文件n git branch 灵活且强大,svn 仅仅是文件复制管理n git 有无尽的后悔药,svn 的恢复显得有些苍白
  11. 11. 体积⽐比较Clone (Checkout) 速度
  12. 12. SVNGit
  13. 13. 快速入门
  14. 14. 平台支持n Linuxn Mac OS Xn Windows (Msysgit on Google Code)
  15. 15. CLI 才是王道n 建议使用 Unix/Linux 系统n GUI 只包含基本功能n CLI 让你感受到 git 的强大
  16. 16. 初次配置 git config --global user.name “icyleaf” git config --global user.email “icyleaf.cn@gmail.com”Windowsgit config --global core.filemode falsegit config --global core.autocrlf true
  17. 17. 创建仓库# 本地创建仓库git init# 创建纯净的仓库(多适⽤用于服务器端)git init --bare --shared
  18. 18. 克隆仓库# 本地⽂文件路径git clone /opt/git/project.git# ⽂文件协议git clone file://opt/git/project.git# HTTP 协议git clone https://github.com/progit/progit.git# SSH 协议git clone ssh://git@github.com:progit/progit.gitgit clone git@github.com:progit/progit.git
  19. 19. 工作流
  20. 20. 添加&提交touch READMEgit add READMEgit commit -m “add README”touch LICENSEgit statusecho “Hello, World” > READMEgit commit -am “updated README”git status
  21. 21. 查看历史git log# 查看最近 3 次提交的详细修改内容git log -p -3# 查看 icyleaf ⽤用户最近⼀一个星期提交信息git log --author icyleaf --since=‘one week ago’# ⽤用简单图形查看分⽀支提交的情况git log --graph --oneline
  22. 22. 恢复echo “Hellp, icyleaf” > READMEgit checkout -- READMEecho “Hello, icyleaf” > READMEgit add READMEgit reset -- READMEecho “Hello, Mr. icyleaf” > READMEgit commit -am ‘Modified README’git commit --amend
  23. 23. 回滚历史# 回滚到最近历史提交的倒数第⼆二个 commitgit reset --soft HEAD~2# 回滚到某个特性的 commitgit reset --hard {hash}
  24. 24. 分支# 列出当前所有本地分⽀支git branch# 新建⼀一个名为 develop 的分⽀支并切换到它git branch developgit checkout master# 下⾯面⼀一⾏行命令等同于上⾯面两⾏行(快速⾼高效,推荐!)git checkout -b develop# 改名分⽀支git branch -m develop 2.0/develop# 删除分⽀支git branch -d 2.0/develop
  25. 25. 本地远程仓库# 查看本地远程仓库git removte -v# 添加本地远程仓库git remote add upstream http://github.com/icyleaf/repo.git# 改名本地远程仓库git remote rename upstream icyleaf# 删除本地远程仓库git remote rm icyleaf
  26. 26. 推送至服务器# 推送本地 master 分⽀支到远程 origin 上⾯面git push -u origin master -u 的作用是保持分支合并的图形完整 性,如果不带的话历史只有一条主线# 删除远程 origin 上⾯面提交的临时分⽀支:issue3git push origin :issue3 git push [远程名] [本地分⽀支]:[远程分⽀支]
  27. 27. 跟踪分支(拉取代码) # 更新远程仓库的最新代码索引 git fetch origin git merge origin/master # 直接更新病合并最新的分⽀支代码 git pull --no-ff orign master 默认 git pull 可以等同于上面。其实配置文件帮你设置。
  28. 28. 合并代码git checkout -b hotfix# 开始修复代码git checkout master# 合并 hotfix 的代码git merge hotfix# 如果没有冲突⽂文件会以 Fast forward 的⽅方式顺利合并# 如果发⽣生冲突,使⽤用 git status 查看冲突的⽂文件(类似 SVN 状况)# 解决后,使⽤用 git add 标记已完成,并 git commit 提交冲突⽂文件
  29. 29. 衍合(变基)分支# 假如想修改最近三个的 commitgit rebase -i HEAD~3# 回滚到某个特性的 commitpick f7f3f6d changed my name a bitedit 310154e updated README formatting and added blamepick a5f4a0d added cat-file# Rebase 710f0f8..a5f4a0d onto 710f0f8## Commands:# p, pick = use commit# e, edit = use commit, but stop for amending# s, squash = use commit, but meld into previous commit## If you remove a line here THAT COMMIT WILL BE LOST.# However, if you remove everything, the rebase will be aborted.# 对于 edit 的 commit 进⾏行任意操作# 修改完毕(git commit)之后没问题了继续衍合当前 commitgit rebase --continue# 如果当前 edit 不需要编辑了可以跳过git rebase --skip
  30. 30. 标签# 查看当前所有标签git tag# 标记当前分⽀支为 v1.0 版本作为归档git tag -a v1.0# 添加带备注的标签git tag -a v1.2.1225 -m ‘圣诞节特别版本’# 把历史特定 commit 标记标签git tag -a v1.1 1d2x33# 查找 v1.0 版本下有多少标记的⼩小版本git tag -l ‘v1.*’# 分享标签git push origin v1.0
  31. 31. servicesn Github (git) (public free)n Bitbucket (hg/git) (public & private all free)n Google Code (svn/hg/git) (public only)
  32. 32. 实战
  33. 33. 1 我们禁⽌止提交不能编译通过(未完成功能代码)的 代码,尽量不提交缺陷代码。对于很复杂的模块, 有⼈人⼏几乎⼀一个月都没提交过⼀一次。但⼏几经修改的代 码其实从来没有作版本控制。 怎样保证提交的完整性和可运⾏行性?
  34. 34. 2 在没有⺴⽹网络的情况下,突然发现 bugs 或者被告知 需要完成紧急项⺫⽬目的开发。 但是没有⺴⽹网络(有本地开发环境),怎么办?
  35. 35. commit & pushgit add READMEgit commit -m “first commit”echo “hello world” > READMEgit commit -am “updated README”echo “missing content” >> READMEgit commit -am “completed README”git push origin master 本地多次提交完成功能, 最后统一提交到服务器。
  36. 36. 3 某⼈人写了⼀一个模块,总是有 bug 没有修改完,⽽而不 敢提交。这个时候,另⼀一个⼈人希望协助他找问题, 却没有合适的途径提交那段完成了⼀一半的模块。 怎么解决多模块同步开发的问题?
  37. 37. 分⽀支⼯工作流•master•develop•hotfixesvia (a successful git branching model)
  38. 38. 4 我的项⺫⽬目中有⽤用到⼀一些 Github 上开源的项⺫⽬目,开 源项⺫⽬目避免不了会有缺陷和新特更新。 怎么保证多项⺫⽬目共存性和同步性?
  39. 39. 子模块# 假设有⼀一个 blog 的项⺫⽬目,所有外部模块都放在 vendor 下⾯面。# ⾸首先添加⼀一个 twig 模板引擎的⼦子模块git submodule add https://github.com/fabpot/Twig.git vendor/twig# 添加了那么多⼦子模块,我如何全部更新呢?git submodule foreach git pull# clone 别⼈人带⼦子模块的,我怎么获取他们的代码呢?git submodule init && git submodule updategit submodule update --init# 我怎么知道⼀一个项⺫⽬目都有哪些⼦子模块?cat .gitmodules
  40. 40. 5 随着不断的 commit,突然发现有⼀一天,历史 commit 有些⽂文件包含私密数据,在 reset 的时 候,⼀一不⼩小⼼心把另外重要数据抹掉了,再看 log 的 时候发现最新的⼏几个 commit 不⻅见了!! 难道只能通宵加班补代码了?!
  41. 41. 最后的后悔药git reset --hard 3d2x9# 发现回滚错了,⽽而之前的 HEAD 已经没有了!怎么办!git reflogb8981f0 HEAD@{0}: reset: moving to b8981f03e15a82 HEAD@{1}: commit: Modified README07e0183 HEAD@{2}: commit (initial): initgit reset --hard 3e15a82 30天内有效,否则 git 会 做垃圾处理掉
  42. 42. 6 这个话题都讲那么⻓长时间了,我⼼心⾥里痒痒的很,可 是...可是...我们公司⽤用的还是 svn 啊!啊!! 啊!!!!!!!! 哈,git 其实还拥有⼀一种秘密武器:git-svn
  43. 43. git-svn# Clone 指定⺫⽬目录下,相依起始版本号的代码git svn clone https://intra.leju.com/svn/mobile -s -r524:HEAD# 其他操作(如,add,commit,log 等)全部使⽤用 git 本⾝身的命令# 提交代码到 svn 服务器git svn dcommit# 从 svn 服务器获取最新代码git svn rebase
  44. 44. Subgithttp://subgit.com/
  45. 45. 7 我们公司开发环境为了⽅方便开发测试和部署,特意 部署了两套 svn:⼀一个专⻔门提交到测试机器,另外 ⼀一个专⻔门提及到产品机器上⾯面部署。 如果使⽤用 git 的话,怎么能把两者代码完美且快速 的融合,推送到产品机器发布?
  46. 46. 继续利用分支特性创建两个 remote(production)/test 和两个 branch(master/develop)git remote add production http://pro.xxx.com/pro.gitgit remote add test http://test.xxx.com/pro.git根据分⽀支 push 到不同的 remotegit push test developgit fetch productiongit merge production/master master(develop)$ git merge master若有冲突合并之后在测试⽆无误,没问题了合并到 master 推送到产品机器(master)$ git merge devlopgit push production master
  47. 47. 资源n http://git-scm.comn https://help.github.comn https://github.com/schacon/whygitisbettern https://github.com/progitn http://gitready.comn http://gitref.org/
  48. 48. Q&A
  49. 49. Thanks

×