Git中的五种分支详解及常用命令,rebase和merge的区别

98 阅读6分钟

在Git中,我们通常会接触到三类分支: 远程分支本地分支远程跟踪分支。这三类分支相对容易理解。

远程分支与本地分支

  • 远程分支是远程仓库中的普通分支,存储在远程服务器上。
  • 本地分支是你在本地仓库中创建的分支,用于开发工作。

远程跟踪分支

远程跟踪分支是本地对远程仓库分支的引用。它们在你执行 git fetch时从远程仓库中同步下来,并存储在本地(或者执行pull时也会更新远程跟踪分支)。远程跟踪分支的作用只有一个,那就是检查你的代码修改期间有没有其他人提交代码,在你提交时会把远程跟踪分支和远程分支进行对比,如果不同,则需要处理冲突,如果相同则直接为新的一次提交。远程跟踪分支的命名格式通常为 <origin>/<branch></branch></origin>。这些分支的指针是自动更新的,不能手动更改,只会在你 fetch时自动更新到最新的提交点。

当对一个远程git仓库调用git clone时,会将远程分支复制到本地作为远程跟踪分支和本地分支,如下图

当调用git fetch时会讲远程跟踪分支的最新更新到远程跟踪分支,如下图

此时在执行git merge本地分支则会和远程跟踪分支合并,达到更新本地代码的目的(git pull的本质就是执行fetch和merge的命令)

跟踪分支与上游分支

这两个概念稍微复杂一些:

  • 跟踪分支:这是一个特殊的本地分支。你可以通过设置某一条本地分支来跟踪一个远程分支(通常是远程跟踪分支)。这样,当你在这个本地分支上执行 git pullgit push时,它会默认与被跟踪的远程分支进行交互。
  • 上游分支:这是一个特殊的远程分支,通常是远程跟踪分支。每一个跟踪分支都有一个上游分支,当你设置某个本地分支的上游分支时,这个本地分支就会自动跟踪这个上游分支。

例如,当你在本地的 master分支上,设置它的上游分支为 origin/master,实际上就是让 origin/master(远程跟踪分支)成为本地 master分支的上游分支。此时,本地的 master分支就会自动跟踪这个上游分支。

设置关系

当你设置一个本地分支的上游分支时,这个本地分支也会成为相应远程跟踪分支的跟踪分支。换句话说,这两个分支之间的关系是双向的:一个本地分支可以跟踪一个远程跟踪分支,而这个远程跟踪分支就是这个本地分支的上游分支。

你可以通过 git branch --set-upstream-to=<origin>/<branch></branch></origin>git checkout -b <branch> <origin>/<branch></branch></origin></branch>等命令来设置这种关系。

一旦关系设置好,你就可以轻松地执行 git pullgit push操作,Git会自动找到合适的分支进行合并和推送。

以下是一些常用的 Git 命令及其用途:

1. 基本操作

  • git init:在当前目录初始化一个新的 Git 仓库。
  • git clone <repository></repository>:克隆一个远程仓库到本地。
  • git status:查看工作目录和暂存区的状态,显示哪些文件被修改、哪些文件在暂存区中。
  • git add <file></file>:将文件添加到暂存区,准备提交。
  • git commit -m "<message>"</message>:将暂存区中的内容提交到本地仓库,并添加提交信息。
  • git log:查看项目的提交历史。
  • git diff:查看工作目录中的更改,与暂存区或上次提交进行对比。

2. 分支操作

  • git branch:列出所有本地分支,显示当前所在的分支。
  • git branch <branch-name></branch-name>:创建一个新的本地分支。
  • git checkout <branch-name></branch-name>:切换到指定的分支。
  • git checkout -b <branch-name></branch-name>:创建并切换到一个新的分支。
  • git merge <branch-name></branch-name>:将指定分支合并到当前分支。
  • git branch -d <branch-name></branch-name>:删除本地分支。

3. 远程操作

  • git remote add <name> <url></url></name>:添加一个远程仓库并命名。
  • git remote -v:查看所有远程仓库及其 URL。
  • git fetch <remote></remote>:从远程仓库获取最新的内容,不会自动合并。
  • git pull:从远程仓库拉取最新的内容,并自动与当前分支合并。
  • git push <remote> <branch></branch></remote>:将本地分支的更改推送到远程仓库。
  • git push -u <remote> <branch></branch></remote>:推送本地分支并将其设置为跟踪分支。

4. 变基与修订

  • git rebase <branch></branch>:将当前分支的提交应用到另一个基线分支之上,类似于合并,但历史记录更简洁。
  • git reset <commit></commit>:重置当前分支到指定的提交,可以是软重置(保留更改)或硬重置(丢弃更改)。
  • git revert <commit></commit>:撤销指定的提交,生成一个新的提交来取消之前的更改。
  • git cherry-pick <commit></commit>:将指定的提交应用到当前分支,通常用于从其他分支选择特定的提交。

5. 标签操作

  • git tag <tag-name></tag-name>:为当前提交打标签。
  • git tag:列出所有标签。
  • git push <remote> <tag></tag></remote>:将标签推送到远程仓库。

6. 日常管理

  • git stash:将未提交的更改保存到栈中,以便稍后恢复。
  • git stash pop:从栈中恢复最近一次保存的更改。
  • git clean -f:清理工作目录,移除未跟踪的文件。

7. 子模块操作

  • git submodule add <repository></repository>:将一个仓库作为子模块添加到项目中。
  • git submodule update --init --recursive:初始化、更新所有子模块。
  • git submodule status:查看当前子模块的状态。

rebase和merge的区别

reabase盒merge两个都是合并两个分支,其中merge是将目标分支的结尾和当前分支的结尾合并为一次提交,放在当前分支的末尾,如下图

而rebase则是将目标分支拖离远来的基点,拼接到目标的末尾,并且将基于原来基点的改变,变为基于当前基点的改变,如果当前基点相较于原来基点的改变和本次rebase发生冲突,那么则需要认为解决冲突。如下图

rebase的优点是合并后分支更加清晰,如果合并操作较多,merge不好追踪,而rebase则是和没有合并一样清晰。单缺点也比较致命,合并后原来的版本将无法回滚,并且如果合并的目标分支修改过多,解决冲突也很麻烦。

merge的优点则是保存所有的提交历史,并且只合并末尾两个版本。而缺点则是如果合并操作过多,merge合并的分支会看起来很乱。

var code = "40922e9e-1795-48a6-83d9-ddefa3d995c8"