首页 > 其他分享 >git进阶

git进阶

时间:2022-12-17 11:55:05浏览次数:56  
标签:origin git 进阶 本地 push 远程 分支

Table of Contents

  1. github
  2. 合并add和commit
  3. 版本穿梭(回退commit)
  4. troubshot
  5. git的三种状态
  6. 恢复
  7. git log
  8. 标莶
  9. git stash
  10. git blame a.txt
  11. 起别名: git config –global alias.ch checkout
  12. git gc 压缩
  13. git裸库(没有工作区的工作仓库,存在于服务端)
  14. submodule(子模块)
  15. subtree

github

  • git remove add origin https://github.com/*/*.git
    为网站取一个origin别名

  • git remove show 查看所有远程仓库的别名

  • git remove show origin 查看别名origin的信息

    • HEAD branch: main
      远程仓库就是本地的main
  • git push -u origin master
    本地的master分支与远程做关联,仅初次使用,以后只用git push就行了

    • -u: –set-upstream
  • 本地感知远程分支
    origin/master

  • 生成ssh密钥(ssh keys)

    • ssh-keygen
    • ~/.ssh
      • knownhosts显示已登录的网站
    • 远程增加ssh的公钥时 1. 删除回车符 2.可写权限
  • 将本地push到远程失败

    error: failed to push some refs to ’[email protected]:*/*.git’

    • 原因: 远程的提交链更前(有人已经推送过),导致本地分支与远程分支冲突
    • 先拉取下来: fetch/pull,再提交解决冲突
      • 这时git status会显示现分支比远程分支多两次提交
        第二个人冲突代码的提交,第二个人解决冲突的提交
        • 这里假设有两个人pull了相同的远程库,第一个人提交了自已的代码到远程库,此时远程库和第一个人一致,第二个人提交了自已的代码到本地库,这里是一次本地的提交,此时若提交到远程库会冲突,因此只能先pull/fetchAndmerge,并解决冲突,这里有一次本地的提交,就有了两次本地的提交,若再push,会再第二个人的本地提交前插入第一个人的提交,若第一个人再pull,就为fast forward(与远程库在同一条提交链上,且远程在前)
        • 总结:
          • 第二个人push完成后的远程log为: 第一个人的提交->第二个人的提交->解决冲突的提交
    • git fetch
      将远程拉到本地的origin/master(本地感知远程分支)
      • 此时git status会显示落后几个提交点
      • fetch拉取到origin/master,merge本地分支和origin/master
  • 推送新分支dev,test

    1. git push -u origin dev
    2. git push –set-upstream origin test
    3. git push origin dev:dev #本地:远程
  • 拉取新分支dev,test

    1. 二步
      1. git pull 会拉取远程分支到本地感知远程分支
      2. 关联本地分支和本地感知远程分支
        1. git checkout -b dev origin/dev
          创建并切换到dev,并关联到origin/dev
        2. git chechout [-b test] –track origin/test
          省略本地分支名: git checkout –track origin/test
    2. 一步
      • git pull origin dev:dev
      • git fetch origin master:refs/removes/origin/master #远程分支为master,本地分支为helloworld
  • 删除远程分支

    • git push origin :test
    • git push origin –delete dev
    • 删除本地没有的追踪分支
      1. 检测: git remove prune origin –dry-run
      2. git remove prune origin
  • 本地:远程

    • git push origin src:dest
      HEAD分支是当前分支,git push origin HEAD:dest

      • .git/head文件是指向refs的当前分支

      把本地src分支推送到远程的dest分支

    • git push origin :dest
      把本地src分支推送到远程的空(删除分支)

    • 推送标签

      • git push origin v3.0:v3.0
      • git push origin refs/tags/v3.0:refs/tags/v3.0
  • 清理无效的本地感知远程分支(本地没有)

    prune – delete all stale tracking branches for a remote

    1. 检测: git remove prune origin –dry-run
    2. git remove prune origin

合并add和commit

git commit -am ’注释’
不能用于第一次提交

版本穿梭(回退commit)

  1. git reset –hard HEAD^^ 回退二次
  2. git reset –hard HEAD~n 回退n次
  3. git reset –hard sha1 通过sha1值回退
  4. git checkout sha1
    1. 进入游离状态(detached HEAD)
    2. 修改必须提交
    3. 创建分支的好时机
      git chechout mybranch sha1
      为已提交的commit创建一个分支,sha1是已提交的commit,即mybranch指向sha1

troubshot

  1. 未commit之前,不能切换分支

    Please commit your changes or stash them before you switch branches.
    Aborting

    • 在功能未开发完毕前,不要commit,别人拿到代码运行不了
    • 临时保存现场再切换分支
      git stash
      • 恢复现场
        1. 查看:git stash list
        2. git stash pop
        3. git stash apply(还原现场但不删除现场)
  2. 重写最后一次提交说明
    git commit –amend -m

  3. 分支fast forward

    • 如果一个分支靠前(dev),另一个落后(master).则台果不冲突,master可以通过merge直接追赶上dev,称为fast forward
    • 跳过的中间commit,仍然会保存
    • 两个分支归于一点(丢失分支信息)
    • 没有分支信息
      • 禁止fast forward: git merge –no-ff(no fast forward)
        • 两个分支,不会归于一点(主动合并的分支 会前进一步)
          • git log –graph 查看分支信息
        • 分支信息完整(不丢失分支信息)
  4. 合并分支冲突(git merge dev)
    两个分支不在同一提交链上

    • git add 告知git,冲突已解决
    • master在merge时,如果遇到冲突,并解决,则解决冲突会进行2次提交: 1次是最终提交,1次是将对方dev的提交信息也拿来了
  5. 回退之后,git log就不见了
    查看所有操作记录: git reflog

  6. 查看最近一次提交
    git log -1

  7. 分支重命名
    git branch -m master main

  8. git diff

    • 不加文件名: 比较暂存区和工作区的差异
    • 加sha1值: 比较对象区和工作区的差异
    • git diff head: 比较对象区和最新一次工作区的差异
    • git diff –cached sha1: 比较对象区和暂存区的差异
    • git diff –cached head: 比较最新对象区和暂存区的差异
  9. 切换到本地感知远程分支

    • git chechout origin/master
      • 游离分支(detached HAED),一般建议,不要修改,是一个只读分支
      • 换完之后,它不会用分支名,只是一个提交点(sha1)
        • 杳看: cat .git/head
    • 查看本地及远程分支
      • git branch -a[v]
        • 绿色本地,红色远程(代表只读)
        • -av: 查看本地及远程分支各自的提交点
  10. git status出现远程信息

    Your branch is ahead of ’origin/master’ by 1 commit

    • git branch -av: 查看名自的commit
    • git push将本地更新到远程
  11. clone仓库不需要git init
    远程自带.git

    • git clone [email protected]:用户名/仓库名.git
      • 默认将仓库名作为项目名
      • 指定项目名
        git clone [email protected]:用户名/仓库名.git 项目名
      • 通过git clone下的项目第一次提交可以直接git push
        • 之前的git push -u已经被纳入版本库
  12. 查看本地是否过期(是否是最新)

    • git remote show origin

      master pushes to master (local out of date)

      • local out of data说明本地过期
      • 吏新本地: git pull
  13. 冲突可能原因

    1. git merge 分支名(两个本地分支的冲突)
      不同分支merge,同时分支不在同一个提交链

    2. git pull(本地分支和远程分支的冲突) pull = fetch + merge
      当本地分支与远程分支不在同一个提交链(之前被push,导致远程分支前进了提交链)

    3. git stash pop/apply(两个被modified文件的冲突)

      git stash会回到未修改状态(上一个提交点)

      当修改过文件(git status有modified)

    4. 前三种都需要解决冲突

      1. 修改冲突文件并add
      2. commit已经解决冲突的文件
  14. 查看远程sha1值

    • git log origin/master
      路径是.git/refs,origin代表远程仓库地址
    • git log remotes/origin/master
    • git log refs/remotes/origin/master
      • .git/refs: 本地分支和远程分支的sha1值,还有标签(tags)

git的三种状态

  1. modified
  2. staged
  3. commited

恢复

  • 放弃暂存区staged -> modified
    1. git reset HEAD
    2. git restore –staged
  • 放弃工作区modified -> commited
    1. git checkout –
      git checkout – * 放弃全部工作区
    2. git checkout
    3. git restore

git log

  • -num: 查看n个log
  • –pretty=oneline
  • –graph
    查看图形日志

标莶

在 git show v1.0 两种标签指向都是commit的sha1值

  • 查询
    1. git tag -l ’v2.0’
    2. 模糊查询: git tag -l ’v*’
  • 创建
    1. 简单标签: git tag v1.0
      .git/refs/tags/v1.0中是commit的sha1值
    2. 带注释标签: git tag -a v2.0 -m “”
      .git/refs/tags/v2.0保存的是一个对象,包含了当前的commit的sha1值
  • 推送标签
    • git push origin v1.0
    • 同时推送多个: git push origin v1.0 v2.0 v3.0
    • 全部推送: git push origin –tags
    • 完整写法
      git push origin v3.0:v3.0
      git push origin refs/tags/v3.0:refs/tags/v3.0
  • 拉取
    • git pull
      git push不同推送标签,git pull可以拉取标签
      如果远端新增标签,则pull可以将新增的标签拉去到本地;如果远程是删除标签,则pull无法感知,只能git tag -d手动删除
    • git fetch origin tag v4.0
  • 删除远程标签
    git push origin :v6.0
  • 删除本地标签
    git tag -d

git stash

git stash会回到未修改状态(上一个提交点)

  1. 查看: git stash list
  2. 恢复: git stash pop
  3. 恢复: git stash apply(还原现场但不删除现场)
  4. 指定恢复现场: git stash apply stash@{0}
  5. 起名: git stash save ’mystash’
  6. 删除: git stash drop stash@{0}

git blame a.txt

查看a.txt的所有提交的sha1值,以及每一行的作者

起别名: git config –global alias.ch checkout

不同于alias名令

git gc 压缩

  • 压缩并删除.git/refs到.git/packed-refs
  • 压缩之前 .git/objects 是保存的是commit植的两个前缀,压缩之后,多了一个pack文件夹,里面的文件是二进制
  • 带注释标签在packed-refs中占两行,commit值在第二行(以开头)

git裸库(没有工作区的工作仓库,存在于服务端)

git init –bare

submodule(子模块)

应用场景: 在一个仓库中,引用另一个仓库的代码

  • git submodule add [email protected]:*/B.git
    在A库引用B库(A文件夹套B文件夹)
    • 通过远端联系
    • 同步子械块
      1. 如果B库修改,需要在B文件夹 git pull 后,才能同步了模块,推到远程还需要add commit
      2. git submodule foreach git pull
        遍历pull所有子模块并,推到远程还需要add commit
  • git clone ~ –recurisive
    克隆带子模块的版本库
  • 删除子模块
    1. git rm –cached B
      删除暂存区
    2. rm -rf B
    3. rm -rf .gitmodules
    4. git add .
    5. git commit -m ’删除B子模块’
    6. git push

subtree

  1. 起别名: git remote add subtree-origin [email protected]:*/*.git
  2. git subtree add -P subtree subtree-origin master
    增加名为subtree的子工程,它的仓库地址是subtree-origin,它的master分支
  3. 同步: git subtree pull -P subtree subtree-origin master

标签:origin,git,进阶,本地,push,远程,分支
From: https://www.cnblogs.com/evil520/p/16988806.html

相关文章

  • 高级前端进阶(七)
    最近行程码下线了,核酸检测也取消了,但是新冠病毒仍然存在,加上也是流感爆发时期,大家注意防护!!!阳性无症状,你可能并没有真的感染新冠,新冠病毒是比普通流感病毒要厉害的,会导致发......
  • GIt分布式管理工具
    Git(分布式版本控制工具)Git的学习是不依赖我们前面学习的知识,就算没有学习java也可以学习Git就是一个类似于百度云盘的仓库重点是要掌握使用idea操作Git,企业用的最多,一般......
  • Git命令的使用
    Git命令 设置用户签名gitconfig--globaluser.name用户名gitconfig--globaluser.email邮箱初始化本地库在目录内打开GitBashHeregitinit查看本地库状......
  • git基本操作
    1、常见命令1.1、gitinit用来初始化一个Git仓库,执行完命令后会生成一个.git目录1.2、编辑git配置文件gitconfig--globaluser.name“用户名”/gitconfig--glo......
  • hualinux 进阶 vue 5.0:vue UI组件介绍及Element UI
    目录​​ 一、vue流行的UI介绍​​​​1.1un-app所有前端框架​​​​1.2pc浏览器​​​​1.3 小程序mpvue​​​​1.4移动端​​​​1.5 桌面端(客户端)Electron ​​......
  • 2、运行Git前的配置
    一般在新的系统上,我们都需要先配置下自己的Git工作环境。配置工作只需一次,以后升级时还会沿用现在的配置。当然,如果需要,你随时可以用相同的命令修改已有的配置。​​git-c......
  • 1、Git的安装及基本工作流程
    基本的Git工作流程如下:1.在工作目录中修改某些文件。2.对修改后的文件进行快照,然后保存到暂存区域。3.提交更新,将保存在暂存区域的文件快照永久转储到Git目录中。......
  • git使用Git 常用命令
    Git常用命令 仓库 #在当前目录新建一个Git代码库$gitinit#新建一个目录,将其初始化为Git代码库$gitinit[project-name]#下载一个项目和它的整个代码......
  • git克隆指定tag版本
    如果需要克隆指定tag或者分支版本可以按照下面这个方式克隆gitclone-b0.8.0https://gitee.com/mirrors/Nacos.git上面这个克隆可以拆分为以下四个部分: 1.这个......
  • git上上传项目
    1.注册账户以及创建仓库要想使用github第一步当然是注册github账号了。之后就可以创建仓库了(免费用户只能建公共仓库),CreateaNewRepository,填好名称后Create,之后会......