Git 教程看这一篇就够了

基础杂项

Git基础概念

* 客户端并不只是提取最新版本的文件快照,而是把代码仓库完整的镜像下来
* git核心本质上是一个键值对数据库。可以向该数据库插入任意类型的内容,他会返回一个键值,通过该值可以在任意时刻再次检索该内容。

区域&对象

区域

* 工作区 (沙箱环境 git不会管理 随便更改操作)
​
git add
​
* 暂存区  (记录文件的操作)
​
git commit 
​
* 版本库   (最终的代码实现提交到这里 .git目录就是版本库)

对象

* Git对象
    - echo "hello" | git hash-object --stdin 
     - 这句命令返回一个hash值用来标识这句话 但是并没有写到数据库中  
     - 内容不一样对应的hash值不一样
​
    - echo "hello" | git hash-object -w --stdin
     - 这句命令返回一个hash值用来标识这句话 并写到数据库中  
     - 查看有没有存在 可以通过 find ./ -type f 找对应hash的文件
     - 里面的内容是压缩的 通过 git cat-file -p hash注意前面的那两个字母也加上
     - git cat-file -t hash 查看git对象的类型 blob
​
    - 将新创建的文件添加到git数据库中即生成一个git对象
     - git hash-object -w ./a.txt
​
    - 如果文件更改git数据库里面不会自动的添加要手动添加过去 这时会在添加一个git对象
     - git hash-object -w ./a.txt
    
    - 实质上Git对象是一个KYE:VALUE hash/value    
    - git对象不能当作项目的一次快照 只是组成项目的一部分
​
    - 存在的问题?
     - 记住文件的每一个(版本)对应的hash值并不现实
     - 在git中,文件名并没有被保存,只能通过hash
​
    - 注意:此时的操作只是针对本地数据库进行操作,不涉及暂存区。
​
​
* 树对象
    * 树对象能够解决文件名保存的问题,也允许我们将多个文件组织到一起。
​
    * 构建树对象
     - git update-index --add --cacheinfo 100644 915c628f360b2d8c3edbe1ac65cf575b69029b61 test.txt
     - 文件模式为100644 表明这是一个普通文件
     - 文件模式为100755 表明这是一个可执行文件
     - 文件模式为120000 表明这是一个符号连接
     -  --add 因为此前该文件并没有在暂存区中 首次要加add
     -  --cacheinfo 因为要添加的文件在git数据库中,没有位于当前目录下
​
    * 暂存区做一个快照生成一个对象放到git数据库中
     - git write-tree
        对象类型是一个树对象
        树对象里面的内容是暂存区的快照(项目的快照)
    * 暂存区中文件名字不变 如果改变文件的内容,就会重新生成一个hash
​
    * 存在的问题?
     - 不知道hash值对应的是哪一个版本
     - 不知道这个版本的一些基础信息    
​
* 提交对象    
    - 提交对象完美的解决了上面的问题
    - 本质就是给树对象做一层包裹包含项目的基础信息
    - commit-tree创建一个提交对象,为此需要指定一个树对象的hash值,以及该提交的父提交对象  
    - echo "second commit" | git commit-tree     019fb2c522b604cd94929085bbac93d60e2f2063 -p  d248eb19a125c
​
    - 真正代表一个项目的是一个提交对象(数据和基本信息)这是一个链式的!! 

基础Linux命令

* clear 清除屏幕
* echo 'hello word '>test.tet 命令台书写内容
* ll 将当前目录下的子目录展现出来
* find ./ 将当前目录下的子目录以及文件也展现出来
* find ./ -type f 只讲文件展现出来
* rm text.txt 删除文件
* MV a.txt b.txt 更名字
* cat a.txt 查看文件内容
* vim a.txt 编辑内容 i 插入 ese : wq 保存退出 :set nu 设置行号 q! 强制退出不保存

.git目录下文件的介绍

* hooks (钩子函数的一个库 类似于回调函数)
* info (包含一个全局性的排除文件)
* objects (目录存储所有数据内容)
* refs (目录存储指向数据(分支)的提交对象的指针)
* config (文件包含项目特有的配置选项)
* description (显示对仓库的描述信息)
* HEAD (文件目前被检出的分支)
* logs (日志信息)
* index (文件保存暂存区的信息)

Git命令

1. 初始化本地仓库

git init
# 会在目录中生成.git隐藏文件夹,存放本地库相关的子目录和文件,不要随意修改删除

2. 设置签名

目的:区分不同开发人员的身份

可以设置两种不同的级别:项目级别、系统用户级别。项目级别>系统用户级别

# 设置项目级别
git config user.name xxx
git config user.email [email protected]
# 设置系统用户级别
git config --global user.name xxx
git config --global user.email [email protected]

信息保存位置

项目级别:.git/config 文件中的 [user]节点中

系统用户级别:~/.gitconfig 文件中的 [user]节点中

3. 基本操作

1. 状态查看

git status

可以查看工作区、暂存区的状态

2. 添加操作

git add [file name]

将工作区的“新建/修改”添加到暂存器

取消(删除)添加操作

git rm --cached [file name]

3. 提交操作

git commit  -m "commit message" [file name]

将暂存区的内容提交到本地库

4. 查看历史记录

# 查看所有提交完整记录
git log
# 简洁方式显示
git log --pretty=oneline
# 更加简洁方式显示
git log --oneline
# 在--oneline 基础上增加了回退版本的步数
git reflog

5. 版本控制

5.1 使用索引

配合git reflog命令一起使用

# 回退和前进版本
git reset --hard [索引号]

5.2 使用^异或符号

注意:只能后退版本

# 一个^符号代表一个版本,
git reset --hard HEAD^
# 回退三个版本
git reset --hard HEAD^^^

5.3使用~波浪线符号

注意:只能后退版本

# 后退三个版本
git reset --hard HEAD~3

5.3 reset命令三个参数对比

  • --soft 参数

    • 仅仅在本地库移动HEAD指针(文件不会做修改)

  • --mixed参数

    • 在本地库移动HEAD指针

    • 重置暂存区

  • --hard参数

    • 在本地库移动HEAD指针

    • 重置暂存区

    • 重置工作区

6. 恢复文件

通过提交的方式删除了某个文件,可以通过回退历史记录的方式来找回删除的文件

git reset --hard [未删除文件的索引号]

7. 比较文件差异

git diff

查看所有文件的差异

git diff [文件名]

默认比较暂存区

git diff [本地库励志版本] [文件名]

将工作区的文件和本地库历史记录比较

8. 分支管理

同时并行推进多个版本的开发,提高开发效率

各个分支开发过程都是独立,如果失败不会对其他分支造成影响

8.1 创建分支

git branch [分支名]

8.2 查看分支

git branch -v

8.3 切换分支

git checkout [分支名]

8.4 合并分支

第一步:切换到接受修改的分支上

git checkout [被合并分支名]

第二步:执行merge命令

git merge [新内容分支]

8.5 产生冲突

不同分支进行合并时,同文件修改会产生冲突

  1. 找到冲突的文件,编辑该文件,删除git特殊的符号

  1. 把文件修改成正确的,保存退出

  2. git add [文件名]

  3. git commit -m "日志信息"

    • 注意:此时commit一定不能带具体文件名

github团队协作

1. 创建远程库地址别名

# 查看当前所有远程地址别名
git remote -v 
git remote add [别名] [远程地址]

2. 推送

git push [别名] [分支名]

3. 克隆

git clone [远程地址]

完整的把远程库下载到本地 创建 origin 远程地址别名 初始化本地库

4. 拉取

pull = fetch + merge

fetch:将远程库内容拉取到本地,但不修改工作区的内容

merge:合并分支操作

git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]

如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。

拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

4. 跨团队协作

  1. 将远程代码fork一份到自己的仓库中

  2. 修改代码,推送到远程

  3. New pull request

  4. Create pull request

  5. 然后被fork端可以进行 merge pull request->Confirm merge

SSH登陆

  • 进入当前用户的家目录 cd ~

  • 删除.ssh 目录 rm -rvf .ssh

  • 运行命令生成.ssh 密钥目录 ssh-keygen -t rsa -C [email protected] [注意:这里-C 这个参数是大写的 C]

  • 进入.ssh 目录查看文件列表 cd .ssh ls -lF

  • 查看 id_rsa.pub 文件内容

    cat id_rsa.pub

  • 复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG keys

  • New SSH Key

  • 输入复制的密钥信息

  • 回到 Git bash 创建远程地址别名 git remote add origin_ssh [email protected]:xxxxx.git

  • 推送文件进行测试

你可能感兴趣的:(Git)