Git使用培训1


北京群英汇信息技术有限公司 http://www.ossxp.com 2005-2012 版本号: Git for programmers 2012.03-1 --- Version+++ Control VSS 2 版本控制系统 • 个人的版本控制 ✓ 时光机 ✓ 云存储 ✓ 在 GitHub上的博客、 “简历 ” • 项目的版本控制 ✓ 工作协同 ✓ 发布管理 ✓ Debug (git bisect) ✓ 代码审核 ✓ 持续集成 3 4 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn Junio C Hamano 濱野 -純 Linus Torvalds Git ? 5 Erik Maarten Dr. Dick Grune serverCVS server 传统集中式版本控制系统 6 版本控制大爆发 • CVS, 1986/1990 • Subversion, 2001/2004 • ClearCase, 1992 • Visual SourceSafe, 1994 • Perforce, 1995 • Starteam, 1995 • Team Foundation Server, 2005 • Rational Team Concert, 2008 7 为什么Linus这样“赞颂”CVS? 8 新一代分布式版本控制系统 9 服务器 DVCS 终端 终端 终端 谁在用 Git • Linux Kernel • Perl • Eclipse • Gnome • KDE • Qt • Ruby on Rails • Android • PostgreSQL • PHP • Debian • X.org • Prototype, jQuery 10 SVN在开源项目中失宠 • 贡献者参与项目,不能使用版本控制! • 安全差:服务器数据篡改、单点故障 • 效率低:更不要说要翻墙 • CollabNet => Apache 11 企业部署 SVN的困惑 • 所有人均能提交,但如何审核? • 发布控制:禁止发布未验证功能。分支? • 分支带来的授权管理负担 • 合并缺乏智能,难追踪 ✓ Bug重现? • 异地团队工作协同的解决方案复杂 • 版本库安全性 12 合并 集中式版本控制系统 永远的痛! 13 CVS/SVN难以追踪合并  SVN的顺序/非结构化提交  基于目录的授权 /trunk hacks... /branches/v1.x hacks... Merge r11 from /branches/v1.x to /trunk Merge r14 from /branches/v1.x to /trunk /branches/v1.x hacks... /trunk hacks... 14 Git:提交非线性, 合并可视 克隆 新提交 新提交 15 合并 推送 获取 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 ? Topic1 Topic2 分支合并 Topic1 ? Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 分支合并 Topic1 Topic2 DAG: 有向无环图 34 和谐的有向无环图(DAG) 35 集中式版本控制 :-) :-( ⼀个服务器 共享; 协同 性能瓶 颈; 单点故障; 备份 网络操作 分布式 团队; 远程 开发 慢; 无法移 动办公 递增式提交 历史不 会被破坏 提交 过时; 频繁 冲突 集中授权 基于路 径的 读写授 权 项目 参与度低 36 分布式版本控制 :-) :-( 全是服务器 最安全; 无带宽和性能瓶 颈 习惯和方式的 转变 本地提交操作 快;移 动办公 忘 记推送(PUSH) 数据校验 版本 库不被篡改 历史 变更影 响最新 数据 非线性提交 真正的分支;合并更容易 提交版本 号太 长 多样化协同模型 对新人的 审核;受控 库 习惯的 转变 提交可更改 提交修正和重构 提交 丢失 37 Git做不到的? • 无锁定 /解锁模式 ✓ 不能排他式修改,所以 Git不适合 ... • 不能克隆子目录 ✓ 所以 Android有近 200个 Git库 • 整体的读授权, 0/1 ✓ 版本库拆分 38 39 安装 Git • Windows ✓ msysGit ‣ http://code.google.com/p/msysgit/ ✓ Cygwin ‣ http://cygwin.com/setup.exe • Linux • Mac OSX 第⼀次提交报错 $ git commit -m “initial commit” [master b2bce7c] initial commit Committer: Jiang Xin 您的姓名和邮件地址会基于您的用户名和主机地址自动配置。请检查它们 正确与否。您可通过下面命令对其显式声明以避免重复出现类似提示: git config --global user.name "Your Name" git config --global user.email you@example.com 设置完毕后,您可用下面命令来更改此次提交所使用的用户 ID: git commit --amend --reset-author 1 个文件被修改,插入 2 行 (+),删除 1 行 (-) 40 是谁在提交? • 提交者: user name • 全局设置 ✓ git config --global user.name “My Name” ✓ git config --global user.email my@email • 临时性项目级设置 ✓ git config --global user.name “My Name” ✓ git config --global user.email me@address • 莫要伪装成他人 41 是谁在提交? 42 常见的 Git配置 • 我是谁? ✓ git config --global user.name “My Name” ✓ git config --global user.email my@email • 可否用 ci 代替 commit? ✓ git config --global alias.ci commit -s ✓ git config --global alias.co checkout ✓ git config --global alias.st status ✓ git config --global alias.br branch • 启用颜色输出 ✓ git config --global color.ui true • 更多命令分页器 ✓ git config --global pager.status true 43 访问Git Git协议 git://example.com[:port]/path/to/repo.git/ SSH协议 ssh://[user@]example.com[:port]/path/to/repo.git/ SSH协议 [user@]example.com:path/to/repo.git/ HTTP(S)协议 http[s]://user@example.com[:port]/path/to/repo.git/ 本地协议 file:///path/to/repo.git 本地协议 /path/to/repo.git 44 • git clone git://github.com/gotgit/gotgithub.git • git clone git@github.com:gotgit/gotgithub.com • git clone https://jiangxin@github.com/gotgit/gotgithub.git 看看我能访问哪个版本库? 45 • Gitweb ✓ https://server/gitweb/ ✓ 支持单点登录、支持 Gitolite授权 看看我能访问哪个版本库? • SSH ✓ ssh -T git@server hello jiangxin, this is gitolite v1.5.4 running on git 1.7.6 the gitolite config gives you the following access: C users/jiangxin/[a-z].* R W gitolite-admin @R_ @W_ testing 46 使用 HTTP协议的 Git 47 • 和其他平台相同的用户名口令 ✓ https://weblogin.___.___/ • HTTP协议下的 Git操作 ✓ git clone http://git.___.___/git/testing.git ✓ git ls-remote https://git.___.___/git/testing.git • HTTPS协议证书验证问题 ✓ git config --global http.sslverify false • HTTP认证的口令缓存方法 ✓ ~/.netrc ‣ machine login password 使用 SSH协议的 Git 48 • 公钥认证,免口令输入 ✓ ssh-keygen ✓ PuTTYgen生成公钥 • SSH协议下的 Git操作 ✓ git clone git@server:testing.git ✓ git ls-remote ssh://git@server/testing.git • 使用 SSH协议管理版本库 ✓ ssh -T git@server ✓ ssh -Tv git@server ✓ ssh git@server setperms users/my/repos.git 公钥选择和主机别名 • GitHub上的多账户 ✓ 无法从用户名上区分认证用户 ‣ git clone git@github.com:gotgit/gotgithub.git ‣ git clone git@github.com:ossxp-com/hello-world.git ✓ 配置文件: ~/.ssh/config Host my.github User git Hostname github.com Port 22 IdentityFile ~/.ssh/gotgithub ✓ git clone my.github:path/to/repos.git 49 Git最灵活,但怎么用? 50 ( 1)像 SVN⼀样工作 51 clone commit commit push fast- forward? pull conflict?mergetool push 是 是 否 否 add add rm mv ( 2)基于分支的工作审核 52 clone commit commit push [-u origin XX] fetch origin push checkout -b XX request-pull merge [--ff-only] XXconflict? merge --abort fetch merge rebase 是 否 * cherry-pick ( 3)基于库的工作审核 53 clone commit commit push [-u XX master] fetch XX push remote add XX URL request-pull merge [--ff-only] XX/masterconflict? merge --abort fetch origin merge rebase remote add XX URL 是 否 ( 4)个人版本控制 54 init --bare clone file://... commit push remote add origin file://... commit init commit commit push -u origin master ( 5)补丁式协同 55 init commit commit format-patch push send-email conflict? clone am 否 mergetool add 是 56 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 演示: Git工作流( 1-1) 57 clone commit commit push fast- forward? pull conflict?mergetoolpush 是 是 否 否 add add rm mv clonecommit commit push add rm mv 问题 58 • 提交说明的编辑器不会使用。 ;-) • 修改不想要了,还原回之前的版本? • 执行了添加(或删除)的文件,如何撤销? • 修改的文件,为什么不能直接提交? • 准备提交的更改,如何撤销? • 刚刚的提交,提交说明写错了?历史提交呢? • 克隆空版本库, git push推送不了? • 刚刚的错误提交如果已经 push了,如何改正? • 如何丢弃最近提交? • 如何推送非当前提交? • 为什么提交编号那么长,有什么简便表示法么? • 内容相同名字不同的两个大文件,会浪费存储空间么? • 如何查看历史提交的文件? git clone 59 • 比较 .svn 和 .git • 概念:工作区和版本库 • 移动工作区及版本库 • 和远程版本库的关联 ✓ .git/config 中的注册信息 ✓ 注册多个远程版本库? git commit 和 vim • 问:如何生成⼀个随机字符串? ✓ 答:让⼀个不懂 vi的人试着退出 vi • 学习 VIM ✓ vimtutor • git commit ✓ ESC, i ✓ “why commit?” ✓ ESC, :w, :q • git commit -m “单行注释 ” 60 git help 和 vim • 命令帮助 ✓ git help, git help [--web] init ✓ git help clone, git help config • 热键 ✓ G: 跳转到末行 ✓ gg: 跳转到首行 ✓ 50gg: 跳转到第 50行 ✓ /string : 查找 string ✓ h/j/k/l: 移动光标 ✓ q: 退出 61 提交说明和 签名 • 提交说明编辑器的颜色提示 • 提交说明的格式: 50/72原则 ✓ ⼀行简短说明:少于 50字符。用于 send-email, request-pull ✓ ⼀个空行 ✓ 详细说明。多段落, 72字符折行。 • 查看 Git项目提交日志 ✓ Signed-off-by: User • 为什么要加签名? ✓ 因为提交只有⼀个作者 ✓ 但是可能会有其他审核者 ✓ 自动添加签名: git commit -s 62 敲下回车键就后悔了 • 后悔了,可能是 ✓ 提交说明单词拼错了 ✓ 有⼀个文件忘记添加 • 修补提交 ✓ git commit --amend • 修正未设置的错误的用户名 ✓ git config --global user.name XX ✓ git config --global user.email XX ✓ git commit --amend --reset-author ✓ 验证: git log --pretty=fuller 63 对前⼀次或更早提交的变更 • 想要更改更早的提及说明? ✓ git rebase -i commit^ • 笨的办法 ✓ git checkout commit ✓ git commit --amend ✓ git cherry-pick ... 64 取消本地修改 • 未执行 git add ✓ git checkout -- • 危险命令 ✓ git checkout . • 执行了 git add 的撤销 ✓ git reset + git checkout -- 65 舍弃提交 • 舍弃最近提交 ✓ git reset HEAD^ ✓ git reset HEAD^^ • 舍弃历史提交 ✓ git reset -i COMMIT^ 66 67 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 全局版本号和全球版本号 • SVN的全局版本号 ✓ 1, 2, 3, ... • Git的全球版本号 ✓ 3c84c805b879ee6142367a7f94ca17a43b4b9f25 • 为什么 ✓ 线性和非线性提交 ✓ 安全性 • 兼顾安全与方便 ✓ 3c84c80 68 需要了解 Git的设计么 • Git - A Stupid Content Tracker • 解答疑问: ✓ 为何提交不能被篡改? ✓ 两个相同文件,会存储⼀份还是两份? ✓ 什么是 master? ✓ 暂存区魔法? ✓ 可以回滚多次么? ✓ 可以只修改某个历史提交么? ✓ 如何撤销提交任务或本地更改? 69 reset, checkout • git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: README.txt # # Changes not staged for commit: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working ...) # # modified: README.txt # # Untracked files: # (use "git add ..." to include in what will be committed) # # hello.c 70 Git对象库研究 • 40位的提交 ID ✓ git log、 git show • 无处不在的 40位 ID ✓ Commit ✓ Tree ✓ Blob ✓ Tag(后话) • 这些对象在哪里? ✓ git cat-file [ -t | -p | tag | commit | blob | tree ] 71 对象关系图 72 更真实的版本库结构图 73 40位 ID的奥秘 • SHA1哈希值 • 40位 =160比特 • 研究对象库工具 ✓ git rev-parse ✓ git cat-file ✓ git show ✓ sha1sum 74 对象表示法 • 研究工具: git rev-parse ✓ 8199 ✓ HEAD^ ✓ HEAD^^, HEAD~2 ✓ HEAD^^3^2 ✓ 8199^{tree} ✓ 8199:file ✓ v1.5^{}, v1.5^0, v1.5^{commit} ✓ master@{1} • git help --web rev-parse 75 版本范围表示法 • 研究工具: git rev-list ✓ A ✓ D F ✓ ^B C, B..C ✓ B ^C, C..B ✓ B...C, B...C ✓ B^@ ✓ B^! • git help --web rev-parse 76 分支的奥秘 • 当前分支? ✓ git status ✓ git branch ✓ git rev-parse --symbolic-full-name master • 分支好像⼀个文件? ✓ .git/refs/heads/? • 分支文件的内容是? • 新提交,分支文件改变?好像⼀个游标? • 游标还有其他操作方法么? 77 78 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 怪异的命令输出: stage, unstage • git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: README.txt # # Changes not staged for commit: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: README.txt # # Untracked files: # (use "git add ..." to include in what will be committed) # # hello.c 79 提交魔法 • 修改的文件没有提交? • 提交部分修改内容? ✓ git add -p • git diff 的怪现象 ✓ 无法看到修改文件的差异! • 添加后再修改 ✓ git diff ✓ git diff --cached • git add 命令 ✓ -u, -i, -p, -A 80 探索 .git/index • 如何判断本地文件修改了? ✓ .svn/Entries ✓ .git/index • 文件传送是在哪个阶段 ✓ svn add ✓ svn commit ✓ git add; 本地删除 ✓ git commit • 删除 .git/index 文件? 81 工作区、暂存区和版本库 82 暂存区和 diff命令 83 查看工作区、暂存区、版本库文件 • 工作区文件 ✓ ls ✓ cat • 暂存区文件 ✓ git ls-files -s -v --debug ✓ git show :0:path/to/file ‣ 提取冲突双方的文件有用 • 版本库文件 ✓ git ls-tree HEAD ✓ git show HEAD:path/to/file 84 85 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 演示: Git工作流( 1-2) 86 clone commit commit push fast- forward? pull conflict?mergetoolpush 是 是 否 否 add add rm mv clonecommit commit push add rm mv 问题 87 • 什么是快进和非快进? • 为什么⼀个人的版本库也会遭遇非快进式推送? • 如何冲突解决? • 不通过工具如何解决冲突? • 如何查看冲突文件的各个版本? • 树冲突如何处理? 非快进式推送 88 强制推送 89 非快进式推送 • 强制推送 ✓ git push -f • 覆盖自己的提交? ✓ 若其他人已经执行了 git fetch? • 覆盖他人的提交? ✓ 禁止强制推送? • 意外的强制推送 ✓ 强制推送只是针对当前分支么? ✓ 怎么办? 90 限制非快进式推送 • 非快进式推送适用场合 • 配置变量禁用非快进式推送 ✓ receive.denyNonFastForwards • Gitolite Repo ossxp/[a-z].* RW+ = jiangxin RW = dev1 dev2 91 92 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 合并:协同的必需操作 93 获取 ——git fetch 94 合并 ——git merge 95 推送 ——git push 96 Pull = Fetch + Merge (default) 97 集中式和分布式下的协同 98 • 集中式 ✓ 从服务器获取: git pull [origin master] ✓ 合并到本地工作区: git mergetool ✓ 推送到服务器: git push [origin] • 分布式 ✓ 从别人版本库获取: git pull URL master ✓ 合并到本地工作区: git mergetool ✓ 推送至服务器: git push [shared] 合并?冲突? • 无冲突合并 ✓ 成功的自动合并 ‣ 修改不同文件,或同⼀文件的不同区域 ‣ 文件改名以及修改内容 ✓ 含逻辑冲突 ‣ 包含的文件名被修改 ‣ 函数名或者调用更改 • 冲突合并 ✓ 文件的修改区域重叠 ✓ 树冲突:文件重命名冲突 99 手动冲突解决 • 提交被禁止 • 冲突在多个暂存区中标识 ✓ 查看暂存区: git ls-files -s ✓ 暂存区 1, 2, 3: git show :n:path/to/file • 文件中的冲突定界符 ✓ <<<<<<< , =======, >>>>>>> ✓ <<<<<<< , |||||||, =======, >>>>>>> ( merge.conflictstyle = diff3) • 标记冲突解决(消灭非零暂存区) ✓ git add 100 冲突解决 GUI • git mergetool • kdiff3 ✓ 若 kdiff3位于非标准路径 ‣ $ git config --global merge.tool kdiff3 ‣ $ git config --global mergetool.kdiff3.path /path/to/kdiff3 101 Kdiff3示例 102 Kdiff3示例 103 Kdiff3示例 104 Kdiff3示例 105 Kdiff3示例 106 git mergetool配置 • 遗留文件的清理 ✓ git config --global mergetool.keepBackup false • 自定义工具 ✓ git config --global merge.tool mymerge ✓ git config --global mergetool.mymerge.cmd '/usr/bin/ kdiff3 -L1 Base -L2 Local -L3 Remote --auto -o “$MERGED” “$BASE” “$LOCAL” “$REMOTE”' ✓ git config --global mergetool.mymerge.trustExitCode true 107 108 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 演示: Git工作流( 2-1) 109 clone commit commit push [-u origin XX] fetch origin push checkout -b XX request-pull merge [--ff-only] XXconflict? merge --abort fetch merge rebase 是 否 * cherry-pick 可能会遇到的问题 110 • 什么是分支?分支的创建和切换 • 为什么 git status不显示和远程分支的偏离 • 推送 XX分支,为何报告 master分支非快进推送? • 如何设置只推送当前分支? 引用:分支和 tag • refs/heads/*, refs/tags/* • HEAD ✓ 指向分支 ✓ 指向提交 • git branch ✓ git branch [] ✓ git branch -d | -D ✓ git branch -m | -M ✓ git checkout -b [] • git tag ✓ git tag -m, git tag -a ✓ git describe 111 分支的保护 • 重置分支的挽回 ✓ .git/logs/refs/heads/master • reflog命令 ✓ 新的表示法: master@{2} 112 113 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn HEAD和 Git检出 114 Git检出实践 • 取消本地修改:所有文件?单⼀文件? • 查看历史数据,反删除 • 可否修改历史数据?修改会怎样?如何防止对历 史改动的丢失? • 还原历史数据 • 切换分支 • 创建并切换分支 • Git检出相当于传统 VCS的? • Detached HEAD(分离头指针)? 115 detached HEAD • HEAD的内容 ✓ refs/heads/* : 分支 ✓ 40位提交 ID:分离头指针 • 如何出现分离头指针 ✓ git checkout commit ✓ git checkout tag • 找回分离头指针状态下的提交 116 117 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 演示: Git工作流( 2-2) 118 clone commit commit push [-u origin XX] fetch origin push checkout -b XX request-pull merge [--ff-only] XXconflict? merge --abort fetch merge rebase 是 否 * cherry-pick 版本范围表示法 • 研究工具: git rev-list ✓ A ✓ D F ✓ ^B C, B..C ✓ B ^C, C..B ✓ B...C, B...C ✓ B^@ ✓ B^! • git help --web rev-parse 119 提交审核 • 分支比较 ✓ git rev-list ..theirs ✓ git rev-list theirs.. ✓ git log ..theirs ✓ git log -p ..theirs ✓ git diff-tree HEAD theirs • 查看某⼀提交 ✓ git show COMMIT • 修改提交 ✓ git check XX = git checkout -t -b XX origin/XX 120 121 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 快进式合并 122 master master • git merge, git merge -ff other other 非快进式合并 123137 master • git merge --no-ff • 优点和缺点? master other other 快进式合并判别 124137 master other • git merge --ff-only master other✔ ✘ 使用 --ff-only 的场景 • 维护分支版本提升 ✓ git checkout maint ✓ git merge --ff-only master ✓ git tag -s -m “release 1.5” • 拒绝非快进式合并 ✓ 谁的分支,谁来合并 125 合并策略 • 合并两个分支: recursive ✓ 若冲突,选择我们的版本 : ‣ git merge -s recursive -X ours ✓ 若冲突,选择他人版本: ‣ git merge -s recursive -X theirs • 合并多个分支 ✓ 默认策略: octopus ✓ 强制使用我们版本: ‣ git merge -s ours 126 文件合并困境 • 文件既包含公共设置,又包含本地设置 ✓ 从模版中生成? • Topgit中的 .topmsg和 .topdeps文件 ✓ 属性: ‣ .topmsg merge=ours ‣ .topdeps merge=ours ✓ Git配置变量: ‣ [merge "ours"] ‣ name = \"always keep ours\" merge driver ‣ driver = touch %A 127 提交拣选 • 提交拣选 ✓ git cherry-pick • 拣选带来的问题 ✓ 分支偏离 ✓ 解决方法:重置 128 129 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 演示: Git工作流( 2-3) 130 clone commit commit push [-u origin XX] fetch origin push checkout -b XX request-pull merge [--ff-only] XXconflict? merge --abort fetch merge rebase 是 否 * cherry-pick Git重置 • 为什么要学习 Git重置( git reset)? • 特性分支经审核后发生偏离 • 已经学过的其他用途 ✓ 取消提交任务 ✓ 修正最近的提交 ✓ 合并最近的几个提交 ✓ 彻底删除某个提交 131 分支游标和git reset •$ git reset ① ② •$ git reset --soft ① •$ git reset --hard ① ② ③ 132 Git重置的应用 • 取消提交任务 ✓ 撤销整个提交任务 : git reset ✓ 不提交某文件了 : git reset -- • 修正最近的提交。如:提交说明写错了 ✓ git reset --soft HEAD^ ✓ git commit --amend # 不限于修改提交说明 • 合并多个提交 ✓ git reset --soft HEAD~2 • 彻底删除最近的提交 ✓ git reset --hard HEAD^ 133 重置误操作的补救: reflog • core.logallrefupdates ✓ 裸版本库有不同的设置 • Reflog 文件 • git reflog 命令 ✓ git reflog show [ref] • reflog引入的表示法 ✓ HEAD@{1} ✓ master@{5} 134 Git stash: 引用和 reflog的妙用 • 进度保存和恢复 ✓ git stash [save [-u] [-a] [] ✓ git stash ( pop | apply ) • git stash 综合了引用和 reflog技术 ✓ refs/stash ✓ logs/refs/stash • git-stash脚本,在哪里? 135 136 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 谁来合并 137 • 审核发布 ✓ 老程序员审核新程序员 ✓ “为什么不基于最新提交修改? ” ✓ 谁来合并? • 可以不产生合并提交么 合并 VS 变基 138 提交拣选 $ git reset --hard origin/master $ git cherry-pick F $ git cherry-pick G 139 变基 $ git rebase $ git rebase origin/master $ git rebase origin/master master 140 变基 $ git rebase master $ git rebase master topic 141 变基 $ git rebase --onto master next topic 142 变基 $ git rebase --onto master topicA topicB 143 变基 $ git rebase --onto D G $ git rebase --onto D G master 144 变基命令 • git rebase --onto • git rebase --onto • git rebase • git rebase • git rebase --continue • git rebase --skip • git rebase --abort 145 变基命令 • git rebase --onto • git rebase --onto [HEAD] • git rebase [--onto ] • git rebase [--onto ] [HEAD] • git rebase --continue • git rebase --skip • git rebase --abort 146 变基执行过程 • git rebase --onto ✓ git checkout .. ✓ git reset --hard ✓ cherry-pick from (2) 147 利用变基重整提交 • 移除历史提交 ✓ 整理之前: A---B---C---D---E---F---G ✓ 整理之后: A---B---E'---F'---G' • 使用 git rebase 可以实现(下面的命令等价): ✓ git rebase --onto B D G ✓ git rebase --onto B D • 如果遇到冲突 ✓ 使用 git mergetool 命令解决冲突 ✓ 然后执行 git rebase --continue 148 交互式变基 • git rebase [-i | --interactive] ... $ git rebase -i D^ pick 3488f2c move .gitignore outside also works. pick 48456ab add hello.h pick b6f0b0a modify hello.h # Rebase b3af728..b6f0b0a onto b3af728 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x , exec = Run a shell command , and stop if it fails # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. 149 用交互变基移除历史提交 • 整理之前: A---B---C---D---E---F---G • 整理之后: A---B---E'---F'---G' • 使用交互式变基 ✓ git rebase -i B ✓ 进入⼀个编辑界面(删除线是需要手工删除的行) pick Commit-log of pick Commit-log of pick Commit-log of pick Commit-log of pick Commit-log of # Rebase B..G onto B 150 用交互变基修改历史版本提交说明 • 例如对下面的历史提交 C的提交说明不满意 ✓ A---B---C---D---E • 使用 git rebase -i 命令 ✓ git rebase -i B ✓ 进入⼀个编辑界面(加粗是手工编辑替换的部分) reword Commit-log of pick Commit-log of pick Commit-log of # Rebase B..E onto B • 警告:改变历史,影响 “未来 ” 151 152 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn Git工作流( 3) 153 clone commit commit push [-u XX master] fetch XX push remote add XX URL request-pull merge [--ff-only] XX/masterconflict? merge --abort fetch origin merge rebase remote add XX URL 是 否 自助式建库 • 在特定的名字空间下建库 ✓ users//.git • 通过推送创建 ✓ git push git@server:users//.git master ✓ git remote add XX git@server:users//.git ✓ git push XX master • 授权管理 ✓ ssh git@server setperms users//.git ‣ WRITERS user1 user2 ‣ READERS user3 ‣ CTRL-D ✓ ssh git@server setperms ... < permissions.txt ✓ ssh git@server getperms users//.git 154 155 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn git remote • 什么是 origin ✓ Origin —— default remote • git remote vs git fetch url ✓ FETCH_HEAD ✓ refs/remotes/XX/* • Git remote命令 ✓ git remote [-v] ✓ git remote add name URL ✓ git remote set-url name NewURL ✓ git remote rename old new ✓ git remote rm name ✓ git remote update 156 远程分支 • git remote add..., git fetch..., then? ✓ git branch -r • 操作远程分支 ✓ git push ✓ git push : • 与远程分支合并 ✓ git merge • 建立跟踪 ✓ git push -u 157 连接远程服务器 • Git最常用的协议 ✓ https://user@server/path/to/repo.git ✓ user@server/path/to/repo.git ✓ git://server/path/to/repo.git • HTTP协议 ✓ ~/.netrc : ‣ machine login password • SSH协议是最重要的认证方式 ✓ 无口令的安全认证 ✓ 设置简单 158 搭建最简 Git服务器 • 客户端公钥管理 ✓ client> ssh-keygen -C user@email -f ~/.ssh/id_rsa ✓ ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub • 最简服务器搭建 ✓ server> sudo adduser git ✓ client> ssh-copy-id -i ~/.ssh/id_rsa git@server ✓ server> sudo usermod -s /usr/bin/git-shell git • 访问 Git版本库 ✓ client> git ls-remote git@server:/path/to/repo.git 159 160 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn Git工作流( 4) 161 init --bare clone file://... commit push remote add origin file://... commit init commit commit push -u origin master 本地建库 162 • 裸版本库 ✓ 无工作区 ✓ 无 index • 带工作区的版本库 ✓ 不能 push ✓ 可以 pull • 创建版本库 ✓ git init ✓ git init --bare • 裸版本库创建的其他方式 ✓ git clone --mirror U盘,两点同步 • ⼀端 ✓ git init --bare /mnt/of/usb/repos.git ✓ git remote add usb /mnt/of/usb/repos.git ✓ git push usb master • 另外⼀端 ✓ git remote add usb /cygdrive/e/repos.git ✓ git pull usb master • Vice versa 163 164 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn Git工作流( 5) 165 init commit commit format-patch push send-email conflict? clone am 否 mergetool add 是 补丁式协同 166 • 应用场景 ✓ 客户现场修改代码 ✓ 用邮件列表管理的项目,如: Linux, Git • 传统 diff/patch的局限 • git format-patch命令 • 补丁列表管理软件: quilt • Topgit: Quilt+Git 167 Git基础 20 min 20 min 分布式版本控制系统 工作流 1-1 80 min 30 min 基本命令及挑战 工作流 1-1 80 min 20 min 探索对象库工作流 1-1 80 min 30 min 古怪的暂存区 工作流 1-2 60 min 30 min 非快进式推送 工作流 1-2 60 min 30 min 合并和冲突解决 工作流 2-1 60 min 30 min 引用和分支 工作流 2-1 60 min 30 min 切换及检出 工作流 2-2 60 min 30 min 提交审核 工作流 2-2 60 min 30 min 拣选和合并 工作流 2-3 60 min 30 min 重建和重置 工作流 2-3 60 min 30 min 变基操作 工作流 3 40 min 20 min 自助建库 工作流 3 40 min 20 min 远程版本库 工作流 4 20 min 20 min 本地建库 工作流 5 20 min 20 min 补丁式协同 其他 20 min 20 min cli、gui、git-svn 安装 Git( Linux, 1/3) • 包管理器安装 ✓ git? git-core? ✓ 还有: git-svn, git-email, git-gui, gitk, git-doc • 源码编译 ✓ make prefix=/usr/local all doc info ✓ sudo make prefix=/usr/local install \ install-doc install-html install-info 168 安装 Git( Linux, 2/3) • 命令行好帮手 ✓ Tab, Tab Tab ‣ 子命令、参数补齐 • Bash Completion没有安装? ✓ 文件: /etc/bash_completion.d/git ✓ 运行: . /etc/bash_completion ✓ 交互式登录 shell 和 ~/.bash_profile ✓ 交互式非登录 shell 和 ~/.bashrc ‣ screen / byobu 169 安装 Git( Linux, 3/3) • 中文问题的由来 • 中文支持 (utf-8) ✓ git config --global core.quotepath false • 中文支持 (gbk) ✓ git config --global core.quotepath false ✓ git config --global i18n.logOutputEncoding gbk ✓ git config --global i18n.commitEncoding gbk 170 安装 Git( Mac OS X) • Xcode (with builtin git) • http://code.google.com/p/git-osx-installer/ • 源码编译 ✓ Homebrew ‣ brew install asciidoc ‣ brew install docbook2x ‣ brew install xmlto ‣ md5sha1sum, gnupg ... ✓ Git ‣ make all doc info ‣ make install install-doc install-html install-info 171 安装 Git( msysGit, 1/2) • 原生 Windows 应用 • 是乌龟 Git基础 • 仅包含有限 Linux 应 用移植 • 但提交说明和 /或文 件名非 UTF-8字符 172 安装 Git( msysGit, 2/2) • msysGit ✓ 网址: http://code.google.com/p/msysgit/ ✓ 软件包: ‣ Git-1.7.8-preview20111229-unicode.exe ‣ Git-1.7.8-preview20111229.exe ‣ PortableGit-1.7.9-preview20120201.7z ‣ msysGit-fullinstall-1.7.9-preview20120201.exe 173 使用 msysGit( 1/2) • MSYS的 shell环境的中文支持 ✓ 中文输入 ‣ /etc/inputrc set meta-flag on set input-meta on set output-meta on set convert-meta off ✓ $ export LESSCHARSET=utf-8 ‣ echo 您好 | less ✓ ls 命令的中文文件名支持 ‣ alias ls=”ls --show-control-chars” 174 使用 msysGit( 2/2) • Git的中文支持 ✓ 尽量不要使用中文文件名 ✓ 显示中文文件名 ‣ git config --system core.quotepath false ✓ 若要使用中文日志 ‣ 标题不用中文 ‣ 设置正确的字符集 git config --system i18n.commitEncoding gbk git config --system i18n.logOutputEncoding gbk 175 安装 Git( Cygwin) • setup.exe:安装程序和包管理器 ✓ http://cygwin.com/setup.exe • 包括 Linux下大部分软件的移植 ✓ git ✓ git-completion ✓ git-gui ✓ git-svn ✓ gitk ✓ stgit • cygwin1.dll 176 Cygwin 177 Cygwin 178 Cygwin Local cache 179 Cygwin apt-cacher-ng 180 Cygwin 181 Cygwin 182 Cygwin 183 Cygwin 184 Cygwin 185 Cygwin 186 Cygwin 187 使用 Cygwin • mount 和盘符 • Home主目录⼀致性问题 (HOME, /etc/passwd) ✓ cygwin.bat: set HOME= • 命令行补齐忽略大小写 ✓ ~/.inputrc: set completion-ignore-case on • 忽略文件可执行位 ✓ git config --system core.fileMode false • 中文支持 ✓ git config --global core.quotepath false 188 Cygwin中的 SSH 189 • Cygwin ✓ Openssh不稳定?可换用 PuTTY • Plink.exe + Pageant • 或封装 plink.exe ✓ 脚本( ssh-agent.sh) #!/bin/sh /cygdrive/c/Program\ Files/PuTTY/plink.exe -T -i \ c:/cygwin/home/user/.ssh/mykey.ppk $* ✓ 设置环境变量 GIT_SSH ‣ export GIT_SSH=/path/to/ssh-agent.sh git-gui • gitk • git gui • git citool • git difftool • git mergetool • qgit • gitg 190 Gitweb 191 192 TortoiseGit TortoiseGit 193 • 下载 ✓ http://code.google.com/p/tortoisegit/ • 版本库 ✓ http://repo.or.cz/w/TortoiseGit.git TortoiseGit 194 PuTTYgen 195 196 EGit EGit 197 • Update site: ✓ http://download.eclipse.org/egit/updates • 用户手册 ✓ http://wiki.eclipse.org/EGit/User_Guide 198 Git基本命令综述 git config • 三个级别的配置文件 ✓ $ git config --system -e ✓ $ git config --global -e ✓ $ git config -e • 配置文件的格式 • 读取和设置配置变量 • 操作任意文件 ✓ git-svn ✓ Gistore 199 git init • git init • git init --bare • git init --separate-git-dir 200 git clone • git clone • git clone --bare • git clone --mirror • git clone --separate-git-dir • git clone –config = 201 git add (1) • 哪些文件需要添加? • 如何防止文件误添加? ✓ 文件 .gitignore ✓ 文件 .git/info/exclude • 忽略文件示例 # 这是注释行 —— 被忽略 *.a # 忽略所有以 .a 为扩展名的文件 !lib.a # 但是 lib.a 文件或者目录不要忽略 /TODO # 只忽略根目录下的 TODO,子目录的 TODO 不忽略 build/ # 忽略所有 build/ 目录下的文件 doc/*.txt # 忽略 doc/notes.txt,但 doc/server/arch.txt不忽略 202 git add (2) • git add -u • git add -A • git add -i • git add -p • git add -f 203 git grep • git grep pattern • git grep pattern -- 204 git mv • git mv = git rm + git add 205 git clean • git clean -n • git clean -f -d • git clean -f -x • git clean <> git rm 206 git commit • git commit -m “message” • git commit -s, --signoff • git commit ... • git commit -a • git commit -p • git commit –allow-empty • git commit --amend 207 git status • git status -s • git status --ignored 208 git diff (1) • git diff • git diff --cached • git diff -- • git diff --stat • git diff --binary 209 git diff (2) • GNU diff/patch的局限 • 非 git目录的比较 • 二进制支持 • git apply 210 git format-patch • git format-patch • git am ... 211 git log • git log --stat • git log --graph • git log --pretty=[short|medium|full|fuller] • git long --oneline • git log --decorate 212 git annotate • git annotate [-L n,m] • git blame • git bisect ✓ 《 Git权威指南》 P152 213 git cat-file, git show • git cat-file -t • git cat-file -s • git cat-file -p • git cat-file • git show object 214 git rev-parse • git rev-parse --git-dir • git rev-parse --show-cdup • git rev-parse --show-prefix • git rev-parse --show-toplevel • git rev-parse --is-bare-repository • git rev-parse HEAD@{1} 215 git reset • git reset --soft • git reset --hard • git reset --misc 216 git stash • git stash save [-u] [-a] [] • git stash show • git stash apply • git stash pop • git stash drop • git stash clear 217 git checkout • git checkout • git checkout . • git checkout • git checkout -- 218 git archive • git archive --format=tar -o • git help archive, see examples 219 git branch • git branch • git branch -r • git branch -a • git branch • git branch ( -d | -D ) • git branch ( -m | -M ) 220 git tag (1) • git tag • git tag [] • git tag -d • git tag -m “message” [] 221 git tag (2) • git tag -s -u • git tag -v • gpg ✓ gpg --list-keys ✓ gpg --gen-key 222 git tag (3) • git describe [] • git describe --tags • git describe --dirty • git log --decorate 223 git merge • git merge • git merge --squash • git merge --no-ff • git merge --ff-only • git mergetool 224 git pull • git pull ✓ 《 Git权威指南》 P293 ✓ branch..remote = ✓ branch..merge = refs/heads/ ✓ branch..rebase = true • git pull 225 git push • git push ✓ 《 Git权威指南》 P292 ✓ branch..remote = ✓ remote..pushurl = • git push • git push • git push : 226 git-svn 工作流 227 SVN转换为 Git 228 • git svn clone -s SVNURL localdir • git svn clone = git svn init + git svn fetch ✓ git svn init -T trunk -b branches -t tags URL localdir ✓ git svn fetch -r 600:HEAD • 日志中的 “git-svn-id:” ✓ --no-metadata Q&A • 书目 ✓ http://www.worldhello.net/gotgit/ ✓ http://www.worldhello.net/gotgithub/ • Q&A ✓ http://weibo.com/gotgit ✓ http://q.weibo.com/567527 229
还剩228页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 14 人已下载

下载pdf

pdf贡献者

zy_open

贡献于2013-03-25

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!