04.IdeaGit 分支管理¶
约 1063 个字 29 行代码 25 张图片 预计阅读时间 4 分钟
1. 查看分支¶
注意:在 git branch
的输出内容中,有一个分支,前面带有 *
号,这标识我们当前所在的分支。
2. 创建分支¶
分支创建后,新分支基于当前分支。
Bash | |
---|---|
idea 中
3. 切换分支¶
Bash | |
---|---|
idea:
4. 创建并切换分支¶
Bash | |
---|---|
5. 合并分支¶
idea:先check out 到指定标签,在把需要合并的标签右键合并即可。
6. 删除分支¶
Bash | |
---|---|
7. 建立本地分支和远程分支的关联¶
7.1 本地分支存在,远程分支存在,但之间没有关联关系。¶
Bash | |
---|---|
7.2 本地分支存在,但远程分支不存在。¶
Bash | |
---|---|
7.3 本地分支存在,远程分支存在,且关联关系已建立¶
使用 git push
命令进行推送即可
idea中本地push
时直接修改远程分支名即可
8. 从远程仓库拉取¶
通过 git fetch
和 git pull
来获取远程仓库的内容。
git fetch
和 git pull
之间的区别:
8.1 git fetch¶
git fetch
是仅仅获取远程仓库的更新内容,并不会自动做合并。
需要先查看更新:
Bash | |
---|---|
或者拉取到一个其他分支(目前还没见过分支创建)
如果没有问题,再进行合并:
Bash | |
---|---|
新建一个本地分支,拉取远程到本地temp,查看不同,没问题则合并,合并后删除即可。
Bash | |
---|---|
实机演示:
在远程仓库手动修改t1
的111
为511
, 在本地仓库的t1
文件中添加666
并commit
1. git fetch origin master:temp
2. git diff temp
3. git merge temp
出现冲突,手动解决
选择全部接受(lazygit
按b
),当然也可以只选择某一个hunk
最终commit log
如下所示
4. git branch -d temp
8.2 git pull¶
git pull
在获取远程仓库的内容后,会自动做合并,可以看成 git fetch
之后 git merge
。
8.3 idea 拉取远程仓库¶
1. 前置准备¶
本地创建GitPullTest.java
并添加f1
函数,提交并推送
本地仓库添加f2
函数,并提交
远程仓库添加f3
函数,并提交
2. git fetch¶
找到idea上方git
菜单,选择fetch
(这里仅演示fetch
,不演示pull
,思想都是一致的)
选择remote
下的main
分支,查看更改
检查过后发现没有问题,右键remote
的main
分支,选择merge
或rebase
合并
选择merge
,发现出现冲突,需要解决
点击merge
按钮,弹出冲突解决页面
左侧为本地仓库代码,右侧为远程仓库代码
有两种方式解决冲突
- 左下角
Accept Left
和Accept Right
,但只能选择一个仓库的代码作为最终合并文件 - 屏幕中间的
>>
和<<
,可以同时保留本地和远程代码,也可以只选择其中一份
这里选择同时保留本地和远程代码
PS: 中间部分可以随意修改/调换位置,但两侧是无法修改的
最终效果如图所示(merge
)
如果选择rebase
,最终效果如下图所示
8.4 merge与rebase的区别(存在冲突)¶
1. merge
- 保留分支历史(会产生合并提交 merge commit)。
- 适合多人协作,不会修改历史记录。
2. rebase
- 不产生合并提交,而是将 feature 分支上的提交重新应用到 main 分支后面。
- 历史会被重写(提交哈希值改变),适合保持提交历史整洁。
8.5 merge fast-forward(不存在冲突)¶
Fast-forward
是 Git 中的一种 合并方式,当你执行 git merge
时,如果当前分支没有新的提交(即该分支的 HEAD 没有分歧),Git 会直接将当前分支指向目标分支的最新提交,而不创建额外的合并提交。
什么时候会发生 Fast-Forward
?
- 当目标分支没有新的提交,并且当前分支完全处于目标分支的前面(即目标分支是当前分支的祖先),Git 就可以简单地将当前分支 “快进” 到目标分支的最新提交,而不需要创建新的合并提交。
上面的例子中,dev
分支为目标分支,feature
分支为当前分支
dev
分支中不存在新的提交,且feature
分支完全处于dev
分支之前,此时进行merge
将触发fast-forward
,效果与rebase
一致