写在后面:最近看了一个对于Git的教程,对Git的各项操作有了较全面的理解,当然和理论工作还有差距,在此做一个小结义工之后温习。
Git的介绍和装置就不在赘述。
Git本地仓库的创立及配置
抉择一个文件门路进入命令行输出git init
,及实现了一个本地仓库的初始化。此时会生成一些暗藏文件夹,对象库和配置文件等都在其中。
而后进行一些根本信息的配置
git config --global user.name "输出姓名"git config --global user.email “输出邮箱”git config --global color.ui true //此处是关上色彩差别选项
Git三大逻辑区
- 工作区:以后分支下新建或批改文件的中央,当切换到不同分支工作区会刷新。文件状态有两种:untracked,tracked
版本库:
- 暂存区:及index,当执行
git add .
时,工作区的所有文件被提交到暂存区,objects会生成若干个blob对象,暂存区只是对他们的索引(指针)。 - 仓库:当执行
git commit -m "提交信息"
时,会生成一个commit对象,外面蕴含了提交者的信息、指向blob的指针,指向上一次提交的指针等,若提交的内容中有子文件夹,则会蕴含tree对象,tree对象中的内容为指向子文件夹中文件绝对应的blob。
- 暂存区:及index,当执行
Git三大对象
次要阐明在上一节已有形容具体看图。
Git的根本流程
- 在工作区新建或批改了文件。
- git add xx.xx ;把文件提交到暂存区
- git commit -m "XXX" ;把暂存区的文件提交到本地仓库
- git log ;查看提交日志
文件治理
文件增加
- 增加一个文件:git add file.c
- 增加所有文件:git add .
- 作用:将文件增加进暂存区,文件进入tracked状态
文件提交
- 单步提交:git commit -m " commit infor"
- 一次性提交:git commit -a
- 批改最初一次提交:git commit --amend
- 作用:将暂存区的所有内容提交到仓库
文件删除
从工作目录和暂存区删除:git rm -f file.c
- 删除并提交后,该文件就不再被版本库追踪,然而版本库中依然有这些文件的快照
- 从暂存区中删除,工作目录中保留:git rm --cached file.c
从版本库中删除:版本回退到谬误提交前的版本
- 撤销到暂存区:git reset --soft SHA1
- 撤销到工作区:git reset --mixed SHA1
文件重命名:git mv old_name new_name
- 相当于创立(拷贝)新文件,删除旧文件
设置疏忽文件
有些文件(编译的两头文件、临时文件)不想被提交。
手动创立.gitignore文件,在文件中编辑,上面是一些举例:# 正文*.[ao] #疏忽某种格局结尾文件例如a或o!clib.a #某个库文件除外,不疏忽*~ #疏忽临时文件/text #疏忽根目录下的某个文件libs/ #疏忽某个目录下的所有文件
编辑实现后提交到仓库即可实现。
差别比拟
比拟工作区和暂存区差别:git diff
- 查看尚未暂存文件有哪些新的批改
比拟暂存区和版本库差别
- git diff --cached [HEAD]
- git diff --staged SHA
- 比拟工作区和版本库差别:git diff HEAD(或者SHA1)
- 比拟两个版本之间差别:git diff SHA1 SHA2
压缩仓库:git gc
- 在日常运行中,git快照会占用磁盘空间,Git会在增量存储单元中存储批改,节俭磁盘空间。
分支治理
分支的实质是指向commit的一个指针。
一个我的项目在master上进行演进提交,当多人合作开发或bug修复时,须要从master上开拓一条新分支,当工作实现时,再合并到master上。
创立分支:
- git branch new_branch #必须要在master上
- git checkout –b new_branch #创立并跳转到新分支上,必须要在master上
- git checkout –b new_branch old_branch
- 查看分支:git branch [-a]
切换分支:git checkout branch_name
- 切换分支时,工作区和暂存区的文件应全副commit,否则会切换失败
- 分支重命名:git branch –m oldbranch newbranch #参数-M为强制转换
- 删除分支:git branch –d branch #-D强制删除
分支合并:git merge test #合并test分支到以后分支
- 若合并过程中发生冲突,则应手动解决抵触,再commit提交即可。
压合合并:git merge --squash test
- 将一个分支上的所有历史合并为一个提交,然
后合并到另一个分支上,个别bug或新性能分支都能够应用这种形式合并。
- 将一个分支上的所有历史合并为一个提交,然
筛选合并:
- 筛选一个提交,增加到以后分支
git cherry-pick SHA
(SHA为筛选的提交的哈希值)
- 筛选一个提交,增加到以后分支
分支衍合:扭转以后分支的基分支。举个例子,当master分支再版本A2时创立了一个新分支dev,而后master分支持续演进到A3,dev分支也在演进,当dev分支想更新基于master分支的版本时:
git checkout dev
git rebase master
如果有抵触,则解决抵触,而后
git add .
git rebase --continue
此时dev的基分支为master的A4
永远不要衍合曾经push到公共仓库的更新分支批改储备
- 保留以后分支的数据,切换到别的分支去:
git stash
- 复原以后分支数据:
git stash apply
- 当屡次应用stash命令时,查看储备队列
git stash list
,清空储备队列git stash clear
,复原某次储备git stash apply stash@{数字}
- 保留以后分支的数据,切换到别的分支去:
复原已删除的分支提交/脱离组织的提交
- 分支删除的实质:分支这个指针曾经删除,但commit对象还存在,只是脱离了commit链表而已,变成了悬空对象。
操作步骤
- 先找到脱离链表的commit:
git fsck --lost-found
- 查看是否时想要复原的哪个commit:
git show SHA
- 衍合:
git rebase SHA
- 先找到脱离链表的commit:
- 提交能够找回,然而分支是找不回的。
近程仓库
近程仓库是指托管在因特网或其余网络中的你的我的项目的版本库。
本地仓库于近程仓库的通信协议有三种:
- SSH协定:同时反对读和写的网络协议,Git默认应用的网络协议。
- Git协定:Git自带的网络协议:实用于不须要对读进行受权的大型项目。
- HTTP/HTTPS协定。
SSH密钥生成:
- 用户目录下查看有没有.ssh文件夹
- 应用命令生成:
ssh-keygen -t rsa –C "邮箱"
- 私钥保留在用户目录下,SSH连贯服务器时应用
- 公钥放到服务器,服务器不同配置管理不一样
本地治理命令:
- 验证key是否增加胜利:
ssh –T git@github.com
- 从近程仓库克隆:
git clone repo_addr
- 增加近程仓库:
git remote add origin 仓库地址
从近程仓库拉取数据:
- 主动本地master分支并跟踪近程仓库master分支:
git clone origin
- 只拉取到本地,不合并:
git fetch
- 主动拉取分支更新:
git pull
- 主动本地master分支并跟踪近程仓库master分支:
- 推送到近程仓库:
git push origin master
- 在本地查看近程仓库信息:
git remote -v
- 删除本地的近程仓库的链接:
git remote rm 名字例如origin
- 近程仓库重命名:
git remote rename old_name new_name
远程管理命令:
近程分支创立,将本地新建分支间接推送到近程仓库:
git push origin local_branch:remote_branch
- 近程仓库没有这个分支,将创立这个分支origin/remote_branch
- 并将本地分支和近程分支建设关联,当前能够间接push
基于近程分支建设一个本地关联分支:
git checkout –b local_branch origin/remote_branch
- 建设关联后,就能够间接进行pull和push
删除近程分支:
git push origin :remote_branch(近程分支名)
标签
标签是一个援用,标签对象能够指向任何对象,通常状况下,是指向一个提交(commit)。
- 在以后分支的末端创立轻量级标签:git tag v0.1
- 给指定某个commit打标签: git tag V0.2 SHA
- 删除标签:git tag -d v0.1
- 推送标签到近程:git push origin v0.2
- 推送所有标签:git push origin --tags
删除近程标签:
- 先删除本地:git tag -d v0.1
- 在删除近程:git push origin :refs/tags/v0.2