神秘代码:https://learngitbranching.js.org/?locale=zh_CN
流程图:
显然,git pull就相当于git fetch 再 merge到本地分支。
像我们平时工程用的source tree里面各按键对应的命令:
提交:commit
拉取:pull
推送:push
抓取:fetch
后面两个还没用过,回头补
git branch:
git branch a 新建分支a
git branch 查看本地所有分支
git branch -r 查看远端所有分支
git branch -a 查看本地/远端所有分支
git branch -d xx 删除本地xx分支
git branch -d -r xx 删除远端xx分支(还需要推送到服务器,git push origin: <branchname>)
git branch -m old_branch_name new_branch_name 重命名本地分支(也需要推送到服务器才能更新远端)
参数解释:
-d --delete:删除 -D --delete --force的快捷键 -f --force:强制 -m --move:移动或重命名 -M --move --force的快捷键 -r --remote:远程 -a --all:所有
当前在a分支 运行git rebase b 将a分支接到b分支后面 xxx-xxx-xxx-b-a
改变分支指向:
git checkout master^ 或者 git checkout master~1 效果是一样的,都是把head节点置为master的父节点,~几就是向上移动几个节点。
也可以通过git checkout 节点哈希值^/~(num)来把head节点置到相应节点位置
git branch -f a b 强制让a分支指向提交b
git stash可以将当前现场保存起来。比如你现在在一个工作区正在工作,在当前分支已经修改了很多文件但都还没有提交。
使用git stash命令后工作区就变干净了(运行git status显示工作区干净),这时候可以很方便的运行checkout去跟踪其它分支/新建其它分支去完成其它工作。
等到需要继续之前工程的时候运行git stash list可以显示所有暂存的工作。使用git stash pop就可以恢复之前stash的工作现场(会自动删除缓存的现场),用git stash apply也可以,但不会自动删除缓存现场,需要手动git stash drop删除。
git merge x 把x分支合并到当前所在分支
根据这张图片可以看出
git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。
git merge 则不会显示 feature,只保留单条分支记录。
--no-ff
指的是强行关闭fast-forward方式。
fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。因为在这个过程中没有创建commit
git merge --squash
是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用--squash
进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。
总结:--no-ff
:不使用fast-forward方式合并,保留分支的commit历史--squash
:使用squash方式合并,把多次分支commit历史压缩为一次
左:(u are on blue branch) git merge yellow branch --no-f
中:(u are on blue branch) git merge yellow branch --squash
git commit -m "new a brown commit!"
右:(u are on blue branch) git merge yellow branch(如果符合fast-forward条件就会执行,这样就会导致图右的情况,黄色分支历史没了)
squash英文释义就是挤压的意思,非常形象(将另一个分支挤到当前分支上!)
查看日志:git log
图形化查看日志:
git log --graph --decorate --all
-------图形化--装饰(没发现装饰啥了)------所有分支(否则只展示当前分支)
git reset HEAD^1/master~1/master~19999 回退HEAD指针到指定位置
git revert 也是回退,但它是利用一个新的commit来回退,比如:现在的master分支:f1-f2-f3-f4-f5,head指向f5,但是我现在发现f4我写错了,但f5我还想要,使用:git revert f4 这样分支会变成这样:f1-f2-f3-f4-f5-f6,其中f6包含了f5,但对f4中的操作都做了一次逆操作。revert理解为“反做”比较合理。
revert多了一个commit,也并没有丢失该丢的数据,这样就可以push给远端共享给他人了。
reset是无法共享给别人的,因为是往前回滚,会丢失一些不必丢失的commit。
一般情况如果合并分支我们会使用merge, 但如果我们不需要另一个分支的全部提交,可以使用下面的命令:
git cherry-pick x y z 可以单独把自己想要的几个提交加入当前分支,
比如现在位于master,git log:a--b--c--d,head指向d。
然后运行git cherry-pick x y z,master变成这样:a--b--c--d--x--y--z,head指向z。也就是把指定的几个commit(如果指定的是分支名,就代表该分支的最新一个commit)依次作为当前分支的节点进行commit。
未完待续。。