- 1.直接进入沙盒
- 2. 本地操作相关篇节
- 2.1 基础篇
- 2.2 处理复杂问题
- 2.2.1 修改提交树
- 2.3 杂项
- 3. 远程操作相关篇章
- 3.1 push && pull----git远程仓库
- 3.2 关于 origin 和它的周边 —— Git 远程仓库高级操作
参考网站:learn_git
1.直接进入沙盒
在 URL 后头加上 ?NODEMO 就可以了
2. 本地操作相关篇节
2.1 基础篇
-
Git Commeit
- 提交记录: 保存的是你的目录下所有文件的快照,就是ctrl+c,但是更优雅、轻便
- 可以做到的结果:可以快速地在这些提交记录之间切换
- hide goal命令关闭窗口
-
Git Branch
分支:早建分支!多用分支!
-
与上面的提交记录结合起来
- 一种结合方法:新创建的分支 newImage 指向的是提交记录
- 切换新分支:
git checkout newImage;git commit
并且修改保存到新分支中 - 简洁的切换方法(创建新分支并切换新分支):
git checkout -b
- 切换新分支:
- 一种结合方法:新创建的分支 newImage 指向的是提交记录
创建分支示意图
-
Git Merge
-
用处:两个分支都是独立但是没有整体,如果需要整体的提交记录这时候就可以采用合并分支这一个命令
git merge bugFix
-
合并分支的几个步骤:先切换到a节点,接着合并到b节点
-
合并的规则就是:正常情况是jiu
git branch bugFix git commit git checkout master git merge bugFix 随时用objective打开对话框
合并分支示意图:
-
-
- Git Rebase(另外一种合并方案)
本质:实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去(有当前节点和其他节点,rebase就是复制当前节点到其指定的其他节点后面——也就是继承自其他节点)
-
代码实现:
git checkout -b bugFix 新建并切换回bugFix git commit 提交一次 git checkout master 切换回master git commit 再提交一次 git checkout bugFix 切换回bugFix git rebase master 把master合并到当前分支
-
合并示意图:
- 树上进行移动
-
HEAD
分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名
一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
总是指向当前分支上最近一次提交记录,修改提交树也是针对head开始的;
对提交做的一些更改,可以通过其看到。
可以通过 cat .git/HEAD 查看head指向;
-
指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向
git checkout C1; git checkout master; git commit; git checkout C2;
HEAD示意图:
-
分离的 HEAD
- ==让其指向了某个具体的提交记录而不是分支名==
- 待解决的问题:
- 想完成此关,从
bugFix
分支中分离出 HEAD 并让其指向一个提交记录。 - 通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。
- 想完成此关,从
- 示意图与1部分示意图一致。
-
- 相对引用:
通过指定提交记录哈希值的方式在 Git 中移动不太方便,在git中只需要提供能够唯一标识提交记录的前几个字符即可。
-
2个非常有用的操作:
a.使用
^
向上移动 1 个提交记录b.使用
~
向上移动多个提交记录,如 ~3-
代码构成:
git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^;
-
示意图:
强制修改分支位置
-
直接使用 -f 选项让分支指向另一个提交:
git branch -f master HEAD~3
- 示意图(`git branch -f master C6`): ![修改之前](https://upload-images.jianshu.io/upload_images/16953224-cca269a818f79bb6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![修改之后](https://upload-images.jianshu.io/upload_images/16953224-0c6a291e009f802d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
撤销变更:
-
组成部分:底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)
- 我们关注的是后者:上层部分
-
两种撤销更改指令:
-
git reset
(本地),(git reset HEAD^1----->数字1就是指定回退到的位置)示意图如下: -
git revert
(远程)(git revert HEAD,注意当前节点应该是在所要操作的节点上):用一个新提交来消除一个历史提交所做的任何修改,示意图如下:
-
-
完成的任务:
- 分别撤销 local 分支和 pushed 分支上的最近一次提交。共需要撤销两个提交(每个分支一个)。
- 记住 pushed 是远程分支,local 是本地分支 —— 这么说你应该知道用分别哪种方法了吧?
-
2.2 处理复杂问题
2.2.1 修改提交树
- 自由修改提交树
git cherry-pick
清楚知道所需要提交的记录
提交记录插入分支的指向,指定记录插入当前分支
-
示意图如下(
git cherry-pick C2 C4
):
- 交互式的
rebase
从一系列的提交记录中找到想要的记录,可以调整顺序、删除、合并操作
rebase --interactive(-i)
-
示意图(git rebase -i HEAD~4):
2.3 杂项
- 本地自由栈式提交
针对各个不同分支有一些调试或者打印的提交记录:复制解决问题的那几个提交就是(只提交一个分支)
-
提交的技巧
- 先用
git rebase -i
将提交重新排序,然后把我们想要修改的提交记录挪到最前 - 然后用
commit --amend
来进行一些小修改- 会合并当前提交和上一次的提交,如果当前提交有注释,则以当前的注释为合并后的提交的注释,若当前提交没有注释,则以上一次提交的注释作为合并后的提交的注释
- 接着再用
git rebase -i
来将他们调回原来的顺序 - 最后我们把
master
移到修改的最前端(用你自己喜欢的方法),就大功告成啦!
- 先用
-
关卡代码实现:
git rebase -i C3~2 git commit --amend 针对当前分支修改提交内容 git rebase caption master
-
示意图:
-
与1实现同样的功能:将提交树上任何地方的提交记录取过来追加到 HEAD 上
实现代码:
git cherry-pick C2
-
示意图:
-
永远地指向某一个提交记录分支或者提供类似功能(标签)
-
高级操作
-
多次rebase
把多个分支rebase到master,按照规定的顺序;
-
主要关注的是一种特殊情况,如下所示:
-
选择父提交节点
-
操作符 ^ 与 ~ 符一样,后面也可以跟一个数字。他们意义不同:
- ^指定合并提交记录的某个父提交(针对有多个父节点的时候),~就是返回多少代。
git branch bugWork master^^2^
- ^指定合并提交记录的某个父提交(针对有多个父节点的时候),~就是返回多少代。
-
示意图:
-
-
纠缠不清的分支:多个分支都需要做不同的操作或者提交
三个分支:one 需要重新排序并删除 C5,two 仅需要重排排序,而 three 只需要提交一次
-
关卡代码实现:
git checkout one git cherry-pick c4 c3 c2 git checkout two git cherry-pick c5 c4 git branch -f three c2
-
示意图:
-
3. 远程操作相关篇章
3.1 push && pull----git远程仓库
- clone一个远程仓库
-
git clone
-
本地多的远程分支:o/master(远程分支有一些特殊的属性)
- 远程分支反映了远程仓库(在你上次和它通信时)的状态
- 远程分支有一个特别的属性:检出时自动进入分离 HEAD 状态。所以做法是:(更新了远程分支之后)再用远程分享你的工作成果。
- o代表远程仓库默认为origin
- 远程仓库的命名规则:
/
- 远程仓库的命名规则:
-
示意图:
-
-
git fetch: 向远程仓库传输数据以及从远程仓库获取数据。
git fetch 通常通过互联网(使用 http:// 或 git:// 协议) 与远程仓库通信。
本质:将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态
会更新本地没有的记录而不会更新更新本地仓库状态(这点尤其需要注意),以及将指针指向
o/master
-
关卡代码实现
git fetch origin bugFix git checkout master git fetch origin master git checkout bugFix
-
示意图:
-
git pull:将变化的内容更新到本地
-
等同于两个命令:
git fetch;git merge o/master
-
git pull --rebase
就是fetch
和rebase
的简写!
-
示意图:
-
-
模拟团队协作:
- 模拟提交:
git fakeTeamwork foo 3
- 模拟提交:
-
git push:与git pull相对,将本地上传到远程数据库
==推送之前需要先clone==
git push 负责将你的变更上传到指定的远程仓库;同时本地master与o/master也被更新;
git push 不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关,使用的时候最好进行检查。
-
示意图:
-
偏离的提交记录
具体原因造成:成员更改了API,你是基于原本的API进行开发
-
通过rebase进行解决
git fetch;git rebase o/master;git push;
- 简化代码:
git pull --rebase;git push;
-
也可以使用merge,只要告诉git当前提交已经包含了远程分支的所有状况
git fetch;git merge o/master;git push;
- 简化代码:
git pull;git push;
-
示意图(通过rebase处理,本地根据远程分支o/master操作了一步,但是远程是在o/master之后还有c2):
-
远程服务器拒绝!(
Remote Rejected
)(锁定的Master(Locked Master))必须使用pull request来更新这个分支(在团队中合作可能会进行相关master锁定)
-
相应流程:
- 新建一个分支;
- reset你的master分支和远程服务器保持一致;
- 重置操作:
git reset --hard o/master;
(这种是硬重置,一般默认是--mixed)
- 重置操作:
- 推送(push)这个分支并申请pull request;
-
流程代码:
git reset --hard o/master; git checkout -b feature C2; git push origin feature;
-
示意图:
3.2 关于 origin 和它的周边 —— Git 远程仓库高级操作
-
推送主分支
-
完成两个操作:
- 将特性分支集成到 master 上;
- 推送并更新远程分支;
-
实现过程
git fetch git rebase o/master side1 git rebase side1 side2 git rebase side2 side3 git rebase side3 master 要注意最后push之前要把当前分支合并到想要远程的分支(比如master) 快速前进。。。 git push
-
示意图:
-
-
合并远程仓库
-
rebase与merge之间的区别:
- 优点:Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
- 缺点:Rebase 使你的提交树变得很干净, 所有的提交都在一条线上
- 喜欢保留提交历史,更偏爱 merge;喜欢干净的提交树,偏爱 rebase;因此使用什么根据自己习惯就行。
实现过程:
git checkout master; git pull; git merge side1; git merge side2; git merge side3; git push;
-
过程图:
-
-
远程追踪
-
本地分支与远程分支之间的关联(通过push以及pull):
- pull:提交记录会被先下载到 o/master 上,之后再合并到本地的 master 分支
- push:把工作从 master 推到远程仓库中的 master 分支(同时会更新远程分支 o/master)
- 分支的
remote tracking
(远程跟踪)属性决定,并且git clone
的时候就已经进行设定了,注意提示语句:local branch "master" set totrack remote branch
"o/master"- 自己指定锁定属性:分支会像 master 分支一样得到隐含的 push 目的地以及 merge 的目标。
- 可以在分支 totallyNotMaster 上执行 git push,将工作推送到远程仓库的 master 分支上
-
git checkout -b totallyNotMaster o/master
(第一种方法)检出一个分支跟踪o/masters(totallyNotMaster分支是通过创建出来的) - git branch -u o/master foo(当前就在 foo 分支上, 还可以省略 foo,foo分支是本来存在的)
- 自己指定锁定属性:分支会像 master 分支一样得到隐含的 push 目的地以及 merge 的目标。
-
示意图:
-
-
git push
的参数1-
基本格式语法:
git push
- 具体实例:
git push origin master
——切到本地仓库中的“master”分支,获取所有的提交,再到远程仓库“origin”中找到“master”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。- 过指定参数告诉了 Git 所有它需要的信息, 所以它就忽略了我们所检出的分支的属性
- 有一种情况就是:将某一记录节点检出之后,直接git push就会失败,这时候就需要需要指定本地分支以及远程分支
- 具体实例:
-
关卡问题:本关我们要更新远程仓库中的
foo
和master
, 但是git checkout
被禁用了!git push origin master
-
示意图:
-
-
git push
的参数2-
==来源与去向名称不一致==,比如:想把本地的
foo
分支推送到远程仓库中的bar
分支- 解决方案:同时为源、目的地指定地址:
git push origin
- 注意:
source
可以是git能够识别的任意地址 -
git push origin master:newBranch
(目的分支不存在的话,git就会新创建一个)
- 注意:
- 解决方案:同时为源、目的地指定地址:
-
示意图:
-
-
git fetch
的参数-
git fetch
的参数和git push
极其相似,只是方向反了,一个是上传一个是下载提交记录;git fetch origin foo--->到远程foo上下载所有不存在的节点记录,但是需要注意的是:提交的记录只是放在了o/foo上面,并没有提交到foo上面,这就是fetch特殊的地方;
git fetch origin foo~1:bar
------>结果就是将foo~的记录提交到bar上,如果分支bar不存在就新建一个。git fetch:就是把远程的所有都更新到本地中
-
代码实现过程:
git fetch origin master~:foo git fetch origin foo:master git checkout foo git merge master
-
示意图:
-
-
没有source的
source
-
奇怪的用法:
- 可以在 git push 或 git fetch 时不指定任何
source
,也就是source
留空- git push origin :side---->如果空的上传远程仓库,就是把0赋值给某一个分支,就是删除
side
分支 - git fetch origin :bugFix----->表示可能从远程下载分支,自然就是创建一个新分支
bugFix
- git push origin :side---->如果空的上传远程仓库,就是把0赋值给某一个分支,就是删除
- 可以在 git push 或 git fetch 时不指定任何
-
示意图:
-
push空source
-
fetch空source
-
-
-
git pull
的参数实质意义就是:用同样的参数执行 git fetch,然后再 merge 你所抓取到的提交记录;
-
几个等价的代码:
等价1: git pull origin foo; git fetch origin foo;git merge o/foo; 等价2: git pull origin bar~;bugFix; git fetch origin bar~:bugFix;git mergbe bugFix;
同理git pull也可以用
source:destination
;-
示意图:
-
git pull origin master
-
git pull origin master:foo
-