Git思维导图

本文参考Git中文手册绘制的思维导图,如有不正之处,欢迎留言指正。

在这里插入图片描述

git

基础

特性

  • 直接记录快照,而非差异比较
  • 多数操作仅添加操作
  • 近乎所有操作都是本地执行
  • 时刻保持数据完整性

工作流程

  • 在工作目录(workspace)中修改某些文件

    • modified
  • 用add命令对修改后的文件进行快照,然后保存到暂存(index)区域

    • staged
  • 提交更新(commit),将保存在暂存区域的文件快照永久转储到 Git 目录中,指向HEAD(最后一次提交的结果/local repository)

    • committed

安装完git后的配置

设置git 的username 和mail

生成ssh密钥

  • 查看是否有密钥

    • cd ~/.ssh,若没有则会报无此文件或文件夹,有的话直接复制公钥(id_rsa.pub);没有的话新生成一个
  • 生成密钥

  • 复制公钥(id_rsa.pub)

  • 把公钥添加到gitlab

    • 登录gitlab,在settings里搜SSH Keys,新建一个并把它复制到key
  • 测试是否成功

    • windows下直接右键点"git bash here",输入" ssh -T [email protected]",在警告代码输入yes,能显示"Welcome to GitLab",OK。

简单使用

取得项目的 Git 仓库

  • 在工作目录中初始化新仓库

    • git init
  • 从现有仓库clone

    • git clone [email protected]:/path/to/repository

    • 本质

      • 自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)

快照

  • workspace的文件状态

    • tracked

      • 被纳入版本控制管理的文件,在上次快照中有它们的记录

      • 类型

        • unmodified

          • 白,已commit
        • modified

          • 蓝,未add
        • staged

          • 绿, 已add,未commit
      • 初次clone某个仓库时,工作目录中的所有文件都属于tracked文件,且状态为unmodified。

    • untracked(红,未add)

      • 没有snapshot也不在index,一般为新建文件
  • 添加需要追踪的新文件和待提交的更改

    • add
  • 查看有何改动

    • status

      • 查看上次提交之后被修改的文件
    • diff

      • 查看具体修改了什么内容

        • git diff [version]
  • 将快照记录下来/将改动提交到local repository

    • commit

    • 生成commit-id

      • 每次commit命令都会在local repository生成一个40位的哈希值
  • 撤销

    • git reset

      • 从local repository回滚到index,直接删除指定的commit

      • 若上次commit有问题,想修改

        • git reset HEAD^

          • 回到前一版本,保留工作空间的修改
      • git reset -soft

        • 把changes 直接加到staging area(暂存区)
      • git reset -hard

        • 不留staging area 也不留working tree(完全删除任何修改记录),放弃所有更改

          • 可用于merge发生冲突,想放弃
    • git revert

      • 用一次新的commit来回滚之前的commit
    • git checkout

      • 从index复制到workspace

      • git checkout HEAD

        • 从local repository复制到workspace
  • 将文件从缓存区移除

    • git rm

标签

  • 给当前版本做个标记以便回退到该版本,就不用记冗长的sha1码,记那个tag标签就好

  • 列显已有的标签/查看版本

    • git tag

    • 筛选出1.4.2系列的

      • git tag -l ‘v1.4.2.*’
  • 新建

    • 轻量级(lightweight)

      • 指向特定提交对象的引用,只是临时性加注标签,或者不需要旁注额外信息,可以用它

      • 什么选项都不用写

        • git tag v1.4-lw
    • 含附注(annotated)

      • 存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用GNU Privacy Guard (GPG)来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息

      • -a(取annotated的首字母)

        • 例: git tag -a v1.4 -m ‘my version 1.4’

          • -m

            • 指定了对应的标签注释
            • 若没有给出,git会让你输入
  • 查看相应标签的版本信息,查看某一次提交更新了什么

    • git show v1.4
  • 分享标签

    • 默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库

      • git push origin [tagname]
      • 例:git push origin v1.5
    • 一次推送所有本地新增的标签

      • git push origin --tags

日志

  • 了解本地仓库的历史记录

    • git log

      • 更详细的

        • git log --author=name

          • 某一个人的提交记录
        • git log --pretty=oneline

          • 压缩后的每一条提交记录只占一行的输出
        • git log --graph --oneline --decorate --all

          • 用ASCII 的树形结构来展示所有的分支, 每个分支都标示了它的名字和标签
        • git log --name-status

          • 查看哪些文件改变了

分支

创建仓库的时候,master 是“默认的”分支,把它push到remote repository其它人才能访问到

查看分支

  • 查看本地分支

    • git branch
  • 查看远程分支

    • git branch -r
  • 查看所有的分支

    • git branch -a

创建本地分支

  • git branch name

    • 新分支创建后不会自动切换为当前分支

新建并切换到该分支

  • git checkout -b new_branch

    • 相当于执行下面两条命令

      • git branch new_branch
      • git checkout new_branch

删除分支

  • git branch -d new_branch

    • 只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的
    • 想强制删除一个分支,可以使用-D选项

更新与合并

  • pull=fetch(获取) + merge(合并)

  • git merge name

    • 把name这个分支和当前所处分支合并

远程仓库的使用

查看当前的远程库

  • git remote

    • 列出每个远程库的简短名字,默认origin
  • git remote -v

    • 显示对应的克隆地址,v:verbose.若有多个将全部列出

查看远程仓库信息

  • git remote show [remote-name]

添加远程仓库

  • git remote add origin

    • 例: git remote show origin

远程仓库的删除和重命名

  • 修改某个远程仓库在本地的简短名称

    • git remote rename pb paul

      • 把 pb 改成 paul
  • 删除

    • git remote rm paul

从远程仓库抓取本地没有的数据到本地仓库,但没merge

  • git fetch [remote-name]

推送数据到远程仓库

  • 建议push前先获取远程仓库最新代码,先fetch查看是否有更新,不建议直接pull

    • why

      • 别人push后,有可能会代码冲突
    • 若fetch后没有更新

      • 可放心pull,再push
    • 有更新

      • 查看差异

        • git diff

          • 对比workspace与index
        • git diff HEAD

          • 对比workspace与最后一次commit(local repository)
      • 查看和自己的是否有冲突,没有则可pull,再push

      • 有冲突

        • revert

          • 把本地冲突代码备份,revert,再pull
          • pull成功,把自己备份的代码copy到相应地方再commit、push
        • stash

          • git操作

            • git stash
            • git pull
            • git stash pop
            • 再重新add commit push
          • pycharm实际操作

            • stash changes
            • pull
            • unstash changes
  • 若嫌麻烦没查看是否有更新,直接push失败

    • 是否有读写权限?

    • 同一时刻有没有其他人在push?

    • 若在自己push前其他人已经push,必须pull,再commit、push

      • 参考上面提到的