目录
分支的创建、删除、切换
一、分支的创建
#创建一个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)
在合并的时候,你应该注意到了“快进(fast-forward)”这个词。
由于你想要合并的分支 hotfix 所指向的提交 C4 是你所在的提交 C2 的直接后继, 因此 Git 会直接将指针向前移动。
换句话说,当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
merge(diverged)
你的开发历史从一个更早的地方开始分叉开来(diverged)。
因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。
出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),
做一个简单的三方合并。
rebase
一、简单使用
你可以提取在 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
检出 experiment 分支,然后将它变基到 master 分支上:
二、更有趣的变基
使用 git rebase 命令的 –onto 选项, 选中在 client 分支里但不在 server 分支里的修改(即 C8 和 C9),
将它们在 master 分支上重放:
$ git rebase --onto master server client
$ git checkout master
$ git merge client
$ git rebase master server
三、git pull 与 git pull –rebase 的区别
1、git pull 演示
git fetch origin/temp
git merge origin/temp
2、git pull –rebase 演示
git fetch origin/temp
git rebase origin/temp
四、变基的风险
变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。
1、比如我们的仓库状态如下
2、这时其他人通过变基,修改了teamone/master分支
更改了其历史提交记录(将merge操作回退,重新使用了rebase,丢弃了c4、c6提交)
这是我们执行下 git fetch ,此时我们的仓库状态如下
3、如果我们直接执行git pull操作
以上分析可知,通过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
行者常至,为者常成!