我在同一个分支上有两个提交,一个接一个。我将对文件A的更改添加到第一次提交,然后我对其他文件进行了一些更改,然后进行了另一次提交。现在我希望文件A的更改在第二次提交而不是第一次提交。什么是最优雅的方式?
答案 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
)ddp
)答案 3 :(得分:0)
相关的答案,但基本上你是Squash和Rebase。
答案 4 :(得分:0)
在您刚刚创建了这些提交的事件中,可能使用git reset HEAD^
撤消第二次提交,然后使用git commit --amend
将更改添加到第一次提交。
在更有可能的事件中,您已经移动并且提交过去的某个时刻,变基是您的最佳选择。在不知道您的具体情况的情况下,引用一个解释得很好的参考可能是最好的。
在第一次和第二次活动中,Pro Git书中关于重写历史的部分很好地解释了这些选项 - 无论何时应该使用它们以及何时应该谨慎使用。
答案 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
,但是如果是简单的更改,则将其保存在剪贴板中会更容易。