Git对象类型
Git有四种基本的对象类型,包括:
- blobs: 每个blob代表一个版本文件,blob只包含文件的数据,而忽略文件的其他元数据,如:名字、路径、格式等。
- trees:每个tree代表了一个目录的信息,包含了此目录下的blobs,子目录(对应于子trees),文件名、路径等元数据。因此,对于有子目录的目录,git相当于存储了嵌套的trees。
- commits:每个commit记录了提交一个更新的所有元数据,如:指向的tree、父commit、作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当时提交的目录信息,一个commit可以有多个(至少一个)父commit。
- tags: tag用于给某个上述类型的对象指配一个便于开发者记忆的名字,通常用于某次commit。
Git工作流程
- 在工作目录中修改某些文件。
- 对修改后的文件进行快照,然后保存到暂存区域
- 提交更新,将保存在暂存区域的文件快照永久存储到Git目录中。
Git基本操作
- git clone
拷贝完整的Git仓库,.git文件夹下包含所有Git需要的数据和资源。(服务器上有的数据克隆之后本地也都有了。这样的话,即使服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆的状态) - git init
在某个项目所在目录中执行git init,可以实现对这个项目的Git管理。 - vim index.html
创建和编辑一个新文件index.html,保存退出后运行git status 会看到该文件出现在未跟踪的文件列表中。 - git status
确定文件当前所处状态(刚克隆就执行,nothing to commit,这时工作目录没有任何文件) - git add index.html
跟踪一个文件index.html,运行git status,会看到该文件已经被跟踪,并处于暂存状态。 - git commit –m “提交说明”
在文件都已经暂存起来的情况下,可以提交更新。
提交后的信息,说明当前是在master分支提交的,还有本次提交的SHA-1校验和,一级本次提交中,有多少文件修订过,多少行添加和删改过。
Git是使用SHA-1算法计算数据的校验和,通过对文件的内容或目录的结构计算一个SHA-1哈希值,它是一个40位的字串(十六进制) - git log
会按提交时间列出所有的更新,最近的更新排在最上面。列出了每次更新的一个SHA-1校验和、作者名字和电子邮件地址、提交时间、提交说明。 - git push <远程主机名> <本地分支名>:<远程主机分支名>
- git push orgin master
把本地的master分支推动到origin服务器上(因为克隆操作会自动使用默认的master和origin名字) - vim index.html
- git diff
查看没有暂存的文件更新了那些部分,不加参数直接输入git diff
—代表源文件
+++代表目标文件
通常工作目录中的文件被当做目标文件来看待。
-开头的行是只出现在源文件中的行
+开头的行是只出现在目标文件中的行
空格开头的行,是源文件与目标文件都出现的行 - git diff –cached
查看已经暂存起来的文件和上次提交的快照之间的差异 - git reset HEAD
取消暂存 - git checkout –
打开文件进行修改,然后取消修改
vim index.html
git add . - git rm
从工作目录中删除文件 - git rm –cached
仅从跟踪清单中删除,而保留在当前工作目录 - git rm –f
强制删除某文件
远程仓库:要参与任何一个Git项目的协作,必须了解远程仓库的概念。远程仓库就是指托管在网络上的项目仓库,这些仓库是有读写权限的,有些你只能读,有些可以写。和别人协作开发某个项目时,需要管理这些远程仓库,以便推送和拉取数据,分享各自的工作进展。 - git remote
查看当前配置有哪些远程仓库,会列出每个远程库的简短名字(克隆完某个项目之后,至少可以看到一个名为origin的远程库,git默认使用这个名字来标识你所克隆的原始仓库) - git remote –v
显示远程仓库对应的克隆地址 - git fetch
抓取远程仓库上有的,但本地仓库没有的信息
Git分支
分支就是你可以在开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,这是一个非常昂贵的过程,因为他们需要创建一个源代码目录的完整副本,对于大型项目来说这会发费很长时间。
Git的分支非常轻量级,它的新建操作可以在瞬间完成,并且在不同分支之间的转换也特别快。Git鼓励在工作流程中频繁使用分支和合并。
Git分支的第一张ppt:在Git中提交时,会保存一个提交(commit)对象,这个对象包含一个指向暂存内容快照的指针,包含本次提交的作者、提交者等信息。工作目录中有三个文件,准备将他们暂存后提交,暂存操作会对每个文件计算校验和(SHA-1字串)。
这次的提交对象会包含上次提交对象的指针。
- git branch testing
新建一个testing分支
Git 需要知道你当前在哪个分支上工作,所有它保存一个名为HEAD的指针,HEAD指向当前你正在工作中的本地分支。 - git checkout testing
将HEAD切换到testing分支
vim index.html修改之后提交,展示ppt(此时master和testing的位置)
转到master分支,修改index.html, git add ,git commit - git merge testing
将testing中修改的内容合并到master分支
发生冲突是因为,在master和testing的分支里都修改了同一个文件的同一部分。Git就没法自动合并,这时需要自己删改。
======隔开的上半部分是HEAD指向的分支中的内容,下半部分是在testing分支中的内容。解决冲突的办法是二选一或者亲自整合到一起。 - git branch
后面不加参数,会给出当前所有分支的清单(*表示HEAD当前指向的分支) - git branch –d
删除分支