git rebase -i HEAD~N --> 如何确定N?

3

我创建了一个拉取请求,上游要求我创建一个单一的提交。

我知道我可以使用这个:

git rebase -i HEAD~N

# then pick the first commit, and squash the following commits

git push --force-with-lease 

但是有很多提交,所以我不知道N的正确数量。

有没有一种方法可以用一行代码检测N?


3
如果您目前正在进行的变基操作是从master分支中创建的,正如您的答案所示,您无需使用HEAD~N参考构造,只需使用您已有的参考:git rebase -i master。我认为你甚至可能(根据你具体的工作流程)不需要交互式变基,在这里只需要git reset --soft master并重新提交一次即可。 - Romain Valeri
虽然我同意 @RomainValeri 的看法,但是如果主分支自你创建分支以来发生改变的话,直接重置到 master 存在一定风险。 - TTT
@TTT 我同意。这就是为什么我加上了“(取决于您的具体工作流程)”。 - Romain Valeri
2个回答

3
请注意,HEAD~N 只是一个特定提交 ID 的简写形式,您可以通过查看 git log 或 UI 来快速确定。此外,仅当您希望变基的提交是线性的时,使用 N 作为提交数量才有效。因此,如果您不知道 N 是什么,请考虑不要尝试确定它并直接使用提交 ID。
如果您知道您的分支是从 master 走出来的,您甚至可以在不查看日志或 UI 图形的情况下查看提交 ID。
git merge-base master your-branch

这通常意味着您可以始终在Git Bash中使用以下命令:
git rebase -i $(git merge-base master @)
# Note @ is shorthand for HEAD which is your current branch tip

另一个考虑因素是您可以直接交互式地将分支rebasemaster上:

git rebase -i master

如果你本地的 master 自从你创建分支以来没有更改,那么使用变基将与使用 merge-base 相同。如果 master 现在超前于你开始的位置,那么这将不相同,因为你正在将提交回放到不同的状态,并且可能会产生冲突。请注意,在这种情况下,这些都是你必须解决的冲突,但有些人可能更喜欢先完成压缩,而没有冲突的可能性,然后再对较新的 master 进行另一次变基以解决冲突。其中一个原因是,在进行压缩之前,您可能需要解决多个提交中的冲突,而如果您先进行压缩,则只需在压缩的提交中解决冲突。 更快的压缩: 如果你希望将所有提交压缩成一个单一的提交,在这种情况下,通常比使用交互式变基更有效率,可以使用 reset
git reset --soft <commit-ID-you-started-your-branch-from>
# or without even looking:
git reset --soft $(git merge-base master @)

# now commit
git commit -m "Add new commit message here"

请注意,你也可以直接将分支重置回 master,而不是像上面使用 merge-base 命令一样进行合并基础操作,就像Romain Valeri 在评论中提到的那样。但是,只有当你创建分支后,master 分支没有发生过变化时才能使用此方法。以防万一,我建议仍然使用 merge-base 命令或者使用分支上第一个提交的父提交哈希值。

0

这对我有用:

git log master.. --oneline| wc -l

我猜测 DV 的原因是,如果您有新的合并提交,则此方法在一般情况下无法正常工作。 - TTT

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