跳转至

04.IdeaGit 分支管理

约 1063 个字 29 行代码 25 张图片 预计阅读时间 4 分钟

1. 查看分支

Bash
1
2
3
git branch        // 查看本地分支信息
git branch -v     // 查看相对详细的本地分支信息
git branch -av     // 查看包括远程仓库在内的分支信息

注意:在 git branch 的输出内容中,有一个分支,前面带有 * 号,这标识我们当前所在的分支。

2. 创建分支

分支创建后,新分支基于当前分支。

Bash
git branch dev 

idea 中

3. 切换分支

Bash
git checkout dev

idea:

4. 创建并切换分支

Bash
git checkout -b dev # 新建 dev 分支,并切换到该分支上

5. 合并分支

Bash
git checkout master        # 切换回 master 分支
git merge dev            # 将 dev 分钟中的修改合并回 master 分支

idea:先check out 到指定标签,在把需要合并的标签右键合并即可。

6. 删除分支

Bash
git branch -d dev # 删除 dev 分支

7. 建立本地分支和远程分支的关联

7.1 本地分支存在,远程分支存在,但之间没有关联关系。

Bash
git push -u origin/remote_branch 命令推送。

7.2 本地分支存在,但远程分支不存在。

Bash
git push origin local_branch:remote_branch 

7.3 本地分支存在,远程分支存在,且关联关系已建立

使用 git push 命令进行推送即可

idea中本地push时直接修改远程分支名即可

8. 从远程仓库拉取

通过 git fetchgit pull 来获取远程仓库的内容。

Bash
git fetch origin master    
git pull origin master

git fetchgit pull 之间的区别:

8.1 git fetch

git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。

需要先查看更新:

Bash
git log -p FETCH_HEAD

或者拉取到一个其他分支(目前还没见过分支创建)

如果没有问题,再进行合并:

Bash
git merge origin/master

新建一个本地分支,拉取远程到本地temp,查看不同,没问题则合并,合并后删除即可。

Bash
## 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支;
$ git fetch origin master:temp

## 比较本地代码与刚刚从远程下载下来的代码的区别;
$ git diff temp

## 合并temp分支到本地的master分支;
$ git merge temp

## 如果不想保留temp分支,删除;
$ git branch -d temp

实机演示:

在远程仓库手动修改t1111511, 在本地仓库的t1文件中添加666commit

1. git fetch origin master:temp

2. git diff temp

3. git merge temp

出现冲突,手动解决

选择全部接受(lazygitb),当然也可以只选择某一个hunk

最终commit log如下所示

4. git branch -d temp


8.2 git pull

git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge

Bash
1
2
3
# 因为存在冲突故git pull会报错,以下命令二选一即可
git pull --no-rebase # merge冲突
git pull --rebase # rebase冲突


8.3 idea 拉取远程仓库

1. 前置准备

本地创建GitPullTest.java并添加f1函数,提交并推送

本地仓库添加f2函数,并提交

远程仓库添加f3函数,并提交


2. git fetch

找到idea上方git菜单,选择fetch (这里仅演示fetch,不演示pull,思想都是一致的)

选择remote下的main分支,查看更改

检查过后发现没有问题,右键remotemain分支,选择mergerebase合并

选择merge,发现出现冲突,需要解决

点击merge按钮,弹出冲突解决页面

左侧为本地仓库代码,右侧为远程仓库代码

有两种方式解决冲突

  1. 左下角 Accept LeftAccept Right,但只能选择一个仓库的代码作为最终合并文件
  2. 屏幕中间的>><<,可以同时保留本地和远程代码,也可以只选择其中一份

这里选择同时保留本地和远程代码

PS: 中间部分可以随意修改/调换位置,但两侧是无法修改的

最终效果如图所示(merge)

如果选择rebase,最终效果如下图所示


8.4 merge与rebase的区别(存在冲突)

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 就可以简单地将当前分支 “快进” 到目标分支的最新提交,而不需要创建新的合并提交。

merge ff:rebase

上面的例子中,dev分支为目标分支,feature分支为当前分支

dev分支中不存在新的提交,且feature分支完全处于dev分支之前,此时进行merge将触发fast-forward,效果与rebase一致