Git核心概念图例与最常用内容操纵(reset、diff、restore、stash、reflog、c ...

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

简介

本文将先容Git几个核心概念,和最常用的几个内容操纵命令:

  • reset
  • diff
  • restore、checkout
  • stash
  • reflog
  • revert
  • cherry-pick(merge、rebase)
前置概念

起首我们来看一下几个非常重要的前置概念
.git目录


  1. git init
复制代码
我们实行上面命令就会天生一个.git目录

【工作区】add就到【暂存区】commit就到【本地仓库】
objects目录


objects目录中保存的是add到暂存区和commit到本地仓库的文件
refs目录


HEAD文件

HEAD是一个文本文件,你们内容是HEAD当前指向的分支:
ref: refs/heads/feature-view
reset

我们起首来看一下我们最常用的reset操纵。

reset是重置,他重置的是commit
   git reset [–soft | --mixed | --hard] HEAD
  

  • –mixed:默认参数,撤销commit,全部commit和没有commit的代码放到工作区
  • –soft:撤销commit,全部commit和没有commit的代码放到暂存区
  • –hard:撤销commit,丢弃全部commit、工作区、暂存区代码
  1. # head表示当前版本,head^等价于head~1表示回退所有内容到上一个版本
  2. git reset head^
  3. # 回退2个版本
  4. git reset head~2
  5. # 将tree.txt这个文件的版本到上一个版本
  6. git reset head^ tree.txt
  7. # 回退到指定commit,commit-id:4889036387
  8. git reset 4889036387
复制代码
我们最最常用的reset的2个操纵:

  • 感觉本身的commit有点题目,想重新commit,这个也可以用git commit --amend
  • 本身push之前有提交,导致push失败,pull之前要reset,这里可以用–soft参数,如许如果没有辩论就不用再add了
reset多个版本的这种操纵不发起做,除非没有push到长途仓库,或者只有你一个人在提交接码。
如果修改了长途仓库的commit,通常push是不可的,必须利用git push -f。
git push -f是一个非常伤害的操纵,会导致push之前,其他人push的新代码丢失
git提示可以利用,是让我们知道本身在干什么,而不是告诉我们git push不可,用git push -f 吧。
一般来说,规范的团队都会把git push -f给禁用掉,否则一个人骚操纵,代码丢了,大概啥证据都没有。
reflog 与 reset --hard

如果不小心实行了reset --hard,偶然机调停吗?
  1. git reset --hard head~2
复制代码
答案是还能救济一下:
起首:
  1. git reflog
复制代码

再利用git reset --hard回退到reset的上一个版本
  1. git reset --hard 8ca4549
复制代码
commit的内容返来了,但是工作区和暂存区的内容掉了,找不回了
revert(撤销指定提交)

revert是用来将某次的commit的内容,提取出来到工作区。
如许就可以重新编辑,然后再一次提交。
主要利用场景就是:发现本身某一次提交有点题目,但是在这次提交之前已经有其他人提交了,怎么办呢?
可以用revert
  1. # 查看提交记录
  2. git log --oneline
  3. # 撤销指定的提交
  4. git log revert b1c305d
复制代码

revert并不会修改指定的commit,只会根据指定commit做逆操纵
可以checkout到指定commit,看到内容并没有少:
  1. git checkout -b feature-view b1c305d
复制代码
revert相当于将指定的commit归并到当前的head,还大概辩论。
所以,通常来说还不说直接改。唯一的作用大概就是记不清楚的commit的内容的时间,可以revert能自动帮你做。
stash

stash最常用的场景2个:

  • 我们切分支的时间,偶然间有修改不能切,就可以stash暂存
  • pull代码辩论,就可以先stash 再pull
  1. # 默认暂存
  2. git stash
  3. # 添加暂存提示信息
  4. git stash save "暂存提示信息"
  5. # 查看暂存了哪些内容
  6. git stash list
  7. # 查看最上面的暂存修改了哪些文件
  8. git stash show
  9. # 查看第2个暂存修改了哪些文件
  10. git stash show stash@{1}
  11. # 查看最上面的暂存修改的具体内容
  12. git stash show -p
  13. # 查看第2个暂存修改的具体内容
  14. git stash show  stash@{1}  -p
  15. # 应用最上面的暂存,不删除
  16. git stash apply
  17. # 应用第2个暂存
  18. git stash apply stash@{1}
  19. # 应用最上面暂存,并删除(没有冲突才删除)
  20. git stash pop
  21. # 应用第2个暂存,并删除(没有冲突才删除)
  22. git stash pop stash@{1}
  23. # 删除最上面暂存
  24. git stash drop
  25. # 删除第2个暂存
  26. git stash drop stash@{1}
  27. # 删除所有暂存
  28. git stash clear
复制代码
diff

工作区与暂存区差异


  1. git diff
  2. git diff b.txt
  3. # 暂存区的文件在objects中,可以通过下面的命令查看
  4. git cat-file -p 8fec8c3
  5. # 工作区的对象还没有在objects中,会提示找不到对象
  6. git cat-file -p 04a9f41
  7. # 可以通过HEAD查看已经commit的对象
  8. git cat-file -p HEAD:b.txt
  9. git cat-file -p d1d06ad
复制代码
暂存区与HEAD差异

暂存区(stage)HEAD是当前分支最新的commit
  1. git diff --cached
  2. git diff --cached b.txt
复制代码
工作区与HEAD差异

HEAD是当前分支最新的commit(通常就是master),也可以利用指定的commit-id
  1. git diff HEAD
  2. git diff HEAD b.txt
  3. # 工作区与指定commit的差异
  4. git diff commit-id
复制代码
其他比较

  1. # 查看两个commit之间的差异
  2. git diff commit-id1 commit-id2
  3. # 查看不同分支的文件差异
  4. git diff branch-name1:file-path branch-name2:file-path
复制代码
restore、checkout(代码撤回)

推荐利用restore,checkout还是让他去切分支吧。
restore是有递进关系:

  • 可以从暂存区撤回到工作区利用–staged参数(相当于add的逆操纵)
  • 可以直接丢弃工作区的修改
  1. # 丢弃工作区的修改
  2. git restore a.txt
  3. # 等价于
  4. git checkout a.txt
  5. # 丢弃工作区和暂存区所有修改,不能指定文件,指定文件就等价于git checkout filename.txt
  6. git checkout -f
  7. # 将暂存区回退到工作区
  8. git restore --staged a.txt
复制代码
merge、rebase、cherry-pick

merge、rebase、cherry-pick主要是操纵commit:

  • merge归并代码,注意归并办理辩论就可以
  • rebase,优化commit,注意修改的开始commit之后没有其他人的提交就可以(如果提示须要git push -f时一定要注意)
  • cherry-pick是从其他分支挑选commit到当前分支
这里我们重点说一下cherry-pick,比如一个任务我已经开发了一段时间了,但是临时须要发一个修复版本,但是修复版本利用了我开发这段时间的代码,这么办呢?
这个时间就可以利用cherry-pick。

如果有辩论,先办理辩论:

继续cherry-pick:

  1. # 首先切到指定分支
  2. git checkout b1
  3. # 查看需要pick哪些提交
  4. git log --oneline
  5. # 切回到pick分支
  6. git checkout master
  7. # cherry-pick指定的commit
  8. git cherry-pick 1f54b01 0fed6dd
  9. # 如果有冲突手动解决冲突,然后add
  10. git add .
  11. # 继续cherry-pick处理commit信息
  12. git cherry-pick --continue
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表