• 1. Git基础培训 2012-02-19
  • 2. Git 的特性直接记录快照,而非差异比较 去中心化. 近乎所有操作都是本地执行 (离线操作) 时刻保持数据完整性(SHA-1 哈希值) 多数操作仅添加数据 分支功能简单实用 快速 文件流转的三个工作区域: 工作目录,暂存区域,以及本地仓库为什么使用Git?
  • 3. GIT配置配置git的用户信息 $ git config --global user.name $ git config --global user.email 此时配置的分别是你个人的用户名称和电子邮件地址, 将在commit log中体现. --global选项为全局配置, 将会成为默认设置, 在所有git项目中生效. 此时设定信息保存在用户主目录的.gitconfig文件中. 如果只想在单个git项目中配置, 去掉--global即可, 此时设定信息保存在.git/config文件中 查看配置信息 要查看已有的git配置信息, 可以使用 git config --list命令 或者查看具体属性值. $git config user.name 查看配置的用户名称
  • 4. Git文件系统文件的流转过程: 1. 在工作目录中修改某些文件。 2. 对修改后的文件进行快照,然后保存到暂存区域。 3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。文件的三种状态: 已提交(committed)-- 本地仓库(repository) 已暂存(staged)-- 暂存区域(staging area) 已修改(modified)-- 工作目录(working directory)
  • 5. git数据迁移示意图
  • 6. 取得项目的git仓库在工作目录中初始化新仓库 要对现有的某个项目开始用git管理, 只需在项目的顶级目录执行git init $git init 或 git init --bare 加上--bare选项时只初始化一个git目录, 不保存项目文件. 通常用来作为中心库.clone一个远程仓库 $git clone @:/.git [] 如果不指定, 默认使用命名
  • 7. 检查当前文件状态要确定哪些文件当前处于什么状态,可以用 git status 命令. 在取得一个git仓库后, 执行git status会看到如下界面: 存在以下三种状态 Changes to be commited <已暂存尚未提交> Changes not staged for commit <已跟踪的文件修改后尚未暂存> Untracked files <尚未跟踪的文件>
  • 8. 查看提交历史git log查看提交历史 在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看。 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面 包含以下信息内容: commit hash(SHA-1 校验和) 作者的名字和电子邮件地址 提交时间 最后缩进一个段落显示提交说明 progit2-3 使用图形化工具查阅提交历史 1. git自带的工具:在项目工作目录中输入 gitk 命令 2. eclipse插件使用show history
  • 9. Git基本操作git add 将文件加入到暂存区域 git commit 将暂存区域的文件提交到版本库, 加上-a选项则将已跟踪但未暂存的文件也包括在内. git rm 删除文件. --cached选项只删除索引, 保留文件, 即恢复成untracked状态
  • 10. 远程库操作提交到远程库 $git push origin master orign为默认远程分支 master为默认本地分支 可手动指定, 也可在gitconfig中指定默认远程配置, 即可直接使用git push 获取更新 1. git fetch & git merge git fetch [remote-name] 从远程仓库中拉取所有你本地仓库中还没有的数据. 需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能通过执行git merge命令合并 2. git pull (= git fetch + git merge) git pull命令相当于git fetch + git merge, 即从远程仓库中拉取所有你本地仓库中还没有的数据, 并自动合并到当前工作分支. progit2-5
  • 11. 处理冲突希望合并修改内容 git fetch git merge origin/master a) 修改内容未提交时, 会提示不能merge, 需要先commit或移除文件或恢复修改 b) 如果有冲突, 并且不能自动合并, 会提示冲突, 手工编辑解决冲突后, git add标记下, 然后即可git commit 希望替换(用远程版本替换本地) 还原本地修改分两种情况 a) 修改未提交: git checkout HEAD b) 修改已提交: git reset --hard HEAD 还原至上一个提交
  • 12. 撤销操作修复未提交文件中的错误(重置) 如果你现在的工作目录(work tree)里搞的一团乱麻, 但是你现在还没有把它们提交; 你可以通过下面的命令, 让工作目录回到上次提交时的状态(last committed state): $ git reset --hard HEAD 这条件命令会把你工作目录中所有未提交的内容清空(当然这不包括未置于版控制下的文件 untracked files) 也可用git checkout HEAD 来恢复文件或目录, 命令将从HEAD中签出并且把它恢复成未修改时的样子 git checkout -- 是从暂存区签出内容并恢复. 注意区别. 修复已提交文件中的错误 如果你已经做了一个提交(commit),但是你马上后悔了, 这里有两种截然不同的方法去处理这个问题: 1.撤销旧的提交 (会丢失此次提交中的修改内容, 但当前工作区的修改仍保留) $ git revert HEAD 2. 修改旧提交 (不能修改已提交文件的内容, 只能加入新的提交文件或修改提交注释) 如果你刚刚做了某个提交(commit), 但是你又想马上修改这个提交; git commit 现在支持一个叫--amend的参数,它能让你修改刚才的这个提交(HEAD commit). 这项机制能让你在代码发布前,添加一些新的文件或是修改你的提交注释(commit message).
  • 13. Git -- reset篇意义: 是要reset到指定commit位置的状态. 可以做到只消去commit 但不消去已更动的file内容 也可以同时消去commit和file的内容 可以从staging area拿回来,就是说add之后还可以取消 用法: git reset 前一个SHA值(不要reset你要rollback的那个commit,是没用的) git reset --soft HEAD^: 退到上上一个commit的状态, stage和working tree的修改都会保留 git reset --mixed: 只保留working tree的修改,而stage和commit都会回退 git reset --hard: 不只退回commit, 连working tree的档案内容都会退回上一个commit git reset -- : 从指定commit中恢复指定到暂存区, 本地修改不丢失 TIP: 根据--soft --mixed --hard,会对working tree和index和HEAD进行重置。 git reset [] -- []可以对单个文件或目录使用, 恢复指定path在HEAD的内容. working tree的内容不变. git reset无法在push以后作. 不管如何已经push出去的就不能取消了. 所以已经git push的就只能用git revert 思考: git reset --soft HEAD为什么是无意义的操作?
  • 14. Git -- revert篇意义: file rollback 并且自动产生一个roll back的commit (所以commit会往前不会退后) 用法: git revert HEAD: 将这个commit的file内容回到前一次commit,会产生一个新的revert commit log git revert HEAD^: 承上,回到前前一个的commit git revert : 取消指定commit的提交,内容会变成此commit之前的状态,一样产生一个新的revert commit log 加上-n选项后, 可以避免强制提交. TIP: 这个命令要求工作区是干净的(与指定commit中的文件无冲突) 工作区相对于指定commit新增文件的修改在revert后仍保留
  • 15. 思考题 :修改指定commit中的指定文件Q:在一次commit中提交了a和b两个文件的修改, 但是实际上只应该提交对于a的修改,b的修改希望留在本地,以后再提交 A: 1. git reset. 但是已经PUSH的不能恢复 $git reset -- 从指定commit中恢复指定到暂存区, 同时本地修改不会丢失. 这样再次commit之后HEAD中保存的内容实际上是暂存区已恢复的内容. 2. git revert, 这样做会导致b的本地修改丢失. 1).$git revert -n 2).$ git reset HEAD a.txt 3).$ git checkout -- a.txt 思考: 这两种方法为什么能实现这样的结果.
  • 16. Git diff比较版本差异Git 比较不同版本文件差异的常用命令格式: git diff 查看尚未暂存的文件更新了哪些部分 git diff --cached 查看已暂存的文件和上次提交的版本之间的差异 git diff HEAD 查看未暂存的文件和上次提交的版本之间的差异 git diff ffd98b b8e7b0 查看某两个版本之间的差异 流程分析: 将 Current working directory 记为 (1) 将 Index file 记为 (2) 将 Git repository 记为 (3) 他们之间的提交层次关系是 (1) -> (2) -> (3) git add完成的是(1) -> (2) git commit完成的是(2) -> (3) git commit -a两者的直接结合 从时间上看,可以认为(1)是最新的代码,(2)比较旧,(3)更旧 按时间排序就是 (1) <- (2) <- (3) git diff得到的是从(2)到(1)的变化 git diff –cached得到的是从(3)到(2)的变化 git diff HEAD得到的是从(3)到(1)的变化
  • 17. 文件忽略要忽略文件,只要把文件名加入到.gitignore文件中就可以了。git会忽略此文件中列出的文件, 不进行跟踪和提示. 在加入.gitignore之前已跟踪的文件, 需要先在版本库中删除索引(rm --cached). 支持通配符, 每行一个. 如果只是想忽略在当前本地的repository的文件,则可以把文件名字加入到.git/info/exclude就可以了. 内容规则同.gitignore
  • 18. GIT文件机制在项目根目录中有一个隐藏目录.git, 其中有几个比较重要的文件和目录需要解释一下: HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息,那么HEAD就表示根; refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令'git show-ref'更清晰地查看引用信息; logs目录根据不同的引用存储了日志信息。 因此,Git只需要代码根目录下的这一个.git目录就可以记录完整的版本控制信息
  • 19. Thank you