在同一分支上的提交历史记录中移动提交的最简单方法

时间:2014-04-23 15:51:24

标签: git github

我希望能够轻松地从我的提交历史记录中的任何位置提交提交,并使它们成为同一分支上最新的提交 。我更喜欢使用git命令行工具,但我也对GUI工具开放。

我调查了git-cherry-pick,但是根据我对文档和我自己的测试的理解,挑选现有的提交使得挑选的(最近的)提交为空,因为它已经存在于历史中。

您可以假设不存在冲突,因为我对此的需求来自于these articles中概述的开发策略。即使有,我也可以根据需要纠正它们。

编辑:我找到了一个使用互动式基础的解决方案。我发布它作为这个问题的答案,但我很想知道其他解决方案。

2 个答案:

答案 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