我应该如何将更改从一个提交移动到另一个提交?

时间:2013-03-05 00:41:49

标签: git

我在同一个分支上有两个提交,一个接一个。我将对文件A的更改添加到第一次提交,然后我对其他文件进行了一些更改,然后进行了另一次提交。现在我希望文件A的更改在第二次提交而不是第一次提交。什么是最优雅的方式?

6 个答案:

答案 0 :(得分:6)

我写了一个脚本来达到这个目的。你可以签出here

使用脚本就可以了:

<script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.8/angular.js" data-semver="1.4.8"></script>
<script data-require="underscore.js@1.8.3" data-semver="1.8.3" src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

<html ng-app="stackExample">

<body ng-controller="MainCtrl">
  <div ng-repeat="(type, values) in groups">
    <h3 ng-bind="type"></h3>
    <span ng-repeat="v in values">
        <span ng-bind="v.value"></span>
    </span>
  </div>
</body>

</html>

答案 1 :(得分:5)

如果它们是小型提交,并且提交应该总是小的git,最简单的方法是git reset HEAD^^然后再次执行它们。请注意,任何解决方案都涉及重写历史记录,如果您已经将这些提交推送到某个地方,除非您知道自己在做什么,否则不应该这样做。

答案 2 :(得分:1)

此问题的另一种解决方案

  • 在两次提交之前找到提交(可能这是主分支)
  • 在大多数情况下运行git rebase -i <commit before commits to be reordered>git rebase -i master
  • 在文本编辑器中,交换提交的顺序(对于vim,在应该向下移动的行上使用序列ddp
  • 保存,退出,让git rebase完成其余的工作

答案 3 :(得分:0)

相关的答案,但基本上你是Squash和Rebase。

见这里:http://davidwalsh.name/squash-commits-git

答案 4 :(得分:0)

在您刚刚创建了这些提交的事件中,可能使用git reset HEAD^撤消第二次提交,然后使用git commit --amend将更改添加到第一次提交。

在更有可能的事件中,您已经移动并且提交过去的某个时刻,变基是您的最佳选择。在不知道您的具体情况的情况下,引用一个解释得很好的参考可能是最好的。

在第一次和第二次活动中,Pro Git书中关于重写历史的部分很好地解释了这些选项 - 无论何时应该使用它们以及何时应该谨慎使用。

6.4 Git Tools - Rewriting History

答案 5 :(得分:0)

我知道这是一个古老的问题,但是我有完全相同的请求,并且我刚刚想出了解决此问题的最佳方法:您需要使用交互式变基,并为要移动的两个提交选择“编辑”从和更改。

例如,假设您有3次提交:

$ git log -3 --oneline
97e9d62 Commit C, editing file2.txt
34b066b Commit B, creating file2.txt + editing file1.txt
73ff1bb Commit A, creating file1.txt

现在,如果您希望Commit B只包含file2.txt的创建但不包含应该在Commit C中的file1.txt版本,则git rebase -i将显示以下内容:

pick 73ff1bb Commit A, creating file1.txt
pick 34b066b Commit B, creating file2.txt + editing file1.txt
pick 97e9d62 Commit C, editing file2.txt

# ...

如果我将提交B和提交C的“ pick”替换为“ edit”或“ e”并关闭编辑器,则git将在第二次提交时停止并让我修改更改:

pick 73ff1bb Commit A, creating file1.txt
edit 34b066b Commit B, creating file2.txt + editing file1.txt
edit 97e9d62 Commit C, editing file2.txt
Stopped at 34b066b... Commit B, creating file2.txt + editing file1.txt
You can amend the commit now, with

    git commit --amend

Once you are satisfied with your changes, run

    git rebase --continue

$ vi file1.txt    # edit of file1.txt to remove the updated line
$ git commit --amend file1.txt
$ git rebase --continue

# -- git continues rebasing and stops on the Commit C to edit it

$ vi file1.txt   # edit of file1.txt to put the removed line
$ git commit --amend file1.txt
$ git rebase --continue

就是这样。

请注意将要从第一次提交中删除的行保存在第二行中。它可以在剪贴板,文本文件等中。我想也应该可以依靠git stash,但是如果是简单的更改,则将其保存在剪贴板中会更容易。