Git高级篇(1.3w字)(上)

简介: Git高级篇(1.3w字)(上)

学习笔记:插图如果侵权请联系博主删除。


1.什么是分支?


开发软件时,可能有多个人同时为同一个人软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。


Git分支功能可以支持同时进行多个功能的开发和版本管理。


分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,可以在同一个数据库里可以进行同时进行多个修改。


可以同时进行:发布版本的历史记录,添加功能的历史记录,修复错误的历史记录


分叉的分支可以进行合并


为了不受其他开发人员的影响,可以在主分支上建立自己专用的分支。


完成工作后,将自己分支上的修改合并到主分支,


因为每一次提交的历史记录都会被保存,所以当发生问题时,定位和修改造成问题的提交就容易多了。


添加新功能,修改显示动画的错误,添加任务栏,导入各自的分支,然后进行合体。


2.master分支


在数据库进行最初的提交后,Git会建立一个名为master的分支。因此之后的提交,在切换分支之前都会添加到master分支里


3.分支的运用


Git里面可以自由的建立分支,运用规则才可以有效利用分支,介绍两种分支:Merge分支,Topic分支的运用规则。


3.1Merge分支


Merge分支为了可以随时发布release而建立的分支,它还能作为Topic分支的源分支使用,保持分支的稳定状态,如果需要进行更改,通常需要先创建Topic分支,针对该分支,可以使用Jenkins类的工具进行自动化编译以及测试。


通常会将master当作Merge分支使用。


3.2 Topic分支


Topic分支是为了开发新功能或修复Bug等任务而建立的分支。


如果需要同时进行多个任务,需要创建多个Topic分支。


Topic分支是从稳定的Merge分支创建的。完成作业后,要把Topic分支合并回Merge分支


4.分支的切换


如果需要进行切换作业的分支,就需要进行checkout操作。进行checkout时,git会从工作树还原向目标分支提交的修改内容,checkout之后的提交记录将被追加到目标分支。


4.1HEAD


HEAD指向的是现在使用的分支的最后一次更新。通常指向master分支的最后一次更新,通过移动HEAD,可以变更使用的分支。


4.2stash


未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况下切换到其他分支,修改内容会从原来的分支移动到目标分支。


如果checkout的目标分支中相同的文件也有修改,checkout会失败的。


可以先提交修改内容,或者使用stash暂时保存工作树和索引里还没提交的修改内容,可以事后再取出暂存的修改,应用到原先的分支或其他的分支上

beb39cb1f7ef4aea8a4853bbab1ad447.png


5.分支的合并


完成作业后的topic分支,最后要合并回merge分支。


合并分支有2种方法


使用merge或rebase,使用这两种方法,合并后的分支的历史记录会有很大的差别。


5.1merge


使用merge可以合并多个历史记录的流程


如bugfix分支是从master分支分叉出来的


合并bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合并是非常简单的。


***bugfix分支的历史记录包含master分支所有的历史记录,所以通过把master分支的位置移动到bugfix的最新分支上,Git就会合并。这样的合并被称为fast-forward(快进)合并

366143fd4e29443597275949aec4f420.png

master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。

需要将master分支的修改内容和bugfix分支的修改内容汇合起来。

841fc13e23644b8b9565c40539b46267.png

合并后的两个修改会生成一个提交。master分分支的HEAD会移动到该提交上。

636e78d4fb0042ce8b71ffa64a1aa753.png

5.2 rebase


跟merge的例子应用,进行bugfix分支是从master分支分叉出来的。

df22dd151d5d40adb78ed7c03ec7e27c.png

使用rebase方法进行分支合并,出现下面显示的历史记录。

64e5445f2b0e4948b7f7492cc3ebc8d4.png

流程:rebase bugfix分支到master分支,bugfix分支的历史记录会添加在master分支的后面,历史记录成一条线。


移动提交X,Y可能会发生冲突,需要修改各自的提交时发生冲突的部分。

9f0358c2c16848a79a23b43ba4ee5002.png

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


ed2423ffcf244fa1bbaad9b9be5c3d11.pnge9526fa91fdd454883819d093c6cb97d.pngc60fcb46e5734b0ab0b5bf392260c4ea.png


6.topic分支和merge分支的运用实例

实例进行讲解topic分支和merge分支的操作方法

如需要在开发功能的topic分支操作途中,需要修改bug

7b305ea10447466ab95664e545b54572.png


如果这时候merge分支还是处于开发功能之前的状态,那么在这里新建修改错误用的主题分支,可以从开发功能的作业独立出来,以便于开始新的工作

0cc30605bf5f43dcbb452cb581f5126e.png


完成bug修正工作后,把分支导入到原本的merge分支就可以公开了



回到原本的分支继续进行开发功能的操作

如果需要继续进行操作,发现需要之前修正bug时提交X的内容。


可以选择2种导入X内容的方法,一种是直接merge,另一种是和rebase导入提交X的合并分支

rebase合并分支



导入提交X的内容的状态下继续进行开发功能,有效利用了分支同时进行不同的作业


7.操作分支


7.1事前预备


建立一个新的目录 ,并且在里面建立一个空的数据库。这里我们创建一个名为tutorial的目录。


mkdir tutorial

cd tutorial

git init


Initialized empty Git repository in  


在tutorial目录创建一个名为myfile.txt的档案,然后提交。

git add myfile.txt

git commit -m "first commit"


[master (root-commit) a73ae49] first commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 myfile.txt


l历史记录


7.2 建立分支


创建名为issue1的分支

通过branch命令来创建分支

git branch <branchname>

创建名为issue1的分支。

git branch issue1

不指定参数直接执行branch命令的话,可以显示分支列表。前面含有*的就是现在的分支。

git branch

issue1

*master

目前的历史记录

6883daf40c114afdadc16cf0780f48e2.png


7.3 切换分支


如果需要在新建的issue1分支进行提交,我们需要进行切换到issue1分支。


要执行checkout命令以退出分支


git checkout issue1


Switched to branch 'issue1'

目前历史记录


9e82ea58958e406aa582d8ff985cf44a.png


创建分支并且进行切换


git checkout -b <branch>


切换到issue1分支的状态下提交,历史记录会被记录到issue1分支。在myfile.txt


添加add命令的说明后进行提交


add 把变更录入到索引中


git add myfile.txt


git commit -m "添加add的说明"


[issue1 b2b23c4] 添加add的说明

1 files changed, 1 insertions(+), 0 deletions(-)


目前历史记录:


0b1f917b3b9e4fd698b0b3f6a7c803a1.png


7.4合并分支


向master分支合并issue1分支的修改


执行merge命令以合并分支


git merge <commit>


将指定分支导入到HEAD指定的分支,先切换master分支,然后将issue1分支导入到master分支里面


git checkout master


Switched to branch 'master'

打开myfile.txt档案以确认内容,然后提交。


在issue1分支进行了编辑上一页的档案,所以master分支的myfie.txt的内容没有更改


git merge issue1

Updating 1257027..b2b23c4
Fast-forward
 myfile.txt |    1 +
 1 files changed, 1 insertions(+),
 0 deletions(-)


master分支指向的提交移动到和issue1同样的位置。属于fast-forward(快进)合并


40b62af142b94fd895dad15ca624597b.png


打开myfile.txt档案,确认内容


add 把变更录入到索引中


7.5删除分支


既然issue1分支的内容已经顺利地合并到了master分支,可以进行删除了


在branch命令指定-d选项执行,以删除分支


git branch -d <branchname>


执行以下命令以删除issue1分支


git branch -d issue1


Deleted branch issue1 (was b2b23c4).

issue1分支被删除了。可以采用branch命令确认分支是否被删除。


git branch


12ba74021b15404e98d8a319e7274c37.png


7.6 并行操作


创建2个分支进行并行操作


创建:issue2,issue3分支,并且进行切换 issue2分支


git branch issue2


git branch issue3


git checkout issue2


Switched to branch 'issue2'

$ git branch

* issue2

 issue3

 master


f9be3466a794498680a4a675177d4052.png

在issue2分支的myfile.txt添加commit命令的说明后提交。


add 把变更录入到索引里面


commit 记录索引状态


git  add myfile.txt


git commit -m "添加commit的说明"


[issue2 8f7aa27] 添加commit的说明

1 files changed, 2 insertions(+), 0 deletions(-)

34616ba333414514baec332ebe39782f.png


然后进行切换到issue3分支


git checkout issue3


Switched to branch 'issue3'

打开myfile.txt档案。


由于在issue2分支添加commit命令的说明,所以issue3分支的myfile.txt里只有add命令的说明。


添加pull命令的说明后提交。


add 把变更录入到数据库里面


pull 取得远程数据库的内容


git add myfile.txt


git commit -m "添加pull的说明"


[issue3 e5f91ac] 添加pull的说明

1 files changed, 2 insertions(+), 0 deletions(-)

936dee65c5a5413bb2f6eefe95cced61.png


实现了commit和添加pull的操作并行进行


7.7 解决合并的冲突


将issue2分支和issue3分支的修改合并到master。


切换master分支后,与issue2分支合并


git checkout master


Switched to branch 'master'

git merge issue2


Updating b2b23c4..8f7aa27

Fast-forward
 myfile.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

继续进行合并issue3分支。


git merge issue3


Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Automatic merge failed; fix conflicts and then commit the result.

产生问题:自动合并失败。由于在同一行进行了修改,所以产生了冲突。myfile.txt内容


add 把变更录入到索引中

<<<<<<< HEAD

commit 记录索引的状态

=======

pull 取得远端数据库的内容

>>>>>>> issue3

在发生冲突的地方,Git生成了内容的差异,做出了修改


add 把变更录入到索引中

commit 记录索引的状态

pull 取得远端数据库的内容

修改完冲突的地方后,重新提交


git add myfile.txt


git commit -m "合并issue3分支"


# On branch master

nothing to commit (working directory clean)

历史记录,因为进行了合并修改冲突部分,所以会重新创建合并修改的提交记录。


(non fast -forward)合并


acfd3308579e4d698adc9a250cd8f7e5.png


7.8 用rebase合并


合并issue3分支时候,使用rebase可以使提交的历史显得更加的简洁


现在取消刚才的合并


git reset --hard HEAD~


a9812a09a3ba463a8bb58d796ceb7591.png


切换到issue3分支后,对master执行rebase


git checkout issue3


Switched to branch 'issue3'

git rebase master


First, rewinding head to replay your work on top of it...
Applying: 添加pull的说明
Using index info to reconstruct a base tree...
<stdin>:13: new blank line at EOF.
+
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Failed to merge in the changes.
Patch failed at 0001 添加pull的说明
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort"

和merge时的操作一样,修改在myfile.txt发生冲突的部分


add 把变更录入到索引中

<<<<<<< HEAD

commit 记录索引的状态

=======

pull 取得远端数据库的内容

>>>>>>> issue3

rebase时候,修改冲突后的提交不是使用commit命令,二十执行rebase命令指定 --continue选项 ,如果需要取消rebase,指定 --abort选项。


git add myfile.txt


git rebase --continue

5d92741f1e3745f589236cd9e62423a9.png


这样,在master分支的issue3分支就可以fast-forward合并了。切换到master分支后进行合并


git checkout master


Switched to branch 'master'


git merge issue3


Updating 8f7aa27..96a0ff0
Fast-forward
 myfile.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

最后myfile.txt的最终内容和merge是一样的,但是历史记录:

ab9ce2ad614f4a96bf5e0e23bd3cbe89.png

相关文章
|
7月前
|
测试技术 数据处理 开发工具
《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)
《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)
49 2
|
7月前
|
jenkins 持续交付 开发工具
Git高级使用技巧与策略
【4月更文挑战第30天】本文介绍了Git的高级使用技巧和策略,包括设置命令别名、使用`.gitignore`、交互式暂存、重新排序提交、变基和子模块。此外,还探讨了特性分支、主题分支等分支管理策略,强调保持历史整洁、原子提交以及应对紧急修复的方法。推荐使用GUI工具、钩子和持续集成工具提升效率。掌握这些技巧能有效提升代码管理和团队协作效率。
|
存储 缓存 运维
【运维知识高级篇】一篇文章带你搞懂Git!(Git安装+全局配置+Git初始化代码仓库+Git四大区域+Git四种状态+Git常用命令+Git分支+Git测试代码回滚)
【运维知识高级篇】一篇文章带你搞懂Git!(Git安装+全局配置+Git初始化代码仓库+Git四大区域+Git四种状态+Git常用命令+Git分支+Git测试代码回滚)
262 0
|
7月前
|
开发工具 git
Git命令大全:从基础到高级应用
Git命令大全:从基础到高级应用
|
7月前
|
开发工具 git
git 高级用法
git 高级用法
68 0
git 高级用法
|
存储 开发工具 数据库
Git高级篇(1.3w字)(下)
Git高级篇(1.3w字)(下)
47 0
|
Java 开发工具 git
Git【java 高级】
Git【java 高级】
69 0
|
JavaScript Java 开发工具
接上篇:Git Worktree 高级使用,这样清爽多了
接上篇:Git Worktree 高级使用,这样清爽多了
接上篇:Git Worktree 高级使用,这样清爽多了
|
开发工具 git
Git高级操作
Git高级操作