git的一些操作-回顾
主要篇
基础篇
Git Commit
提交记录可以看做项目的快照。
初始:
目标:
方案:
两次 git commit
Git Branch
分支相当于:要基于这个提交以及它所有的父提交。
创建分支:git branch <mybranch>
切换分支:git checkout <mybranch>
创建并切换分支:git checkout -b <mybranch>
初始:
目标:
方案:
$ git checkout -b bugFix
分支与合并
新建一个分支,在上面开发一个新功能,开发完成后合并回主线。git 中合并两个分支会产生一个特殊的提交记录,有两个父节点。
初始:
目标:
方案:
$ git checkout -b bugFix
$ git commit
$ git checkout main
$ git commit
$ git merge bugFix
Git Rebase
取出一系列的提交记录,复制它们,然后在另一个地方逐个放下去,优势:可以创造更线性的提交历史。
例子:
初始:
目标:
方案:
$ git checkout -b bugFix
$ git commit
$ git checkout main
$ git commit
$ git checkout bugFix
$ git rebase main
高级篇
在提交树上移动
HEAD指向自己在其基础上进行工作的提交记录,总是指向当前分支的最近一条记录。
初始:
目标:
方案:
$ git checkout C4
相对引用
初始:
目标:
方案:
$ git checkout bugFix^
相对引用2
~<num>
一次后退num步。
可以使用-f选项让分支指向另一个提交。如:git branch -f main HEAD~3
初始:
目标:
方案:
$ git branch -f bugFix bugFix~3
$ git checkout HEAD^
$ git branch -f main C6
撤销变更
git reset HEAD~1
C2所做的变更还在,但是处于未加入暂存区状态。
本地分支使用git reset很方便,但是对远程分支无效,为了撤销更改并分享给别人,需要使用git revert。
git revert HEAD
新提交记录C2'
引入了更改,来撤销C2
的提交,revert
之后就可以把更改推送给远程仓库与别人分享了。
初始:
目标:
方案:
git reset HEAD^
git checkout pushed
git revert HEAD
移动提交记录
cherry-pick
例如:我要把这个提交放到这里,那个提交放到刚才那个提交的后面。
交互式rebase
如果知道自己需要的提交记录和对应的哈希值,用cherry-pick。如果不知道,可以用 交互式rebase。
初始:
目标:
方案:
git rebase -i HEAD~4
然后手动调整
杂项
情景一
之前在newImage分支上进行了一次提交,然后基于它又创建了caption分支,然后又提交了一次,但是想对以前的提交记录进行一些小小的调整,比如要修改一下newImage的图片分辨率,尽管那个记录不是最新的。
可以采用的方法:
git commit –amend既可以对上次提交的内容进行修改,也可以修改提交说明。
初始:
目标:
方案:
git rebase -i main
git commit --amend
git rebase -i caption~2
git branch -f main caption
情景一(用cherry-pick)
cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。
方案:
git cheerry-pick newImage
git commit --amend
git cherry-pick caption
git tag
高级场景
多次rebase
初始:
目标:
方案:
git rebase main bugFix
git rebase bugFix side
git rebase side another
git checkout -f main another
^< num >
git checkout main^2
如:
git branch bugWork HEAD~^2~
多分支
初始:
目标:
答案
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 在本地创建一个远程仓库的拷贝。
git pull
就是 git fetch 和 git merge 的缩写。
模拟团队开发
初始:
步骤:
git commit
git pull
就是拉取远程,然后merge。
问题所在
情景:周一克隆了一个仓库,开始研发新功能,周五开发测试完毕,可以发布了。但是有同时这周写了一堆代码,还改了我们自己用到的API,并且已经提交到了远程仓库。我们的代码变成了旧版的代码,git 不会允许push,要先合并最新的代码,然后才能分享。
如:
本地的C3基于C1做的,但是有人提交了C2。
一:merge
git fetch
git merge o/main
git push
二:rebase
git fetch
git rebase o/main
git push
合并的例子
git clone
git fakeTeamwork #生成一个假的C2结点,模拟同事提交
git commit
git pull --rebase
git push
高级特性
rebase or merge
rebase:可以让提交树变得很干净,所有的提交都在一条线上,缺点,修改了提交树的历史。如果要保留提交历史,用merge。
合并特性分支rebase
初始:
目标:
方案:
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
方案:
git fetch
git branch -f main o/main
git checkout main
git merge side1
git merge side2
git merge side3
git push