• 1. GIT 简介软件配置管理(一) 使用git进行版本控制
  • 2. 配置管理构成版本控制 变更控制 过程支持 更多资料 配置管理 百度百科
  • 3. 简介git为什么和怎样影响软件开发 该ppt的预期目标: 理解git的设计和哲学 能够在日常工作中使用git
  • 4. 内容蓝图GIT 背景知识 GIT 设计目标 git日常工作 QA
  • 5. Overview 协作是在软件开发中无处不在。因此,您会看到CVS,SVN的,水银,vss,Mecurial和Git。。。。。。。。 为什么配置管理能帮助人们更有效的协调工作呢?
  • 6. if not vc 一、 代码管理混乱。如果是别人添加或删除一个文件,你很难发现。没有办法对文件代码的修改追查跟踪。甚至出现文件丢失,或新版本代码被同伴无意覆盖等现象。 二、 解决代码冲突困难。当大家同时修改一个公共文件时,解决代码冲突是一件很头疼的事。最原始的办法是手工打开冲突文件,逐行比较,再手工粘贴复制。更高级的做法是使用文件比较工具,但仍省不了繁杂的手工操作,一不小心,甚至会引入新的bug。 三、 在代码整合期间引入深层BUG。例如开发者A写了一个公共函数,B觉得正好可以复用;后来A又对这个公共函数进行了修改,添加了新的逻辑,而这个改动的却是B不想要的。或者是A发现这个公共函数不够用,又新做了一个函数,B却没有及时获得通知。这些,都为深层BUG留下隐患。 四、 无法对代码的拥有者进行权限控制。代码完全暴露在所有的开发者面前,任何人都可以随意进行增、删、改操作,无法指定明确的人对代码进行负责。特别是产品的开发,这是极其危险的。 五、 项目不同版本发布困难。特别是对产品的开发,你会频繁的进行版本发布,这时如果没有一个有效的管理产品版本的工具,一切将变得非常艰难。 上面只是列举了一些没有版本控制系统可能带来的问题,特别是对大型项目和异地协同开发有了一个合适的版本控制工具,它可以有效解决因为代码版本不同引起的各种问题,让我们的开发人员能更多的把精力花费在开发上面。而不是每次都花费很多时间进行代码整合和解决版本不同带来的各种问题。
  • 7. with vc 一、 代码统一管理,保存所有代码文件更改的历史记录。对代码进行集中统一管理,可以方便查看新增或删除的文件,能够跟踪所有代码改动痕迹。可以随意恢复到以前任意一个历史版本。并避免了因为版本不同引入的深层BUG。 二、 完善的冲突解决方案,可以方便的解决文件冲突问题,而不需要借助其它的文件比较工具和手工的粘贴复制。 三、 代码权限的管理。可以为不同的用户设置不同的权限。可以设置访问用户的密码、只读、修改等权限,可以完成精细的权限控制,还能完成更加个性化的功能。 四、 支持方便的版本发布和分支功能。 相关工具
  • 8. 为什么是git1. 傻瓜都会的初始化,git init, git commit -a, 就完了。对于随便写两行代码就要放到代码管理工具里的人来说,再合适不过。也可以拿git做备份系统,或者同步两台机器的文档,都很方便。 2. 绝大部分操作在本地完成,不用和集中的代码管理服务器交互,终于可以随时随地大胆地check in代码了。 只有最终完成的版本才需要向一个中心的集中的代码管理服务器提交。 3. 每次提交都会对所有代码创建一个唯一的commit id。不像CVS那样都是对单个文件分别进行版本的更改。所以你可以一次性将某次提交前的所有代码check出来,而不用考虑到底提交过那些文件。(其实SVN也可以做到这点) 4. branch管理容易多了,无论是建立新的branch,还是在branch之间切换都一条命令完成,不需要建立多余的目录。 5. branch之间merge时,不仅代码会merge在一起,check in历史也会保留,这点非常重要。 6. … 太多了
  • 9. 术语Repository(库) Pull(拉) / Push (推)/ Checkout(检出) Branch(分支) Merge(合并) Conflict(冲突) Commit(提交) Revert(还原)
  • 10. (本页无文本内容)
  • 11. GIT 背景知识Linus Torvald 开发的。 目的: 方便 Linux kernel development 认为 CVS/SVN 是邪恶的
  • 12. Git 设计目标分布式的 无中心库 每个人工作在自己的节点上 Write access class VS. Network of trust 特性 廉价的分支和合并 比较整个内核的两个版本差异耗时不到一秒。 存储KDE版本树,磁盘占用不到2G,而SVN需要8G
  • 13. Git design objectives可靠性 文件损坏, 内存损坏, 恶意用户 GIT 跟踪整个版本库的内容, 不是单个文件, 也不仅仅是文件名。 GIT 使用 SHA1 确保数据一致性: 文件, 提交, 库... 因此: May not check in a single file May not check out a single file 智能分割一个大项目到若干子项目 Break a big project to sub projects smartly :)
  • 14. git日常使用GIT 日常命令: “git merge” “git pull” “git push” “gitk” “git init” “git config” GIT man page “man git-merge”
  • 15. Everyday tasks with GIT对GIT进行自我介绍 “git config –global user.name “Trung”” “git config –global user.email 创建版本库 “git init” 克隆一个版本库 “git clone git://git.kernel.org/scm/git/git.git” git clone ssh://trunglt@aye.comp.nus.edu.sg/home/min/forecite/
  • 16. Everyday tasks with GIT学习一点 GIT 概念: 库: 你的本地库和远程库 参加历史: 提交或者合并 分支: “master” 是默认分支名称. 不要给分支起名称叫as test1, test2... 叫做 test_login, test_write 标签: 一个提交的友好的名称 (version 1.0 vs e74g64a21...) Head: 当前分支上的一系列提交. 最新提交所在分支的名称
  • 17. git日常使用HEAD: 代表你工作使用的那个提交 HEAD^, HEAD^^, HEAD~3 = HEAD^^^, HEAD^1, HEAD^2
  • 18. Everyday tasks with GIT创建分支: “git branch ” “git branch ” 删除分支: “git branch -d ” 查看所有分支: “git branch” “git branch -r” //remote branch 检出指定提交的版本: “git checkout ” “git checkout -b
  • 19. Everyday tasks with GIT给远程版本库起别名: “git remote add min ssh://@aye.comp.nus.edu.sg/home/min/parcite” 从 Min获取改掉: “get fetch min” 合并 Min库的主分支: “get merge min/master” 或者一次完成: git pull min
  • 20. Everyday tasks with GIT查看一个提交的 SHA1哈希值: Git rev-list HEAD^..HEAD 查看日志: “git log” “git log HEAD~4..HEAD” “git log –pretty=oneline v1.0..v2.0 | wc-l git log --raw -r --abbrev=40 –pretty=oneline origin..HEAD git archive --format=tar --prefix=project/ HEAD | gzip >latest.tar.gz “git blame
  • 21. Everyday tasks with GITGit 提交和合并: Git 有自己的索引数据库 当你改动你的版本库, 有三种: HEAD: 你的改动历史 缓存的: 你新增的和运行过“git add”的 剩余的文件是你要求git不去跟踪的
  • 22. Everyday tasks with GIT提交: 你编译了一些文件以后, 查看 “git status”输出 使用“git add .”让 GIT跟踪新文件: 创建新文件 “git diff –cached” “git add .” “git diff HEAD” “git commit”
  • 23. Everyday tasks with GITGit 合并: “git pull min” 或者 (“git fetch min” then “git merge min”) 冲突 $ git show :1:file.txt # the file in a common ancestor of both branches $ git show :2:file.txt # the version from HEAD, but including any # nonconflicting changes from MERGE_HEAD $ git show :3:file.txt # the version from MERGE_HEAD, but including any # nonconflicting changes from HEAD. 解决冲突 / 还原和向别人寻求帮助
  • 24. Everyday tasks with GIT重置冲突的合并: 使用 git-reset “git reset –mixed 重置数据库索引到合并前 “git reset –hard 重置数据库索引和工作数据 “git reset –soft 你做了一个提交并且翻了一些错误。通过这个命令帮我们修复那些错误而改掉通过工作数据和索引数据库
  • 25. Everyday tasks with GIT“git reset” 只帮你还原最近的提交 Revert older commit by hiding is bad 使用 “git revert” 引进一个补丁来还原合并和提交. 这个留作练习。
  • 26. Everyday tasks with GIT最后: 如何在一个库中忽略文件: 使用 .gitignore: 罗列你想忽略的文件 把 .gitignore放到有这些文件的目录里 例如: Ruby on Rails 工程文件 例如: C/C++ 工程编译中间产物
  • 27. Everyday tasks with GIT质量保证? Linux开发者如何跟踪bugs: “git bisect”: 在一系列提交力二分查找一个bug: git bisect start git bisect good v2.6.17 git bisect bad v2.6.18
  • 28. Question and AnswerQuestion and Answer :)
  • 29. 总结Git 是一个伟大的工具 版本控制领域的新模式 精通很难,所以通过日常使用来学习它。 经常去论坛和用户组提问题
  • 30. 主动学习 大脑不是一个用于填充的容器,而是一束需要点燃的火焰。 群英汇博客--版本控制 Why Git is Better than X 基于git的合作开发 Git 和 SVN 协同模型 爱上Git 基于GIt的项目管理