我创建了一个拉取请求,上游要求我创建一个单一的提交。
我知道我可以使用这个:
git rebase -i HEAD~N
# then pick the first commit, and squash the following commits
git push --force-with-lease
但是有很多提交,所以我不知道N的正确数量。
有没有一种方法可以用一行代码检测N?
我创建了一个拉取请求,上游要求我创建一个单一的提交。
我知道我可以使用这个:
git rebase -i HEAD~N
# then pick the first commit, and squash the following commits
git push --force-with-lease
但是有很多提交,所以我不知道N的正确数量。
有没有一种方法可以用一行代码检测N?
HEAD~N
只是一个特定提交 ID 的简写形式,您可以通过查看 git log
或 UI 来快速确定。此外,仅当您希望变基的提交是线性的时,使用 N
作为提交数量才有效。因此,如果您不知道 N
是什么,请考虑不要尝试确定它并直接使用提交 ID。master
走出来的,您甚至可以在不查看日志或 UI 图形的情况下查看提交 ID。git merge-base master your-branch
git rebase -i $(git merge-base master @)
# Note @ is shorthand for HEAD which is your current branch tip
另一个考虑因素是您可以直接交互式地将分支rebase
到master
上:
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
命令或者使用分支上第一个提交的父提交哈希值。这对我有用:
git log master.. --oneline| wc -l
master
分支中创建的,正如您的答案所示,您无需使用HEAD~N
参考构造,只需使用您已有的参考:git rebase -i master
。我认为你甚至可能(根据你具体的工作流程)不需要交互式变基,在这里只需要git reset --soft master
并重新提交一次即可。 - Romain Valerimaster
存在一定风险。 - TTT