Git交互式变基没有要选择的提交

134

我正在主分支上,我执行了rebase -i <my_branch>

得到了这个:

noop

# Rebase c947bec..7e259d3 onto c947bec
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

我想挑选一些提交记录而不是全部,因为其中一些提交记录是不需要的。 此外,当您想将某些文件或更改始终保留在某个分支“本地”时,如何处理?是否有类似于.gitignore的帮助程序?

4个回答

104

就像非交互式的变基一样,您必须将其变基到特定提交上。

使用非交互式变基,如果您提供当前提交的直接祖先,则不会更改任何内容;而使用交互式变基,即使提交是当前提交的直接祖先,您也可以编辑在其之后的提交,但您必须指定要从哪个提交开始编辑。

我不知道您的具体情况,但您可能需要类似以下的内容:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master
或者
# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !

2
使用 HEAD~* 语法对我有效,但第一个则不行。 - Dev Yego

29
使用没有提交范围的 rebase -i 命令将不会显示任何提交记录。要重新基于最后的7个提交,可以使用以下命令:
git rebase -i HEAD~7

小心,这将重写历史。如果提交已经推送,请不要这样做。
对于你的第二个问题:创建一个包含你的更改的分支(基本上是一个配置分支),并定期将其他分支合并到它中。这样,更改就不会传播到其他分支。

15

当你使用git rebase -i命令时,通常需要指定要执行rebase的起始提交。所以,例如,如果你想在最近的10个提交中删除一些提交并将其应用到当前分支,则应该执行以下操作:

git rebase -i HEAD~10

10

正如其他人所提到的,您需要指定一个提交范围。

git rebase -i <latest-commit-to-be-retained>

(假设你在编辑的提交所在的同一分支)--

为了指定提交,你可以使用HEAD~5简写或使用sha校验和(通过git log获取)。

实际上,只要它是树中要删除/编辑/改写的提交之前/祖先的任何提交都可以。这将在编辑器中列出自<latest-commit-to-be-retained>以来的所有提交(在你的git配置中定义)。从列表中,要删除一个提交,只需删除该特定行,保存并退出(vi习惯:))文件+编辑器,然后执行git rebase --continue

对于第二个答案,我同意knittl的观点

拥有一个包含你的更改的分支(基本上是一个配置分支),并定期将其他分支合并到其中。 这样更改就不会移动到其他分支


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接