JHHK

欢迎来到我的个人网站
行者常至 为者常成

9、分支操作

目录

分支的创建、删除、切换

一、分支的创建

#创建一个temp分支,并切换到temp
git checkout out -b temp
git checkout -h
-b <branch>           create and checkout a new branch
-B <branch>           create/reset and checkout a branch

二、分支的切换

#切换到main分支
git checkout main

三、分支的删除

1、指令

git branch -d branchName
git branch -D branchName 

2、演示

#假如我们现在有三个分支,如下
localhost:gitLearning LC$ git branch -av
  fix_readme b2b9461 delete branch test
* master     e37b35d Background change green
  temp       206309d detached test


#现在删除不需要的fix_readme分支,执行以下指令
localhost:gitLearning LC$ git branch -d fix_readme
error: The branch 'fix_readme' is not fully merged.
If you are sure you want to delete it, run 'git branch -D fix_readme'.

#我们发现Git报错,并不允许我们删除,     
#原因是我们没有对这个分支合并,当我们删除这个分支后,在这个分支上提交的commit会丢失,      
#Git为安全起见不允许我们删除未合并的分支。

#但如果我们自己判定这个分支是安全的、无用的,我们可以按照Git的提示使用 -D 来删除这个分支
localhost:gitLearning LC$ git branch -D fix_readme
Deleted branch fix_readme (was b2b9461).
localhost:gitLearning LC$ git branch -av
* master e37b35d Background change green
  temp   206309d detached test
localhost:gitLearning LC$ 

merge(fast-forward)

img

在合并的时候,你应该注意到了“快进(fast-forward)”这个词。
由于你想要合并的分支 hotfix 所指向的提交 C4 是你所在的提交 C2 的直接后继, 因此 Git 会直接将指针向前移动。
换句话说,当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

img

merge(diverged)

img

你的开发历史从一个更早的地方开始分叉开来(diverged)。
因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。
出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),
做一个简单的三方合并。

img

rebase

一、简单使用

img

你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基(rebase)。
你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

img

检出 experiment 分支,然后将它变基到 master 分支上:

二、更有趣的变基

img

使用 git rebase 命令的 –onto 选项, 选中在 client 分支里但不在 server 分支里的修改(即 C8 和 C9),
将它们在 master 分支上重放:

$ git rebase --onto master server client

img

$ git checkout master
$ git merge client
$ git rebase master server

img

三、git pull 与 git pull –rebase 的区别

1、git pull 演示

git fetch origin/temp
git merge origin/temp

img

2、git pull –rebase 演示

git fetch origin/temp
git rebase origin/temp

img

四、变基的风险

变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。

1、比如我们的仓库状态如下

img

2、这时其他人通过变基,修改了teamone/master分支

更改了其历史提交记录(将merge操作回退,重新使用了rebase,丢弃了c4、c6提交)

这是我们执行下 git fetch ,此时我们的仓库状态如下

img

3、如果我们直接执行git pull操作

img

以上分析可知,通过rebase操作共享分支的历史,会造成混乱,所以使用rebase要遵循一条准则

如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

换句话说就是

不要修改共享分支的提交历史

cherry-pick

#查看提交记录,找到要cherry-pick的commit的hash值
bogon:gitLearning_02 LC$ git log --oneline 

#切换到目标分支
bogon:gitLearning_02 LC$ git checkout main

#执行cherry-pick,对应的commit就会到达目标分支
bogon:gitLearning_02 LC$ git cherry-pick e17811c

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.