Git互动rebase没有提交选择

Luk*_*asz 94 git rebase

我是主人,我做到了 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.
#
Run Code Online (Sandbox Code Playgroud)

我想选择一些不一致的提交,因为其中一些不受欢迎.当你想要保留一些文件或更改总是"本地"某些分支时,你如何工作?有帮手.gitignore吗?

CB *_*ley 78

像非交互式rebase一样,您必须重新定义特定提交.

使用非交互式rebase,如果你提供当前提交的直接祖先,那么你不会改变任何东西; 使用交互式rebase,您可以在您重新引用的提交之后编辑提交,即使提交是您当前提交的直接祖先,但您必须指定要从中进行编辑的此提交.

我不知道你的情况的细节,但你可能想要这样的东西:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)

要么

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !
Run Code Online (Sandbox Code Playgroud)

  • 使用“HEAD~*”语法对我有用,但第一个没有。 (2认同)

kni*_*ttl 24

rebase -i没有提交范围将不会显示任何提交.为了改变最后一个,比方说,7次提交使用以下内容:

git rebase -i HEAD~7
Run Code Online (Sandbox Code Playgroud)

但要小心,这将改写历史.如果提交已被推送,请不要这样做


对于你的第二个问题:拥有一个包含你的更改的分支(基本上是一个配置分支)并定期将其他分支合并其中.这样,更改不会移动到其他分支


svi*_*ick 8

当您使用时git rebase -i,通常必须指定,因为您要执行rebase的提交.因此,例如,如果要删除当前分支的最后10个中的某些提交,则可以执行以下操作:

git rebase -i HEAD~10
Run Code Online (Sandbox Code Playgroud)


0xc*_*0de 8

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

git rebase -i <latest-commit-to-be-retained>
Run Code Online (Sandbox Code Playgroud)

(假设您与要编辑的提交在同一分支上)--

要指定提交,您可以使用 HEAD~5 速记或使用 sha checksum(您可以通过 获得git log

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

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

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