在开发软件时,可能有多人同时为同一个软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。Git的分支功能可以支持同时进行多个功能的开发和版本管理。
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。分叉的分支可以合并
在数据库进行最初的提交后, Git会创建一个名为main的分支。因此之后的提交,在切换分支之前都会添加到main分支里。
之前默认是master分支。可以在命令行中进行修改: git --version #查看版本 git config --global init.defaultBranch main #git在2.28.0上,重新设置git默认分支为main
分支 (“Merge分支”和 “Topic分支” ) 的运用规则。
Merge分支是为了可以随时发布release而创建的分支,它还能作为Topic分支的源分支使用。保持分支稳定的状态是很重要的。如果要进行更改,通常先创建Topic分支,最后合并到Merge分支上。通常,大家会将master分支当作Merge分支使用。
Topic分支是为了开发新功能或修复Bug等任务而建立的分支。若要同时进行多个的任务,则创建多个的Topic分支。
若要切换作业的分支,就要进行checkout操作。进行checkout时,git会从工作树还原向目标分支提交的修改内容。checkout之后的提交记录将被追加到目标分支。
HEAD指向的是现在使用中的分支的最后一次更新。通常默认指向master分支的最后一次更新。通过移动HEAD,就可以变更使用的分支。
提交时使用~和^就可以指定某个提交的相对位置。最常用的就是相对于HEAD的位置。
还未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况下切换到其他的分支时,修改内容会从原来的分支移动到目标分支。但是如果在checkout的目标分支中相同的文件也有修改,checkout会失败的。这时要么先提交修改内容,要么用stash暂时保存修改内容后再checkout。
stash是临时保存文件修改内容的区域。stash可以暂时保存工作树和索引里还没提交的修改内容,您可以事后再取出暂存的修改,应用到原先的分支或其他的分支上。

merge或rebase两种方法。
使用merge可以合并多个历史记录的流程。
合并 bugfix分支到master分支时,如果master分支的状态没有被更改过。

bugfix分支的历史记录包含master分支所有的历史记录,把master分支的位置移动到bugfix的最新分支上,Git 就会合并。

如果设定了non fast-forward选项,即使在能够fast-forward合并的情况下也会生成新的提交并合并。

master分支的历史记录有可能在bugfix分支分叉出去后有新的更新,则修改内容需要汇合起来,master分支的HEAD会移动到该提交上。


rebase bugfix分支到master分支, bugfix分支的历史记录会添加在master分支的后面。提交X和Y有可能会发生冲突,所以需要修改各自的提交时发生冲突的部分。

rebase之后,master的HEAD位置不变。因此,要合并master分支和bugfix分支,即是将master的HEAD移动到bugfix的HEAD这里。

一些建议:

来源:a-successful-git-branching-model
$ git branch <branchname>创建名为issue1的分支。 $ git branch issue1
不指定参数直接执行branch命令。前面有*的就是现在的分支。
$ git branch
issue1
* master执行checkout命令以切换分支。
$ git checkout <branch>创建分支并切换 $ git checkout -b <branch>
执行merge命令以合并分支。
$ git merge <commit>该命令将指定分支导入到HEAD指定的分支。先切换master分支,然后把issue1分支导入到master分支。 $ git checkout master Switched to branch 'master' 已经在issue1分支进行了编辑上一页的档案,所以master分支的myfile.txt的内容没有更改。 $ git merge issue1 Updating 1257027..b2b23c4 Fast-forward myfile.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) master分支指向的提交移动到和issue1同样的位置。这个是fast-forward(快进)合并。
在branch命令指定-d选项执行,以删除分支。
$ git branch -d <branchname>取消刚才的合并
$ git reset --hard HEAD~rebase合并
$ git rebase <commit>rebase的时候,修改冲突后的提交不是使用commit命令,而是执行rebase命令指定 --continue选项。若要取消rebase,指定 --abort选项。
$ git add .
$ git rebase --continue$ git checkout issue3 $ git rebase master # 以master为基,合并issue3

在master分支的issue3分支就可以fast-forward合并了。切换到master分支后执行合并。 $ git checkout master $ git merge issue3

比较直接merge的记录
