我希望能够轻松地从我的提交历史记录中的任何位置提交提交,并使它们成为同一分支上最新的提交 。我更喜欢使用git命令行工具,但我也对GUI工具开放。
我调查了git-cherry-pick
,但是根据我对文档和我自己的测试的理解,挑选现有的提交使得挑选的(最近的)提交为空,因为它已经存在于历史中。
您可以假设不存在冲突,因为我对此的需求来自于these articles中概述的开发策略。即使有,我也可以根据需要纠正它们。
编辑:我找到了一个使用互动式基础的解决方案。我发布它作为这个问题的答案,但我很想知道其他解决方案。
答案 0 :(得分:1)
git rebase -i HEAD~NumberOfCommits
其中NumberOfCommits
是您要检查的提交量。
Git将打开编辑器,其中包含您可以选择编辑,压缩或跳过任何提交的提交列表。如果要删除提交,请删除该行:
# 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, exec = run command (the rest of the line) using shell
#
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
请注意,当您执行此操作时,您的分支将与远程分支不同,因此您必须强制推送,如果其他人拥有旧历史记录的副本,则需要对新历史记录进行硬重置。< / p>
请阅读第The Perils of Rebasing小节。它得到了比我能提供的更好的解释。
答案 1 :(得分:0)
我发现一个相当简单的解决方案是使用git-rebase的交互式rebase模式重新排序提交。在调用git rebase -i HEAD~3
以重新定义HEAD之前的三个最新提交时,会出现(我自己的注释带有#
注释):
pick 57c3e7e [bug 972919] Removed outdated information from the readme
pick 9390105 [bug 972919] Cleaned up app.js
pick 626e865 [bug 972919] Removed CORS logic
# Git provides standard instructions for the use of this mode in comments
# below the commits you've selected
通过将我想要的提交行转移到该列表的底部,它将它重新排序为历史上最新的rebase结束时:
pick 9390105 [bug 972919] Cleaned up app.js
pick 626e865 [bug 972919] Removed CORS logic
pick 57c3e7e [bug 972919] Removed outdated information from the readme # <-- this one will be most recent