Git基本操作全
-
Git基本操作全:
-
Git sourceTree基本操作:
-
指针HEAD、Master
- master:本地master,
- origin/HEAD:指向当前分支
- HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
- 总是指向当前分支上最近一次提交记录。
- origin/master:远程服务端master指向提交,
-
Git查看提交记录:git reflog
- 回滚:git reset --hard 地址
-
建立远程仓库:x
- git remote set-url origin http://xxx/ycf_new.git
-
git checkout C1 提交记录/dev分支
- HEAD指向提交记录或者切换分支,通过哈希值指定提交记录
- 分离HEAD: HEAD指向master,master指向C1,git checkout C1则HEAD指向C1
- C1为指针地址,具体的提交记录而不是分支:则表示直接将HEAD指向C1
- git checkout HEAD~1将HEAD指向指向上一个父级
-
Git分支创建并合并merge,推送到远程
-
git branch dev :创建分支dev
-
git checkout dev:切换到分支dev
-
git checkout -b dev:创建分支并切换到dev
-
git checkout master:切换到master
-
git merge dev :将dev合并到master。共同指向一个新的合并的父节点
-
git push origin dev:dev //将本地dev分支推送至远程dev分支,只是将创建的分支推送到远程
-
git push --set-upstream origin dev//将本地创建的分支推送到远程后,再建立链接,将修改的内容提交push上去
-
git push origin :dev //将一个空分支推送到远程即为删除 ,origin和:dev之间有空格,该命令只删除远程的分支
-
git push origin --delete dev //或者?不生效
-
git branch -d dev:删除本地分支而非远程分支,git branch -d <branch_name>
-
git push -u origin v1.0.0 :提交本地创建过的分支名到远程并关联了代码,注意是本地存在才能提交。不用setupstream这种方式,git push -u origin '分支名' :提交分支文件
-
git branch -a: 查看所有分支(远程和本地的,实际上没有fetch过无法获取远程的,比如git clone xx后,并没有pull或者fetch动作,那查看到的就是clone时获取的分支)
-
git branch -l : 查看本地分支
-
git fetch --all: 获取git 服务器上的所有的分支
-
git checkout -b dev origin/dev: 作用是checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
-
-
Git合并rebase
- git rebase master:
- 现在dev分支,合并到master分支,不用切换到master,直接git rebase master,就从dev移动到master了,但是master还没有更新了。
- 区别于merge,不是共同的父节点,提交记录是新的节点dev指向,原有的dev的副本,之前的master还是在之前的节点。成线性展示。
- master没有更新:切换到git checkout master,在git rebase dev一下,此时节点一样
- 提取一系列记录dev合并复制到另外的地方master
- git rebase master:
-
^ ~相对引用,
- ^:向上移动 1 个提交记录
- ~<num> 向上移动多个提交记录,如 ~3
- git checkout master^ git checkout master^^
- 移动的HEAD,比如现在HEAD指向master,git checkout master^ 后HEAD指向master的父级
-
-f 强制修改分支位置,移动分支,git branch -f master C9,强制指向,使用哈希值
- git branch -f master HEAD~3
- 使用相对引用不能存在断层,即存在分支最好直接指向哈希值
- 让分支指向另一个提交 ,将 master 分支强制指向 HEAD 的第 3 级父提交。
- 假设此时HEAD指向是Dev分支,使用上诉命令也没有关系,强制master指向 HEAD 的第 3 级父提交。但是HEAD还是在Dev上,只是改变了master指向
- git branch -f master C9:可直接使用hash值让master指定到该位置
- git branch -f master HEAD~2:将master指向HEAD的上两个父级,改变的是master的指向而非HEAD
- git checkout HEAD~2:改变的是HEAD的指向
- git branch -f master HEAD~3
-
git reset 、git revert 撤销变更
- git reset HEAD~: git revert HEAD~3切换到要撤销的分支,选择HEAD等相对应用。要切到需要变更的分支上,就一个参数。也可直接git revert HEAD撤销上个提交。最好使用hash值,而不是相对应用。如果撤销的是当前分支的当前的那个提交则使用git rever HEAD方便。
- git reset:lcoal本地分支——对本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效
- git revert:pushed远程分支——撤销更改并分享给别人。C0-C1-C2撤销C2后提交记录后多了个新提交C0-C1-C2-C2',C2',C2'引入了更改,这些更改刚好是用来撤销C2的提交,再push即可
-
git cherry-pick <提交号>: 整理提交记录。知道提交记录的前提下
- git cherry-pick C2 C4:
- 切换到要合并的分支master,需要dev分支上的提交记录写上即可,写上的提交记录在dev上自动抓过来到master
- 将分支的提交记录复制到master上
- 不管分支有几个,提交号在几个分支上,只需要将提交号写上都会复制过去
- 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)
- git cherry-pick C2 C4:
-
git rebase -i dev:将提交重新排序,交互式的 rebase:不清楚提交记录
- 交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
- Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更
- git rebase -i dev :则会弹框,手动排序,
-
git rebase dev master :head指向dev时,使用该命令,master则指向dev,并切换到master。两个分支指向同一个位置将master指向到dev并切换到master,本地栈式提交
- 先git rebase -i HEAD^重新排序把想要的提交记录挪到最前端,在git commit -amend在新开的树上修改它,然后在排序
- 复制提交记录:git rebase -i ,git cherry-pick 提交记录
- git commit --amend 来进行一些小修改,改变提交记录,在当前的提交树上新开一个提交树复制一下到新的记录,并指向他
- git rebase -i HEAD~2:当前的HEAD指向向上走2个提交,弹框后选择排序,则会在已走的指定的那个提交记录后复制新的提交,’,可反复操作,严格按照在对话框指定的方式排序进行复制
-
git tag V1 <提交号> :打Tag,标签在代码库中起着“锚点”的作用
- 在提交号处打个标签V1,不指名具体的提交号则会默认为HEEAD的指向
- git tag :查看标签
- git tag tag_v1 创建tag,tag名为tag_v1,在本地
- git tag -a <版本号> -m "<备注信息>":打tag添加备注:gti tag -a tag_v1 -m "tag_v1提交信息包括日志等"
- git tag -d tag_v1:删除本地的tag标签
- git checkout tag_v1:切换到该标签
- git tag -a tag_v1 commitID :给指定提交commit 打标签
- git push origin tag_v1:发布标签,推送到远程git
- git push origin tags:将本地所有的tag推送到远程
- git push origin :refs/tags/tag_v1:删除一个远程标签,相当于推送一个空的目标标签到远程(# git push origin refs/tags/源标签: refs/tags/目标标签)
-
Git Describe <ref>:给标签加描述
- 输出结果:<tag>_<numCommits>_g<hash>
- tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
- git describe master:v1_2_gC2
- git describe side:v2_1_gC4
- 输出结果:<tag>_<numCommits>_g<hash>
-
git bisect:查找产生 Bug 的提交记录的指令
-
多分支 rebase :git rebase将分叉的分支重新合并
- git rebase master dev:将master合并到dev,后者改的节点合并到前者的后面生成新的节点,后者的提交号不完全包含前者的提交号,不然就是最新的无效的。rebase后HEAD指向后者dev
- git rebase 分支1 分支2 :对于当前HEAD是哪个分支没有要求,是把后者合并到前者,且HEAD指向后者,将没有共同的提交记录合并到前者、后者包含了前者那就是最新的rebase
-
选择父提交记录 git checkout master^
- ^ 与 ~ 符一样,后面也可以跟一个数字
- 操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个父提交
- 如果不加数字修改符直接检出 master^,git checkout master^,会回到第一个父提交记录,第一个父提交记录是指合并提交记录正上方的那个提交记录
- git checkout master^2:表示合并记录的另外一个父提交
- git checkout master~,一条线上的走一个提交记录即上一个。
- git checkout master^2:另外一个父提交,走一个
- git checkout master~2:直线上的走两个
- git checkout master^22等同于git checkout master~ + git checkout master^2 + git checkout master~2
-
git stash:存储
- 1、git stash list:查看stash了哪些存储
- 2、git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
- 3、git stash :存储
- 4、git stash clear :删除所有缓存的stash
- 5、git stash apply : git stash apply stash@{1} 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
- 6、git stash drop stash@{num}存储,从列表中删除这个存储、
- 7、git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
- 8、git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
- 9、git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}