Learning git branching

learning git branching

merge

  • 创建新分支 bugFix
  • git checkout bugFix 命令切换到该分支
  • 提交一次
  • git checkout main 切换回 main
  • 再提交一次
  • git mergebugFix 合并到 main
1
2
3
4
5
git checkout -b bugFix
git commit
git checkout main
git commit
git merge bugFix

git merge

rebase

操作:

  • 新建并切换到 bugFix 分支
  • 提交一次
  • 切换回 main 分支再提交一次
  • 再次切换到 bugFix 分支,rebase 到 main 上
1
2
3
4
5
6
git checkout -b bugFix
git commit
git checkout main
git commit
git checkout bugFix
git rebase main

git rebase

分离 HEAD

1
git checkout c4

git 分离HEAD

相对引用

利用父节点

1
git checkout HEAD^

寻找 bugFix 的父节点

1
git checkout bugFix^

git 相对引用

branch -f

强制修改分支位置

1
2
3
git branch -f bugFix c0
git branch -f main c6
git checkout c1

git 强制修改分支位置

或者

1
2
3
git checkout c1
git branch -f bugFix HEAD~1
git branch -f main c6

git 强制修改分支位置2

撤销变更

1
2
3
git reset HEAD~1
git checkout pushed
git revert HEAD

git 撤销变更

cherry-pick

1
git cherry-pick c3 c4 c7

git cherry-pick

交互式 rebase

1
git rebase -i HEAD~4

git 交互式rebase

只取一个提交记录

1
2
git rebase -i main
git branch -f main bugFix

git 只提交一个记录

或者

1
2
git checkout main
git cherry-pick bugFix

git 只提交一个记录2

提交的技巧

rebase 在上一次提交上amend

1
2
3
4
git rebase -i main
git commit --amend
git rebase -i main
git branch -f main caption

git 提交的技巧1

或者(多种方法尝试)

1
2
3
4
git rebase -i caption~2
git commit --amend
git rebase -i HEAD~2
git branch -f main caption

cherry-pick 在上一次提交上 amend

1
2
3
4
git checkout main
git cherry-pick newImage
git commit --amend
git cherry-pick caption

git 提交的技巧2

tag

1
2
3
git tag v0 c1
git tag v1 c2
git checkout v1

git tag

多分支 rebase

1
2
3
4
git rebase main bugFix
git rebase bugFix side
git rebase side another
git branch -f main another

git 多分支rebase

两个parent节点

操作符 ^~ 符一样,后面也可以跟一个数字。

但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个 parent 提交。还记得前面提到过的一个合并提交有两个 parent 提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。

Git 默认选择合并提交的“第一个” parent 提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。

1
2
3
git checkout HEAD~^2~
git branch -f bugWork HEAD # git branch -f bugWork
git checkout main

git 两个parent1

或者

1
git branch bugWork HEAD~^2~

git 两个parent2

纠缠不清的分支

1
2
3
4
5
git checkout one
git cherry-pick c4 c3 c2
git checkout two
git cherry-pick c5 c4 c3 c2
git branch -f three c2

git 纠缠不清的分支

偏离的提交历史

1
2
3
4
5
6
git clone
git fakeTeamwork
git commit
git fetch
git rebase o/main
git push

或者

1
2
3
4
5
git clone
git fakeTeamwork
git commit
git pull --rebase
git push

锁定的Main

1
2
3
git reset --hard o/main
git checkout -b feature c2
git push # git push origin feature

推送主分支

1
2
3
4
5
6
git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main
git push

合并远程仓库

1
2
3
4
5
6
git fetch
git rebase o/main main
git merge side1
git merge side2
git merge side3
git push

远程跟踪

1
2
3
4
5
git checkout -b side o/main
git commit
git fetch
git rebase o/main side
git push

或者

1
2
3
4
git checkout -b side o/main
git commit
git pull --rebase
git push

push 的参数

1
2
git push origin main
git push origin foo

push 的参数2

1
2
git push origin foo:main
git push origin main^:foo

fetch 的参数

1
2
3
4
git fetch origin c3:foo
git fetch origin c6:main
git checkout foo
git merge main

没有 source 的 source

1
2
git push origin :foo
git fetch origin :bar

pull 参数

git pull 到头来就是 fetch 后跟 merge 的缩写。可以理解为用同样的参数执行 git fetch,然后再 merge 所抓取到的提交记录。

git pull origin foo 相当于:git fetch origin foo; git merge o/foo

git pull origin bar:bugFix 相当于:git fetch origin bar:bugFix; git merge bugFix

1
2
3
4
git fetch origin c3:foo
git fetch origin c2:side
git merge foo
git merge side

或者

1
2
git pull origin c3:foo
git pull origin c2:side