最近get到一个不错的学习git基本操作的链接,不用看教程,可视化页面,动态更新的分支树,跟玩游戏一样,害挺好玩,记笔记也方便,安利给大家~游戏链接
本地篇
-
git commit
提交至本地库 -
切换/创建分支
-git branch xxx
创建分支
-git checkout xxx
切换分支
-git checkout -b xxx
创建并切换至新分支 -
合并分支
-git merge xxx
将xxx合并至当前检出位置
图为git merge bugFix
-git rebase xxx
继承xxx分支至当前检出位置
图为git rebase master
注意:提交记录 C3 依然存在(树上那个半透明的节点),而 C3’ 是我们 Rebase 到 master 分支上的 C3 的副本。 -
HEAD
HEAD 总是指向当前分支上最近一次提交记录,HEAD 通常情况下是指向分支名的。如果想看 HEAD 指向,可以通过
cat .git/HEAD
查看, 如果 HEAD 指向的是一个引用,还可以用git symbolic-ref HEAD
查看它的指向。git checkout xxx
可以改变HEAD的指向(此处的xxx不仅可以是分支名,还可以是每次提交记录的哈希值)如果通过指定提交记录哈希值的方式在 Git 中移动不太方便(直接引用),不得不用
git log
来查查看提交记录的哈希值,这就有了相对引用。 -
相对引用
- 使用^
向上移动 1 个提交记录
- 使用~<num>
向上移动多个提交记录,如~3
可以将 HEAD 作为相对引用的参照,一直使用 HEAD^ 向上移动
-f
容许我们将分支强制移动到那个位置
使用git branch -f master HEAD~3
后:
-
撤销变更
-git reset
如下图,git reset HEAD~1
把 master 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。
git reset
在本地分支中使用 很方便,但是这种方法对多人一起使用的远程分支是无效的,为了撤销更改并分享给别人,我们需要使用git revert
-git revert
下图是使用
git revert HEAD
后的效果,奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的。revert 之后就可以把你的更改推送到远程仓库与别人分享啦。
-
git cherry-pick <提交号>...
用来将一些提交复制到当前所在的位置(HEAD)下面如:
git cherry-pick C2 C4
,就把 side 分支上 C2 和 C4 的工作复制到 master 分支
-
与切换HEAD一样,我们常常是不知道每次提交记录的哈希值的,因此,我们需要用到交互式rebase。
交互式 rebase 指的是使用带参数
--interactive
的 rebase 命令, 简写为-i
,使用此命令Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明如下图,使用
git rebase -i HEAD~4
,就可以将倒数四个节点,按照你想要的顺序,生成一个新的分支,你也可以删除已选中的节点
-
git标签(锚点)
git tag tagName hashName
如果你不指定提交记录,Git 会用 HEAD 所指向的位置 -
git describe <ref>
描述离你最近的锚点<ref>
可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)输出的结果:
<tag>_<numCommits>_g<hash>
tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。当 ref 提交记录上有某个标签时,则只输出标签名称
什么意思呢?
git describe master
会输出v1_2_gC2
git describe side
会输出V1_1_gC4
远程篇
-
git clone
在本地创建一个远程仓库的拷贝
远程分支有一个命名规范 —— 它们的格式是:<remote name>/<branch name>
。因此,如果你看到一个名为 o/master 的分支,那么这个分支就叫 master,远程仓库的名称就是 o。当你使用真正的 Git 时, 你的远程仓库默认为 origin! -
git fetch
从远程仓库获取数据
- 从远程仓库下载本地仓库中缺失的提交记录
- 更新远程分支指针(如 o/master)
-git fetch
只会抓取更新,但它不会自动更新你的 master 分支,也不会修改你磁盘上的文件,你需要执行git cherry-pick o/master
、git rebase o/master
、git merge o/master
来更新本地分支、代码、文件。 -
git pull
git fetch
和git merge o/master
的语法糖 -
git pull --rebase
git fetch
和git rebase o/master
的语法糖 -
git push
负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。一旦 git push 完成, 你的朋友们就可以从这个远程仓库下载你分享的成果了!notice!:
git push
不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。它的默认值取决于你正使用的 Git 的版本。 -
Remote Rejected
master分支被锁定,远程服务器拒绝直接推送(push)提交到master,因为策略配置要求 pull requests 来提交更新。
解决办法:
新建一个分支feature, 推送到远程服务器。然后reset你的master分支和远程服务器保持一致, 否则下次你pull并且他人的提交和你冲突的时候就会有问题。 -
远程跟踪分支
除了master,你可以让任意分支跟踪 o/master, 然后该分支会像 master 分支一样得到隐含的 push 目的地以及 merge 的目标。有两种方法设置这个属性,
①git checkout -b foo o/master
通过远程分支检出一个新的分支,这就可以创建一个名为foo
的分支,它跟踪远程分支o/master
。②
git branch -u o/master foo
设置远程追踪分支,这样foo
就会跟踪o/master
了。如果当前就在foo
分支上, 还可以省略foo
:git branch -u o/master
-
git push <remote> <place>
<remote>
是远程仓库名,一般是origin
<place>
同时指定了提交记录的来源和去向,当二者一致时,写一个即可;当二者不同时,git push origin <source>:<destination>
,place的值可以是任何git可以识别位置的名词(如分支名、HEAD~1) -
git fetch <remote> <place>
与push的参数基本一致,只是源和目的对调了,因为通信方向变了。NOTICE! 当我们把
source
置空时,即git push origin :master
会删除远程的master分支,同理,git fecth origin :bar
会在本地新建一个名为bar
的空分支。
还有一些组合式应用,请移步至游戏链接亲身体会!它值得你拥有!
提供一些有用的游戏命令,也许你会用到:
reset
重置
undo
回退
levels
显示关卡菜单
show solution
查看答案