git rebase 使用

732 阅读7分钟

git rebase 是一个 Git 命令,用于将一个分支的修改重新应用到另一个分支上。它主要用于使提交历史更加清晰和线性。通过使用 rebase,可以把多个分支的改动整理成一个直线(线性)的历史,避免在 Git 历史中出现不必要的合并提交。

以下是一个简单的例子来说明 git rebase 的用法:

假设我们有一个项目,其中包含两个分支:masterfeaturemaster 分支有两个提交,而 feature 分支基于 master 的第一个提交,并且增加了另外两个提交。

  1. 初始状态:

    A---B  master
     \
      C---D  feature
    

    这里,ABmaster 分支上的提交,而 CDfeature 分支上的提交。

  2. 切换到 feature 分支并执行 git rebase master

    git checkout feature
    git rebase master
    

    通过这个命令,Git 会取出 feature 分支上的改动(即 CD),并尝试将它们重新应用在 master 分支的顶部(即在 B 提交之后)。

  3. 重整后的状态:

    A---B  master
        \
         C'---D'  feature
    

    这里,C'D' 是重新应用的提交。它们与原来的 CD 提交内容相同,但它们的基本提交(或称父提交)已经变成了 B

在实际开发中,git rebase 可以用于:

  • 在将本地分支的更改合并到共享分支之前,先同步最新的共享分支的更改。
  • 在创建 Pull Request(PR)之前,整理(squash)或重写提交历史,使得历史更加清晰。

需要注意的是,git rebase 会改变历史,所以在对已经推送到远程仓库的分支执行 rebase 操作时需要谨慎,因为这可能会影响其他协作者的工作流。在这种情况下,通常需要使用 git push --force 来强制推送更改。

例子

我当前分支为 feature/kavinkhuang_119750628_mie_2 我需要将master 分支上的代码应用到我当前这个分支,该怎么做

要将 master 分支上的代码应用到你当前的分支 feature/kavinkhuang_119750628_mie_2,你可以使用 git rebase 命令。下面是具体的步骤:

  1. 首先,确保你的本地 master 分支是最新的。切换到 master 分支,然后从远程仓库拉取最新的代码:

    git checkout master
    git pull origin master
    
  2. 切换回你的特性分支 feature/kavinkhuang_119750628_mie_2

    git checkout feature/kavinkhuang_119750628_mie_2
    
  3. 现在,你可以开始 rebase 操作,将 master 分支的更新应用到你的特性分支上:

    git rebase master
    

    这个命令会将你的 feature/kavinkhuang_119750628_mie_2 分支上的所有提交暂时“移除”,然后将 master 分支的最新提交作为基础,再将你的修改依次应用上去。

  4. 如果在 rebase 过程中遇到冲突,Git 会暂停 rebase 并让你去解决冲突。解决冲突后,你需要使用以下命令继续 rebase 过程:

    git add <解决冲突的文件>
    git rebase --continue
    

    如果你决定不继续 rebase 操作,可以使用以下命令终止 rebase 进程:

    git rebase --abort
    
  5. 一旦 rebase 完成并且所有冲突都被解决,如果你之前已经将 feature/kavinkhuang_119750628_mie_2 分支推送到了远程仓库,由于 rebase 改变了历史,你需要使用强制推送来更新远程分支:

    git push origin feature/kavinkhuang_119750628_mie_2 --force
    

请注意,强制推送可能会影响其他正在此分支上工作的协作者。在执行强制推送前,最好先与团队成员确认。

详细解释下git rebase master 的过程

git rebase master 是一个强大的 Git 命令,用于将一个分支的修改重新应用到另一个分支上。在这个例子中,你是从 feature/kavinkhuang_119750628_mie_2 分支进行 rebase 到 master 分支。下面详细解释这个过程:

1. 选择新的基点

当你运行 git rebase master 时,Git 首先会找到两个分支(即当前分支 feature/kavinkhuang_119750628_mie_2master 分支)的共同祖先。然后,Git 将把当前分支的头部暂时移除,以 master 分支的最新提交为基点。

2. 临时移除更改

接下来,Git 会暂时移除 feature/kavinkhuang_119750628_mie_2 分支自从与 master 分支发散以来的所有提交。这些提交会被暂存起来,以便稍后重新应用。

3. 应用提交

一旦 master 分支的最新提交成为了基点,Git 接着将前面暂存的每个提交依次应用到 master 分支之上。这一过程是逐个进行的,每次应用一个提交。

4. 解决冲突

在重新应用提交的过程中,可能会遇到代码冲突,即当前特性分支的代码修改与 master 分支的最新代码不兼容。当这种情况发生时,Git 会暂停 rebase 操作,并提示你去解决这些冲突。你需要手动编辑冲突的文件,然后用 git add 命令标记为已解决冲突,接着使用 git rebase --continue 继续 rebase 过程。如果冲突太复杂或想放弃 rebase,可以使用 git rebase --abort 回到 rebase 开始前的状态。

在 Git 中进行 rebase 操作时,遇到代码冲突时会看到冲突标记,这些标记帮助你识别冲突的不同版本。具体来说:

  • 当前更改(Current changes):指的是你当前分支上的更改。
  • 传入的更改(Incoming changes):指的是你正在 rebase 到的分支上的更改。

举个例子,假设你在 feature 分支上进行开发,并且你想要将 main 分支的最新更改 rebase 到 feature 分支上。在 rebase 过程中,假设 main 分支和 feature 分支都对同一个文件 example.txt 进行了修改,导致冲突。

假设 example.txt 文件内容如下:

main 分支上:

Hello, this is the main branch.

feature 分支上:

Hello, this is the feature branch.

当你执行 git rebase main 时,Git 会检测到冲突并在 example.txt 文件中插入冲突标记:

<<<<<<< HEAD
Hello, this is the feature branch.
=======
Hello, this is the main branch.
>>>>>>> main

在这个例子中:

  • <<<<<<< HEAD======= 之间的内容是当前更改,即 feature 分支上的更改。
  • =======>>>>>>> main 之间的内容是传入的更改,即 main 分支上的更改。

你需要手动编辑文件,选择保留的内容并删除冲突标记。例如,你可以选择保留 feature 分支的更改:

Hello, this is the feature branch.

或者你可以选择保留 main 分支的更改:

Hello, this is the main branch.

或者你可以合并两者的内容:

Hello, this is the main branch and the feature branch.

完成编辑后,保存文件并继续 rebase 操作:

git add example.txt
git rebase --continue

通过这种方式,你可以解决 rebase 过程中遇到的代码冲突。

5. 完成 Rebase

一旦所有的提交都被成功应用,并且所有的冲突都解决了,rebase 操作就完成了。此时,feature/kavinkhuang_119750628_mie_2 分支的头部会指向一个全新的提交,这个提交的内容是将 feature/kavinkhuang_119750628_mie_2 分支的更改应用在 master 分支的最新提交之上。

通过使用 rebase,你的特性分支可以模拟基于 master 分支最新状态的一个干净的历史。这使得将来合并特性分支回 master 分支时更为简洁,因为它将是一个快进合并(fast-forward merge),不会产生额外的合并提交。

6,例子

如果你希望使用 rebase 操作将当前分支的提交基于 master 分支的最新提交进行重放,可以按照以下步骤操作

  1. 切换到当前分支
git checkout feature/nolankywu_122360898_spark-admin
  1. 从远程仓库拉取 master 分支的最新更改
git fetch origin master
  1. 执行 rebase 操作
git rebase origin/master

此命令会将当前分支的提交移到 master 分支的最新提交之后。

  1. 解决可能出现的冲突
    如果在 rebase 过程中出现冲突,你需要手动解决这些冲突。解决冲突后,使用以下命令继续 rebase
git add <conflicted_file>
git rebase --continue

将 <conflicted_file> 替换为实际冲突的文件名。

  1. 推送到远程仓库
    由于 rebase 操作会改变提交历史,你需要使用强制推送:
git push -f origin feature/nolankywu_122360898_spark-admin