git使用

https://git-scm.com/book/zh/v2

三种状态

好,请注意。 如果你希望后面的学习更顺利,记住下面这些关于 Git 的概念。 Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。

git初始化

安装-----Google it

为每一台电脑配置身份信息

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
把某个目录变成可以让git管理到的目录(创建版本库)
git init
git基本命令
#把内容输入到一个文件
echo "xxxx" > xxxx
#把工作空间的某个文件添加到cache
git add xxxx
#把工作空间的所有内容添加到cache
git add -A
#把cache当中的某个文件提交到本地库
git commit -m "xxxx"
#all
git commit -am "xxxx"
#cache ---->work file恢复一个文件 file1 file2 恢复两个文件  .恢复所有文件
git checkout readme.txt
#git状态查询
git status
#查看不同的地方 默认查看工作区和cache
#git diff --cached 比较cache和Repository
#git diff HEAD 工作区和最新的Resository
#git diff commit-id 工作区和制定的repository
#git diff --cached commit-id
#git diff --commit-id commit-id
git diff
#reset 顾名思义 (HEAD~100)
git reset HEAD^
#git的日志
git log git log --pretty=oneline
#oh my pretty pretty boy i love you
git reflog 查看历史命令
#git rm --cached file_path
git rm
git mv
#远程仓库的克隆岛本地库
git clone
#关联远程仓库
git remote add
#推送到远程仓库
git push
#拉取远程仓库的内容
git pull
#查看当前分支 -a查看所有分支 -av 查看所有分支的信息 -avv 查看所有分支的信息和关系
git branch
#创建一个分支 基于当前分支创建分支
git branch xxx
#基于oldType创建分支
git branch newBranch oldType
#切换分支
git checkout 分支的名字
#删除分支
git branch -d xxx
#查看文件内容
git cat-file -p commitid
#查看对象类型 blob commit tree
git cat-file -t commitid
 
github
  1. $ ssh-keygen -t rsa -C "email" //public key for push
  1.  git remote add nickName gitUrl // conn remote
  1. git push -u remoteBranch localBranch
分支

查看分支

创建分支

基于当前分支创积分分支
基于远程分支创建分支
基于新分支创建分支
基于提交创建分支
 
其实都是基于commit创建分支

合并分支

一定要切换到被合并的分支上去合并

比如说A要合并A1

那么先要切换到A1,然后在A1上面执行merge

git原理

find .get/objects -type f 查询object是下面所有的文件

git hash-object -w xxx 放到git数据库并且返回hash值 add操作?

git 对象

  1. Blob 对象
存储的是文件内容,压缩的
文件名字是根据内容算出的一个hash值
  1. tree对象
blob对象
子tree对象
  1. commit对象
作者提交者注释
指向一个 tree 的指针

首次提交,提交一个简单的文件 a.txt ,commit 之后的图如下

如图所示,生成了 3 个对象,一个 commit 对象,一个 tree 对象,一个 blob 对象。图上蓝底是 commit 对象,灰底的是 tree 对象,白底的是 blob 对象,每个对象节点的标题是对象的 key (SHA 摘要)缩略表示。 对于 commit 对象,tree 内容表示这个 commit 对应根目录的 tree 对象,parent 表示父 commit 节点,通常commit 只有一个父节点,也可能没有(首次提交时 parent 为空),也可能有多个(合并节点),commit 对象还保存了 commit message 等信息。 对于 tree 对象,里面的内容包含了文件名,文件对应的 blob 对象的 key,或者是目录名和目录对应 tree 对象的 key。 对于 blob 对象,表示一个实际文件对象的内容,但不包括文件名,文件名是在 tree 对象里存的。

通过 git log 命令获取最新 commit 的 key

通过 git cat-file -p <object key> 获取 key 对应 object 的内容,根据 object 里的内容,继续探索,就可以访问到所有关联 object.

 

 

HEAD 为什么要通过 refs/heads/master 中转一下,而不是直接指向 master 分支的提交?

每个分支的头指针都指向该分支的最新提交
但是此时出现一个 dev 分支,刚从 master 检出,头指针和 master 相同,HEAD直接指向提交的话,怎么知道,当前工作分支是 master 还是 dev 呢?

HEAD 可以直接指向提交吗?

但是会进入一种特殊的状态 detached HEAD。
detached HEAD,游离的 HEAD 指针。
使用 git checkout <commit id> 成功的进入了
detached HEAD 状态:
 
得出结论,当 HEAD 指针直接指向提交时,就会导致 detached HEAD 状态。在这个状态下,如果创建了新提交,新提交不属于任何分支。相对应的,现存的所有分支也不会受 detached HEAD 状态提交的影响
example:
排查问题的时候,checkout 到怀疑的 commit 点上去做些测试,detached HEAD会保护你的现有分支不受影响,测试完了不想保存直接 checkout 到其他地方,可以放弃修改。想保存修改,可以创建一个 git checkout -b <new-branch-name> 新分支保存
 

分支指针切换

远程仓库

基于文件共享(nfs)

linux ssh

装好git yum install git

git地址:username@ip:/dir

密码

gitlab

https://about.gitlab.com/installation/#centos-7

传上去

gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm

安装 rpm -ivh /home/tools/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm

sudo gitlab-ctl reconfigure 时间很少8-10分钟

 gitlab-ctl start 启动gitlab

访问gitlab http://ip:port

设置密码

对git与svn进行区别总结:svn是对文件的一个操作,而git是对元数据的操作。如果是两个文件一模一样,但是名字不一样,对于svn来说会存储两个文件,但是对于git来说是两条分支(commit对象指向tree对象再指向blob对象)

路神:https://shimo.im/docs/ERE3UoWQa2gwH20w/read  

原文地址:https://www.cnblogs.com/gnwzj/p/10747240.html