git的一些操作-回顾


主要篇

基础篇

Git Commit

提交记录可以看做项目的快照。

初始

image-20220325101433438

目标

image-20220325101539194

方案:

两次 git commit

Git Branch

分支相当于:要基于这个提交以及它所有的父提交。

创建分支:git branch <mybranch>

切换分支:git checkout <mybranch>

创建并切换分支:git checkout -b <mybranch>

初始

image-20220325101433438

目标

image-20220325102743310

方案:

$ git checkout -b bugFix 

分支与合并

新建一个分支,在上面开发一个新功能,开发完成后合并回主线。git 中合并两个分支会产生一个特殊的提交记录,有两个父节点。

初始

image-20220325101433438

目标

image-20220325103635966

方案:

$ git checkout -b bugFix
$ git commit
$ git checkout main
$ git commit
$ git merge bugFix

Git Rebase

取出一系列的提交记录,复制它们,然后在另一个地方逐个放下去,优势:可以创造更线性的提交历史。

例子:

image-20220325104658368

初始

image-20220325101433438

目标

image-20220325104841678

方案:

$ git checkout -b bugFix
$ git commit
$ git checkout main
$ git commit
$ git checkout bugFix
$ git rebase main

高级篇

在提交树上移动

HEAD指向自己在其基础上进行工作的提交记录,总是指向当前分支的最近一条记录。

初始

image-20220325113610034

目标

image-20220325114121163

方案:

$ git checkout C4

相对引用

初始

image-20220325113610034

目标

image-20220325114149908

方案:

$ git checkout bugFix^

相对引用2

~<num> 一次后退num步。

可以使用-f选项让分支指向另一个提交。如:git branch -f main HEAD~3

初始:

image-20220325114500332

目标:

image-20220325114733723

方案:

$ git branch -f bugFix bugFix~3
$ git checkout HEAD^
$ git branch -f main C6

撤销变更

git reset HEAD~1

image-20220325115041552

C2所做的变更还在,但是处于未加入暂存区状态。

本地分支使用git reset很方便,但是对远程分支无效,为了撤销更改并分享给别人,需要使用git revert。

git revert HEAD

image-20220325115303440

新提交记录C2'引入了更改,来撤销C2的提交,revert之后就可以把更改推送给远程仓库与别人分享了。

初始:

image-20220325115439738

目标:

image-20220325120031267

方案:

git reset HEAD^
git checkout pushed
git revert HEAD

移动提交记录

cherry-pick

例如:我要把这个提交放到这里,那个提交放到刚才那个提交的后面。

image-20220325120509923

交互式rebase

如果知道自己需要的提交记录和对应的哈希值,用cherry-pick。如果不知道,可以用 交互式rebase。

初始:

image-20220325121437348

目标:

image-20220325121417978

方案:

git rebase -i HEAD~4
然后手动调整

杂项

情景一

之前在newImage分支上进行了一次提交,然后基于它又创建了caption分支,然后又提交了一次,但是想对以前的提交记录进行一些小小的调整,比如要修改一下newImage的图片分辨率,尽管那个记录不是最新的。

可以采用的方法:

image-20220325122809769

git commit –amend既可以对上次提交的内容进行修改,也可以修改提交说明。

初始:

image-20220325123816838

目标

image-20220325123344200

方案:

git rebase -i main
git commit --amend
git rebase -i caption~2
git branch -f main caption

情景一(用cherry-pick)

cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。

image-20220325124121396

方案:

git cheerry-pick newImage
git commit --amend
git cherry-pick caption

git tag

高级场景

多次rebase

初始:

image-20220325125520281

目标

image-20220325125534412

方案:

git rebase main bugFix
git rebase bugFix side
git rebase side another
git checkout -f main another

^< num >

image-20220325125740177

git checkout main^2

如:

image-20220325130113318

git branch bugWork HEAD~^2~

多分支

初始

image-20220325130258870

目标:

image-20220325130318982

答案

git checkout one
git cherry-pick C4 C3 C2
git checkout two
git cherry-pick C5 C4 C3 C2
git branch -f three C2

远程篇

Push & Pull —— Git 远程仓库!

git clone 在本地创建一个远程仓库的拷贝。

image-20220325141421315

git pull 就是 git fetch 和 git merge 的缩写。

模拟团队开发

初始:

image-20220325142038273

步骤:

git commit

image-20220325142129362

git pull

image-20220325142158666

就是拉取远程,然后merge。

问题所在

情景:周一克隆了一个仓库,开始研发新功能,周五开发测试完毕,可以发布了。但是有同时这周写了一堆代码,还改了我们自己用到的API,并且已经提交到了远程仓库。我们的代码变成了旧版的代码,git 不会允许push,要先合并最新的代码,然后才能分享。

如:

image-20220325145141736

本地的C3基于C1做的,但是有人提交了C2。

一:merge

image-20220325145459739

git fetch
git merge o/main
git push

二:rebase

image-20220325145535018

git fetch
git rebase o/main
git push

合并的例子

image-20220325150609113

git clone
git fakeTeamwork #生成一个假的C2结点,模拟同事提交
git commit
git pull --rebase
git push

高级特性

rebase or merge

rebase:可以让提交树变得很干净,所有的提交都在一条线上,缺点,修改了提交树的历史。如果要保留提交历史,用merge。

合并特性分支rebase

初始

image-20220325150947590

目标

image-20220325151439035

方案:

git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git branch -f main side3
git checkout main
git push

合并特性分支merge

image-20220325152424461

方案:

git fetch
git branch -f main o/main
git checkout main
git merge side1
git merge side2
git merge side3
git push