Git学习

写在前面:最近看了一个关于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。

Git三大对象

Git学习_第1张图片

主要说明在上一节已有描述具体看图。

Git的基本流程

  • 在工作区新建或修改了文件。
  • git add xx.xx ;把文件提交到暂存区
  • git commit -m "XXX" ;把暂存区的文件提交到本地仓库
  • git log ;查看提交日志

文件管理

Git学习_第2张图片

  • 文件添加

    • 添加一个文件: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

    Git学习_第3张图片
    Git学习_第4张图片
    Git学习_第5张图片
    永远不要衍合已经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
    • 提交可以找回,但是分支是找不回的。

远程仓库

远程仓库是指托管在因特网或其他网络中的你的项目的版本库。

本地仓库于远程仓库的通信协议有三种:

  • 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
  • 推送到远程仓库: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

你可能感兴趣的