河南红旗渠建设集团网站,网站建设包括哪些内容,wordpress兼容ie,注册网址免费文章目录 简介前置概念.git目录objects目录refs目录HEAD文件 resetreflog 与 reset --hardrevert(撤销指定提交)stashdiff工作区与暂存区差异暂存区与HEAD差异工作区与HEAD差异其他比较 restore、checkout(代码撤回)merge、rebase、cherry-pick 简介
本文将介绍Git几个核心概念… 文章目录 简介前置概念.git目录objects目录refs目录HEAD文件 resetreflog 与 reset --hardrevert(撤销指定提交)stashdiff工作区与暂存区差异暂存区与HEAD差异工作区与HEAD差异其他比较 restore、checkout(代码撤回)merge、rebase、cherry-pick 简介
本文将介绍Git几个核心概念和最常用的几个内容操作命令
resetdiffrestore、checkoutstashreflogrevertcherry-pick(merge、rebase)
前置概念
首先我们来看一下几个非常重要的前置概念
.git目录 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、工作区、暂存区代码
# head表示当前版本head^等价于head~1表示回退所有内容到上一个版本
git reset head^# 回退2个版本
git reset head~2# 将tree.txt这个文件的版本到上一个版本
git reset head^ tree.txt# 回退到指定commitcommit-id:4889036387
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有机会补救吗
git reset --hard head~2答案是还能抢救一下
首先
git reflog再使用git reset --hard回退到reset的上一个版本
git reset --hard 8ca4549commit的内容回来了但是工作区和暂存区的内容掉了找不回了
revert(撤销指定提交)
revert是用来将某次的commit的内容提取出来到工作区。
这样就可以重新编辑然后再一次提交。
主要使用场景就是发现自己某一次提交有点问题但是在这次提交之前已经有其他人提交了怎么办呢
可以用revert
# 查看提交记录
git log --oneline
# 撤销指定的提交
git log revert b1c305drevert并不会修改指定的commit只会根据指定commit做逆操作
可以checkout到指定commit看到内容并没有少
git checkout -b feature-view b1c305drevert相当于将指定的commit合并到当前的head还可能冲突。
所以通常来说还不说直接改。唯一的作用可能就是记不清楚的commit的内容的时候可以revert能自动帮你做。
stash
stash最常用的场景2个
我们切分支的时候有时候有修改不能切就可以stash暂存pull代码冲突就可以先stash 再pull
# 默认暂存
git stash# 添加暂存提示信息
git stash save 暂存提示信息# 查看暂存了哪些内容
git stash list# 查看最上面的暂存修改了哪些文件
git stash show
# 查看第2个暂存修改了哪些文件
git stash show stash{1}# 查看最上面的暂存修改的具体内容
git stash show -p
# 查看第2个暂存修改的具体内容
git stash show stash{1} -p# 应用最上面的暂存不删除
git stash apply
# 应用第2个暂存
git stash apply stash{1} # 应用最上面暂存并删除(没有冲突才删除)
git stash pop
# 应用第2个暂存并删除(没有冲突才删除)
git stash pop stash{1}# 删除最上面暂存
git stash drop
# 删除第2个暂存
git stash drop stash{1}# 删除所有暂存
git stash cleardiff
工作区与暂存区差异 git diff
git diff b.txt# 暂存区的文件在objects中可以通过下面的命令查看
git cat-file -p 8fec8c3
# 工作区的对象还没有在objects中会提示找不到对象
git cat-file -p 04a9f41# 可以通过HEAD查看已经commit的对象
git cat-file -p HEAD:b.txt
git cat-file -p d1d06ad暂存区与HEAD差异
暂存区(stage)HEAD是当前分支最新的commit
git diff --cached
git diff --cached b.txt工作区与HEAD差异
HEAD是当前分支最新的commit(通常就是master)也可以使用指定的commit-id
git diff HEAD
git diff HEAD b.txt# 工作区与指定commit的差异
git diff commit-id其他比较
# 查看两个commit之间的差异
git diff commit-id1 commit-id2# 查看不同分支的文件差异
git diff branch-name1:file-path branch-name2:file-pathrestore、checkout(代码撤回)
推荐使用restorecheckout还是让他去切分支吧。
restore是有递进关系
可以从暂存区撤回到工作区使用–staged参数(相当于add的逆操作)可以直接丢弃工作区的修改
# 丢弃工作区的修改
git restore a.txt
# 等价于
git checkout a.txt
# 丢弃工作区和暂存区所有修改不能指定文件指定文件就等价于git checkout filename.txt
git checkout -f# 将暂存区回退到工作区
git restore --staged a.txtmerge、rebase、cherry-pick
merge、rebase、cherry-pick主要是操作commit
merge合并代码注意合并解决冲突就可以rebase优化commit注意修改的开始commit之后没有其他人的提交就可以(如果提示需要git push -f时一定要注意)cherry-pick是从其他分支挑选commit到当前分支
这里我们重点说一下cherry-pick比如一个任务我已经开发了一段时间了但是临时需要发一个修复版本但是修复版本使用了我开发这段时间的代码这么办呢
这个时候就可以使用cherry-pick。 如果有冲突先解决冲突 继续cherry-pick
# 首先切到指定分支
git checkout b1
# 查看需要pick哪些提交
git log --oneline# 切回到pick分支
git checkout master# cherry-pick指定的commit
git cherry-pick 1f54b01 0fed6dd# 如果有冲突手动解决冲突然后add
git add .# 继续cherry-pick处理commit信息
git cherry-pick --continue