我应该使用什么工具来将git commit拆分成多个提交?

r7knjye2  于 2023-01-19  发布在  Git
关注(0)|答案(4)|浏览(191)

我在一个项目中编写了一个跨越数千行修改的特性,现在它都以一个大的提交结束(我已经压缩了正在进行的工作提交)。现在我想将更改拆分为多个提交,以方便审查/可能的话多个PR。
有些文件包含多个应该在不同的提交结束的更改,所以我正在寻找一个WYSIWIG编辑器使用三窗格视图,这将允许我移动一些行到中间提交,同时看到以前和未来的版本(+一些手动更改).我使用IntelliJ IDEA的发展,所以我想象类似于冲突解决对话框.
我可以切换到不同的分支/标签单次提交版本,然后执行Git-〉Compare with Branch(并从那里获取更改),但我正在寻找更方便的方法。
虽然这可能被标记为离题/固执己见,但我相信对不同工作流的中立建议可能是有价值的。

xmjla07d

xmjla07d1#

对于IntelliJ,我使用以下工作流程:

  • 打开git日志窗口或Alt + 9
  • 右键单击要拆分的提交→从此处交互式变基
  • 右键单击要拆分的提交→停止编辑Alt + E
    *开始重定基准
  • 右击git日志中当前的提交,标签为🏷️! →**Undo commit...***或者在终端中执行git reset HEAD~1 *
  • Ctrl + K以选择并提交您的更改以及相应的消息。根据需要重复此操作,直到提交所有更改。
  • 在右下角单击:为编辑而停止重定基→继续
pb3skfrl

pb3skfrl2#

我不确定有没有工具可以实现这个功能,但是根据git文档,你可以使用内置的rebase函数来分割提交,比如:

git rebase -i
...
pick abc1234 the commit I wanna keep
edit 5904fjl THE COMMIT I WANT TO SPLIT
pick alkj022 my latest commit to keep

然后运行git reset HEAD^,你可以手动地将你的修改拆分成提交。你可以使用git add --patch来更容易地将你的文件内修改拆分成提交。或者如果你的Intellij IDE有一个很好的git GUI,你可以使用它。拆分,至少在我的经验中,必须从命令行完成。

xlpyo6sf

xlpyo6sf3#

我在PyCharm/IntelliJ中找到了一种简单的方法。
这个想法包括两次恢复你想要提取的修改(就像摄影领域中的negativepositive),然后合并第一次恢复的提交到common latest commit中,以便从该提交中移除修改。
下面的解释可能看起来很复杂,但实际上只需要点击几下鼠标就可以从提交中提取一些更改:

  • 首先,用Alt+9打开git面板
  • 在左下角的面板中选择当前分支的最新提交。在右下角的面板中,你会看到在这次提交中修改过的文件。

在这一点上你的历史是这样的:

commit_3
   ^ 
commit_2
   ^ 
commit_1
  • 按住Shift键并选择要在单独提交中提取的文件
  • 右键单击/Revert Selected Changes
  • 在名为temporary_reverted_commit的提交中提交这些更改
git add -u :/
git commit -m "temporary_reverted_commit"

在这一点上你的历史是这样的:

temporary_reverted_commit
   ^ 
commit_3
   ^ 
commit_2
   ^ 
commit_1
  • 然后在底部面板中右键单击新提交,点击'Revert commit',并将提交命名为your_extracted_changes

在这一点上你的历史是这样的:

your_extracted_changes
   ^ 
temporary_reverted_commit
   ^ 
commit_3
   ^ 
commit_2
   ^ 
commit_1
  • 现在重定基以将temporary_reverted_commit合并到commit_3中:将fixup放在temporary_reverted_commit提交上,以便它将用commit_3压缩它,然后保存并退出rebasing接口。
git rebase -i origin/dev
your_extracted_changes
   ^ 
commit_3
   ^ 
commit_2
   ^ 
commit_1
ecfdbz9o

ecfdbz9o4#

如果你在提交树的顶端工作,简单地对你之前的提交做一个混合重置,然后把你想要的修改分阶段提交,一个接一个地提交,这是一个不错的选择。
所以,它应该是这样的:
1.重置为当前分支上倒数第二个提交:

git reset --mixed

1.在第一个commit - use --interactive或您喜欢的git GUI中添加您想要的更改。

git add --interactive

1.提交添加的更改

git commit -m "first commit"

1.重复步骤2和3,直到提交所有更改。

相关问题