Git

293 阅读7分钟

零散的点

  1. Git中文乱码
    • 可以使用Git Bash,不会乱码
    • 修改配置,百度下
  2. 引用
    • 引用就是指向某个commit的指针,或指向某个指针的指针
  3. HEAD
    • 是1个引用
    • 永远指向当下的位置
    • HEAD通过分支指向了commit
      //HEAD指向了main分支,main分支指向了commit(df1bcaba8c485ea7eeb2458002dd2559614293ff)
      //引用origin/main 指向了commit(df1bcaba8c485ea7eeb2458002dd2559614293ff)
      //引用origin/HEAD 指向了commit(df1bcaba8c485ea7eeb2458002dd2559614293ff)
      commit df1bcaba8c485ea7eeb2458002dd2559614293ff (HEAD -> main, origin/main, origin/HEAD)
      Author: HuanHaiLiuXin <472868476@qq.com>
      Date:   Sun Oct 4 10:30:10 2020 +0800
      
          老子也想看
      
  4. 分支
    • 创建分支: git branch feature1
      //HEAD依然指向 main分支
      //feature1 也指向了 commit(df1bcaba8c485ea7eeb2458002dd2559614293ff)
      commit df1bcaba8c485ea7eeb2458002dd2559614293ff (HEAD -> main, origin/main, origin/HEAD, feature1)
      Author: HuanHaiLiuXin <472868476@qq.com>
      Date:   Sun Oct 4 10:30:10 2020 +0800
      
          老子也想看
      
    • 切换到新分支 feature1
    • 切换分支,只是将HEAD从1个分支指向另1个分支
      //HEAD指向了feature1分支, feature1分支指向了commit df1bcaba8c485ea7eeb2458002dd2559614293ff
      //HEAD的指向,从main分支换到了feature1分支
      commit df1bcaba8c485ea7eeb2458002dd2559614293ff (HEAD -> feature1, origin/main, origin/HEAD, main)
      Author: HuanHaiLiuXin <472868476@qq.com>
      Date:   Sun Oct 4 10:30:10 2020 +0800
      
          老子也想看
      
  5. git pull
    • origin/-- 分支
      • origin是远程仓库的名称
      • origin/-- 分支是远程仓库分支的本地镜像
      • origin/-- 分支不是在本地直接操作的,一般在push/pull/fetch成功后自动更新
      • origin/HEAD: 这是一个永远跟随 origin/main 的引用,它最大的作用是用来标记默认分支
      //origin/HEAD 永远跟随 origin/main 证明:
      1:上一次push成功后
      //HEAD -> main, origin/main, origin/HEAD 都指向同一个commit
      commit 66ad5140520b814935bfd5ba7e99e67023414331 (HEAD -> main, origin/main, origin/HEAD)     Author: HuanHaiLiuXin <472868476@qq.com>
      Date:   Sun Oct 4 13:53:57 2020 +0800
      
          房租也高
      
      2:本地修改,提交一次commit//HEAD -> main 指向最新提交
      //origin/main, origin/HEAD还是指向之前的commit
      commit 6a6af9d246ae0530f7db4c5a3b104c27e48dc287 (HEAD -> main)
      Author: HuanHaiLiuXin <472868476@qq.com>
      Date:   Sun Oct 4 14:48:32 2020 +0800
      
          测试origin/HEAD
      
      commit 66ad5140520b814935bfd5ba7e99e67023414331 (origin/main, origin/HEAD)
      Author: HuanHaiLiuXin <472868476@qq.com>
      Date:   Sun Oct 4 13:53:57 2020 +0800
      
          房租也高
      3:再次push成功后
      //HEAD -> main, origin/main, origin/HEAD 都指向最新push成功的commit
      commit 6a6af9d246ae0530f7db4c5a3b104c27e48dc287 (HEAD -> main, origin/main, origin/HEAD)     Author: HuanHaiLiuXin <472868476@qq.com>                                                     Date:   Sun Oct 4 14:48:32 2020 +0800
      
          测试origin/HEAD                       
      
    • git pull 示意图
  6. git push
    • git push 示意图
    • git push成功后,本地仓库中的origin/HEAD的指向不一定会变化.
    • 只有push的是远程仓库的默认分支/main分支, origin/HEAD的指向才会变化.
  7. commit
    • 本质上是当下提交距离上一次commit的改动
  8. git add
    • 将指定文件,或全部变动文件放到暂存区
    • 暂存区:待commit的内容暂时存放的地方
  9. 分支
    • branch本质上是一个引用,即指向某个commit的指针
    • branch只和它当下指向哪个commit有关
    • 默认分支,仓库的默认分支是master,main,默认分支可以修改
      • git clone拉取仓库,默认checkout的就是默认分支
      • 执行push命令,远程仓库的HEAD永远跟随默认分支,而不是和本地仓库HEAD同步,即只有push默认分支到远程仓库,远程仓库的HEAD才会移动
  10. git merge
    • merge就是合并,用于将当前commit和指定commit进行合并,创建为1个新的commit
    • 当下位于main分支,将feature1的变动合并到main分支上: git merge feature1
    • 1.首先本地仓库将feature1的更改merge到main分支,然后push到远程仓库,push成功的示意图
    • 2.若main分支执行merge后,远程main分支已经有新的commit,则push会失败,这种情况,需要重新pull,并再次push.
      git checkout main
      git pull origin main
      git merge feature1
      //首次push失败,因为git merge后远程main分支提交了新的commit
      git push origin main
      //需要再次pull
      git pull origin main
      //然后再次push
      git push origin main
      
  11. 删除本地分支
    • git branch -d 分支名称
  12. 删除远程分支
    • git push origin --delete 远程分支名称
  13. git rebase
    • git rebase -i 其他分支名称
  14. git reset
    • git reset --hard 会将当前分支指向对应的commit,并丢弃本地修改
  15. git add -i 同一文件的多出修改,多次提交
git add -i
patch
指定文件序号,回车
y+回车:选用当前块
n+回车:不用当前块
s+回车:把当前块做自动切分后再重新询问
  1. tag
    • tag一般用于标记版本号
    • 创建tag
      • git tag tag1
    • 显示所有tag
      • git tag
    • 显示指定tag
      • git show tag1
    • tag不能从本地改变位置,也不能被HEAD指向,同1个commit可以打多个tag
    • 删除本地标签
      • git tag -d tag1
    • 删除远程仓库标签
      • git push origin --delete tag1
  2. git reflog 或 git reflog 分支名称
    • 用于查看HEAD 或 分支的移动历史,从而找到特定的commit
  3. git checkout
    • git checkout 分支名称
    • git checkout commit
    • git checkout tag名称
  4. git cherry-pick commitA commitX commitN
    • 一般用于将指定分支的指定几个commit应用到当前分支,并移动HEAD到commitN
  5. git log --oneline --author=shuaige
    • 查找作者名字包含'shuaige'的所有commit记录,每条记录单行展示
    • git l --pretty=format:"时间: [%ad] , 哈希: %H , 作者: %an%n%s%n" --date=format:"%Y-%m-%d %H:%M:%S" image.png
    • –date=format格式说明
      • 小写格式
      - %a 星期(缩写):Sat  
      - %b 月份(缩写):Apri  
      - %c 格式化输出日期时间 月/日/年 时:分:秒:04/25/20 18:21:01  
      - %d 日期:25  
      - %j 一年的第几天:116  
      - %m 月份数字:04  
      - %p 上下午:AM/PM  
      - %w 星期几(0-6):6  
      - %x 格式化输出短日期:04/25/20  
      - %y 年份:20  
      - %z 时区:+0800
      
      • 大写格式
      - %A 星期(全写):Saturday  
      - %B 月份(全写):April  
      - %H 24小时制:18  
      - %I 12小时制:06  
      - %M 分钟:21  
      - %S 秒:01  
      - %U 一年的第几周(星期日作为每周的第一天):16  
      - %W 一年的第几周(星期一作为每周的第一天):16  
      - %X 格式化输出短时间:18:21:01  
      - %Y 年份:2020  
      - %Z 时区:+0800
      
    • --pretty=format 支持的常用属性
      %H 提交的完整哈希值 
      %h 提交的简写哈希值 
      %T 树的完整哈希值 
      %t 树的简写哈希值 
      %P 父提交的完整哈希值 
      %p 父提交的简写哈希值 
      %an 作者名字 
      %ae 作者的电子邮件地址 
      %ad 作者修订日期(可以用 --date=选项 来定制格式) 
      %ar 作者修订日期,按多久以前的方式显示 
      %cn 提交者的名字 
      %ce 提交者的电子邮件地址 
      %cd 提交日期 
      %cr 提交日期(距今多长时间) 
      %s 提交说明