Git 笔记
文章目录
- Git 笔记
- 前言
- 正文
-
- 一、基础篇(git主要命令)
- 二、高级篇
- 三、移动提交记录(自由修改树)
- 四、杂项
- 五、高级话题
- 六、远程 —— Push & Pull( Git 远程仓库)
- 七、远程 —— origin 和它的周边(Git 远程仓库高级操作)
-
- 1. 推送主分支(git rebase 节点名 的应用)
- 2. 推送主分支(git fetch | git rebase 分支名 分支名 | git pull --rebase 运用)
- 3. 合并远程分支(git fetch 和 git merge 综合应用)
- 4. 远程追踪(git rebase 节点名 的应用)
- 5. git push 的参数1(git push 远程名 指定分支名)
- 6. git push的参数2(git push 远程名 来源结点或分支:去向分支)
- 7. git fetch 参数(git fetch 远程名 来源结点或分支:去向分支)
- 8. 没有source的source(git fetch :分支名 | git push :分支名)
- 9. git pull 参数(git rebase 节点名 的应用)
- 总结
前言
本文是根据Learning Git Branching游戏中学习整理而来的。
本文整体结构就是按照游戏“目录设计”进行安排
同时本人也会加上命令解释、给出使用示例以及给出游戏的最终答案。
不想慢慢玩游戏学习的童鞋,可以看此文章速览全部游戏关于git介绍
虽然这个游戏并不会涵盖所有所有的命令,但是作为入门理解思想是非常到位的!因为这个是可视化git!
正文
开头的一到五章讲解的都是本地仓库的命令,即这些命令都是对本地仓库进行操作。第六章之后才是远程。
一、基础篇(git主要命令)
1. git commit
功能:将增量修改的内容进行提交
示例:(解释:C0、C1是分开的两次提交记录,其中C0 是C1 父分支,即C1是基于C0增量修改提交的,main意思是箭头指向的之处的分支线叫main分支,其标指向的就是该分支最新的提交处,其中*号意思是你目前正在操作的分支,是一个标记。)
git commit
之后
此时增加C2提交记录,且是基于C1的,仍然是main分支线上的延申。
游戏答案:
git commit
git commit
2. git branch 分支名 | git checkout 分支名
- git branch 分支名 -
功能 :即在现在的分支线上开辟另一个分支(有点像开一个分叉树枝的芽),在该节点之前的内容都是相同的,之后提交的内容就只能在一个分支上延申。
示例:
git branch newImage
(解释:我们可以看到现在多了一个newImage分支,但是因为我们只是新建分支,也就是多了一个芽而没有树干,所以两个分支都在C1处。
此时如果我们输入
git commit
main分支往前一步,当前分支还是main,newImage还是在C1处
- git checkout 分支名 -
功能 :切换当前操作的分支到特定分支名。
示例:(当前是main分支)
git checkout newImage
git commit
最后其实还有个快捷键:git checkout -b 分支名 实现创建分支的同时切换该分支为当前操作分支
游戏答案:
git checkout -b bugFix
3. git merge 分支名 | git rebasse 分支名
- git merge 分支名 -
功能:将当前分支和另一个指定分支合并,可能会产生新的结点,也可能不会,看下面示例。
示例:
git merge bugFix
git checkout bugFix
git merge main
git merge游戏答案:
git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix
git rebase 分支名
作用:即将当前的分支合并到另一分支,但是合并的方式不是多一个结点,而是将当前分支的所有多出来的修改全部加到另一个分支,这时整体上看只有一条线性发展。而不是分开同步运行后合并的视角,而是将并行转化成前后的同步关系
示例:
git rebase main
git checkout main
git rebase bugFix
二、高级篇
1. 分离HEAD(git checkout 记录结点名)
作用:分离HEAD,就是我们可以操作的当前位置不再是对分支而是可以对某次记录也就是结点。
解释:HEAD默认就是指向分支名的,即我们看到的*指向的分支,当我们分支commit后,我们HEAD会往前走,分支便也会自动往前走,而如果我们指向具体历史记录commit后,HEAD往前走,分支原地不动,这就是分离HEAD脱离了分支。
即原本 HEAD->main分支->c1结点 变成 HEAD->c1 这就是分离
示例:
git checkout main
没有变化,因为HEAD->bugFix->c4,即使git commit两者同步向前
git checkout c4
HEAD->c4 分离开来
git commit
HEAD会往前走,但分支不会动
2. 相对引用(git checkout 分支名^ | git checkout 分支名~num)
作用:分离HEAD的时候可以通过当前分支相对的移动,这样我们可以不用记住某结点哈希值(可以通过git log查看)。这里说一说结点哈希值是什么,我们会发现我们之前分支名都是c1之类的,其实c1只是这个结点哈希值的头两个值,但因为具有区分唯一性,所以我们可以只打开头两个字符,全名可能是:c4d2da64c0efc5293610bdd892f82a58e8cbc5d8。所以相对引用就是HEAD的设置不根据哈希值来确定,可以通过相对位置确定。因为分支名字相对于结点名字更加的容易记住和使用。
示例:
git checkout main^
第二个例子:
git checkout c3
git checkout HEAD^
git checkout HEAD^
git checkout HEAD^
第三个示例:
git checkout HEAD~4
第四个示例:
git branch -f main HEAD~3
相对引用为我们提供了一种简洁的引用提交记录 C1 的方式, 而 -f 则容许我们将分支强制移动到那个位置。
第一个游戏答案:
gti checkout bugFix^
第二个游戏答案:
git checkout HEAD^
git branch -f main c6
git branch -f bugFix HEAD^
3. 撤销更改 (git reset 结点位置 | git revert 结点位置)
作用:撤销之前提交过的更改,这里要分为两种情况讨论,一个是对于本地而言的更改,一个是针对远程的更改。git reset是针对本地而言,这个撤回向上移动分支,原来指向的提交记录就跟从来没有提交过一样,这里没有提交过是针对远程的协作成员而言,他们不知道你曾经在你的本地撤销过,但其实撤销后记录还在,只是不在暂存区。而对于git revert则是针对远程的撤销这个更改所有人是可见的,怎么可见呢?就是会有个多出来的结点表示撤销了更改。可以看下面示例就清楚了。
示例:
示例1:git reset
git reset HEAD^
示例2:git revert
git revert HEAD~1
可以看到所谓的撤回还是增加了新的结点让所有人知道你撤回了。
游戏答案:
gti reset HEAD^
gti checkout pushed
gti revert HEAD~1
三、移动提交记录(自由修改树)
1. git cherry-pick 提交号
作用:将一些提交复制到当前所在的位置(HEAD)下面
示例:
git Cherry-pick c2 c4
可以看到,此时相对于rebase 来说,最大的特点就是原本的分支不会变,而是将这个“樱桃”给复制过来了。(这里只复制了c2 c4,没有c3)
第一个游戏答案:
gti cherry-pick c3 c4 c7
第二个游戏答案:
git checkout HEAD^
git branch -f main c6
git branch -f bugFix HEAD^
2. 交互式rebase(git rebase -i 分支名^ | git checkout 分支名~num)
作用:cherry-pick需要指定特定的记录,比如某个记录的哈希值,而如果清不清楚的话,这时候就可以使用rebase -interactive,这个命令的意思是将git可视化出现一个UI图,便于我们对UI图进行交互式的操作,(在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。)它提供了三个操作:
- 调整提交记录的顺序(通过鼠标拖放来完成)
- 删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)
- 合并提交(允许你把多个提交记录合并成一个)
<