git小教室

说明

  • "~" 跟 "^" 区别

    • ^ caret ~ tilda
    • git checkout HEAD^^^和git checkout HEAD~3等价,都代表当前版本的前3个版本
    • 区别在于3和~3代表不同概念,3代表回退一个版本,以第三条graph线为准。
    • 操作符 ^ 与 ~ 符一样,后面也可以跟一个数字。但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个父提交。
  • 当head没有指到任何本地分支上就会脱离。

  • git仓库中最重要的是commitID,而且commitID不会被篡改,分支和tag只是commitID的贴纸。

  • git bisect start [终点] [起点]

    • 二分法排错,"终点"是最近的提交,"起点"是更久以前的提交。它们之间的这段历史,就是差错的范围。
    • git bisect start HEAD 5d67e3
    • 使用git bisect good 和 git bisect bad来标识,直到找到xxx is the first bad commit
    • git bisect reset # 退出查错,回到最近一次的代码提交,就可以进行改错了
  • git diff

    • git diff c1 c2 比较两次提交的差异
    • git diff c1 比较c1和HEAD所指的commit的差异
    • git diff 比较工作区和暂存区的差异
    • git diff --cached 比较暂存区和本地仓库区HEAD的差异
  • git rebase使用时机

    • 没有推到远程分支的commit,有点乱,使用 rebase 来整理分支后再推出去。
    • 推到远程分支的commit,如果用rebase 等于是修改已经发生的事实,相当于进入了一个新的平行时空,所以正常来说是推不上去的,推出去的时候要用git push -f
    • 对于推到远程分支的commit,请不要任意使用 rebase,除非
      • 远程分支只有自己在用
      • 远程共用分支和大家协商,以你推出去的为准,推出去后,让大家重新删除分支再拉。

本地操作

git rebase cat # 把目前分支叠在cat分支后面
git rebase cat dog # 把dog分支叠在cat分支后面
git rebase -i 互动式rebase

git checkout -b 分支名 # 切换分支,如果分支不存在则建立
git checkout -b 分支名 commitID # 切换分支,如果分支不存在则以commitID建立
git checkout -b temp origin/master # 如果temp分支不存在,则新建分支temp,并关联到origin/master

git branch 分支名 commitID # 建立分支
git branch -f 分支名 commitID # 对于存在的分支强制还原到某次提交
git branch -u o/main notMain # 关联本地notMain分支到远程分支o/main
git branch -m main dev # 把main分支改为dev分支,修改分支后会和远程分支失去关联

git tag tag名 commitID # 打tag
git cherry-pick c1 c2 c3

git merge # 产生一次合并记录
git revert # 产生一次撤销记录

远程仓库操作

git pull 到头来就是 fetch 后跟 merge 的缩写。你可以理解为用同样的参数执行 git fetch,然后再 merge 你所抓取到的提交记录。

git pull origin <place>
git pull origin <source>:<destination> 
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase

git push origin <place> # 远程分支不存在会自动创建,下同
git push origin <source>:<destination> # 这里的source指的是本地分支,destination是远程分支
git push origin :foo # source留空,代表删除远程仓库分支foo

git fetch # 下载远程仓库文件到本地,更新本地的所有远程分支
git fetch origin <place> # 本地分支不存在会自动创建,下同
git fetch origin <source>:<destination> # 这里的source指的是远程分支,destination是本地分支
git fetch origin :foo # 如果source为空,则在本地以当前HEAD创建一个foo分支

git物件原理

  • 共有四种分类 blob(档案)、tree(目录和文件名)、commit、tag
  • git add -> blob, git commit -> tree和commit,git tag -> tag
  • 操作示例过程
## 第一阶段
echo "hello, world" > index.html # untracked状态
git add index.html                     # 生成blob物件b1
mkdir config
echo "super-secret-password" > config/database.yml
git add config/database.yml # 生成blob物件b2
git commit -m "init commit" # 生成tree物件,分别是t1指向b2 和 t2指向b1、t1,最后是commit物件c1,指向t2

## 第二阶段
echo "this is a book" >> index.html # modified状态
git add index.html # 档案内容和原来不同,根据SHA1算法,生成新的blob物件b3
git commit -m "update index.html" # 生成新的tree物件t3,指向b3和t1,最后是commit物件c2,指向t3和c1

## 第三阶段
echo "super-secret-password" > key.txt
git add key.txt # 由于内容和b2一样,不会产生blob物件
git commit -m "add secret key" # 生成新的tree物件t4,指向b2和b3,t1,最后是commit物件c3,指向t4和c2
## 最终结果如下图
posted on 2022-11-04 00:38  DJ荒野  阅读(25)  评论(0编辑  收藏  举报