【Git 篇】当分支处于一个变基(rebase)状态时, 该怎么办?

1,001 阅读5分钟

分支变为 Feature_xxx|REBASE 的原因

分支状态显示为 Feature_xxx|REBASE 通常意味着你当前正处于一个变基(rebase)操作的过程中。变基是 Git 中一种将一系列提交应用到另一个分支上的操作。当你执行 git rebase 命令时,Git 会逐个应用提交,如果在这个过程中遇到冲突或者其他问题,就会暂停变基操作,此时分支状态就会显示为 分支名|REBASE

解决方法

1. 完成变基操作

如果你想继续完成变基操作,可以按照以下步骤处理:

  • 解决冲突(如果有) :如果变基过程中遇到了冲突,需要手动编辑冲突文件,解决冲突后标记为已解决:
# 编辑冲突文件,解决冲突
# ...
# 标记冲突文件为已解决
git add <冲突文件路径>
  • 继续变基:解决冲突后,使用 git rebase --continue 继续变基操作:

git rebase --continue
  • 修正提交信息:如果是提交信息格式不符合规则导致提交失败,在继续变基过程中再次提交时,确保提交信息符合配置的规则:
git commit --amend -m "符合规则的提交信息"

2. 放弃变基操作

如果你不想继续变基,可以使用 git rebase --abort 命令放弃当前的变基操作,分支状态会恢复到变基之前:

git rebase --abort

例如:当在同一个分支上进行了多次提交,想要将这些提交合并为一次提交并使用最后一次提交的信息时,可以使用 git rebase -i(交互式变基)命令来实现。以下是详细的操作步骤:

步骤 1:确定要合并的提交范围

首先,你需要知道从哪个提交开始进行合并。你可以使用 git log 命令查看提交历史,找到你想要合并的第一个提交的哈希值。

git log --oneline

该命令会以简洁的格式显示提交历史,每一行显示一个提交的简短哈希值和提交信息。假设你有如下提交历史:

abcdefg (HEAD -> your-branch) 最后一次提交信息
1234567 倒数第二次提交信息
890abcd 倒数第三次提交信息
...

步骤 2:启动交互式变基

使用 git rebase -i 命令,后面跟上你想要合并的第一个提交的前一个提交的哈希值。例如,如果你想合并从 890abcd 开始的所有提交,你需要使用 890abcd 的前一个提交的哈希值。

git rebase -i 890abcd^

这里的 ^ 表示前一个提交。执行该命令后,会打开一个文本编辑器,显示类似以下内容:

pick 890abcd 倒数第三次提交信息
pick 1234567 倒数第二次提交信息
pick abcdefg 最后一次提交信息

# Rebase 其他提交到这里...
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

步骤 3:修改提交指令

将除了最后一个 pick 之外的所有 pick 改为 squash 或 fixup

  • squash:将该提交合并到前一个提交,并保留该提交的信息,你可以在后续编辑时选择保留哪些信息。
  • fixup:将该提交合并到前一个提交,并丢弃该提交的信息,只保留最后一个提交的信息。

如果你想只保留最后一次提交的信息,将前两个 pick 改为 fixup

fixup 890abcd 倒数第三次提交信息
fixup 1234567 倒数第二次提交信息
pick abcdefg 最后一次提交信息

保存并关闭编辑器。

步骤 4:完成合并

如果你使用了 fixup,Git 会自动完成合并,并使用最后一次提交的信息作为合并后的提交信息。如果你使用了 squash,Git 会打开一个新的编辑器,让你编辑合并后的提交信息,你可以根据需要进行修改,然后保存并关闭编辑器。

步骤 5:推送到远程仓库

如果这些提交已经推送到远程仓库,你需要使用 git push -f 强制推送合并后的提交到远程仓库。

git push -f origin your-branch

注意,强制推送会覆盖远程仓库的历史记录,可能会影响其他开发者的工作,因此在团队协作中需要谨慎使用,最好提前与团队成员沟通。 通过以上步骤,你就可以将同一个分支上的多次提交合并为一次提交,并使用最后一次提交的信息。

题外话:

git rm -r --cached test.sh 命令的作用是将 test.sh 文件从 Git 的暂存区移除,但保留该文件在本地工作目录中。具体参数解释如下:

  • -r:表示递归操作,当 test.sh 是一个目录时,会递归地移除该目录下所有文件和子目录的缓存。
  • --cached:仅从 Git 的暂存区删除文件,而不删除本地工作目录中的实际文件。