仅在 Git 中应用某些更改的工具

Posted

技术标签:

【中文标题】仅在 Git 中应用某些更改的工具【英文标题】:Tool to apply only some changes in Git 【发布时间】:2021-12-03 22:43:59 【问题描述】:

假设我有两个文件“version 1.py”和“version 3.py”。我希望有一个介于“版本 2.py”之间的版本,因为例如,我做了两个更改(例如功能 A 和错误修复 1)并且我不想同时提交这两个更改,因为这不被认为是好的做法.我所做的是,我在屏幕的一侧打开了差异,并手动将我想要的更改复制到 Pycharm-IDE 中。那么这种情况下的工作流程是什么?应该有一个工具来做到这一点,不是吗?我没有找到一个。我会使用我找到的任何工具并且足够先进,但是我更喜欢在 Pycharm 或 Git 中执行此操作的方法。我找到了带有补丁文件的 emacs,但是 emacs 不获取原始文件,因此它不知道您何时尝试更改源文件。这导致我破坏了补丁,然后补丁不被 git 接受。

【问题讨论】:

git add -p 是为这种情况设计的。我自己不太喜欢它,但它确实有效。请注意,Git 在提交时不使用您的 working tree 文件,而是使用文件的 index 副本; git add -p 比较索引和工作树副本,从比较中产生差异,并允许您有选择地添加差异片段索引副本。 你是说你有两个不同的文件吗?或者您对同一个文件进行了两次更改,并且您想将它们分成两个提交?如果是第二个,git add -p. 谢谢你们,git add -p 确实有效,而且确实很丑。我尝试了一个测试再现以及我从我的实际问题中获得的两个文件。它可以工作,但是每一秒都必须编辑,我仍然对上面必须填写的数字感到头疼(我什至试图留下它们,因为它们是 Git 不允许我这样做) 【参考方案1】:

如果您对文件进行了多次更改,并且希望将它们分成多个提交,请使用git add -p。 “p”代表“补丁”。这将引导您逐一完成更改,并询问您是否要进行更改。展示你想要的。

git diff 将显示您剩余的未暂存更改。

git diff --staged 将向您展示您已进行的更改。

如果您只想测试分阶段的更改,您可以stash your unstaged changes 并稍后检索它们。

一旦你确定你已经上演了什么,就提交它。 git commit,不是git commit -a


您可以使用 PyCharm 来完成所有这些工作。你可以Commit part of a file,相当于git commit -p。但是,如果您这样做,您将无法测试您所提交的内容。

要获得完全的灵活性,请参阅"Use the Git staging area to commit changes",了解如何在 PyCharm 中启用暂存区域以及如何使用他们的提交工具暂存部分更改。等效于git add -p

而且您可以使用 PyCharm 来暂存您未暂存的更改。 PyCharm 将此称为“搁置”。见Use Git to work on several features simultaneously。


这是可行的,因为在 Git 中,您可以在“暂存区”中构建您想要提交的内容。这就是git add 所做的,它将文件复制到暂存区。当您git commit 时,您提交的是暂存区中的内容,而不是磁盘上的内容。

对于大多数任务,您只需 git add . 将所有内容复制到暂存区域,或 git commit -a 复制所有内容并提交。但您也可以选择复制的内容。您只能使用git add <filename> 暂存某些文件。而且您只能使用git add -p 进行某些更改。

【讨论】:

谢谢,git add -p 有点帮助。我等待其他答案,因为我希望会有更好的工具。如果我编辑一个大块,我必须更正的数字有问题。 @user3289974 可能有一个 IDE 可以做同样的事情,但更方便。一定要使用 split 来分解大补丁。 “你必须纠正的数字”对你来说是什么意思?如果您指的是 diff 标头中的行号,那么好的编辑器应该会为您做到这一点。 我会尝试拆分。对于 IDE,是的,这就是我正在寻找的东西。对于优秀的编辑器,当您必须计算自己的行数时会感到头疼,我想将其自动化 @user3289974 PyCharm 可以做到。见jetbrains.com/help/pycharm/… @user3289974 我已经用相关的 PyCharm 工具更新了答案。

以上是关于仅在 Git 中应用某些更改的工具的主要内容,如果未能解决你的问题,请参考以下文章

vscode 仅在 git 更改中搜索文本

git clone 仅在新更改和存档 scm 上

仅在 git 中暂存分阶段的更改 - 有可能吗?

如何 git-cherry-pick 仅更改某些文件?

仅在 getElementsByName 中更改 CSS 属性

如何在 Git 中查看不同分支的文件(没有更改)?