0

我是一名 Perforce 资深人士,他正在将我们的组织转移到 git。我坚持的一件事是如何管理大型提交(我不是同时指代许多不同的更改——我知道这不是最佳的——而是一次影响许多文件的单一类型的更改)。例如,假设我向一个在几十个文件中调用的函数添加了一个参数。使用带有可视差异工具的 git 命令行,在提交之前查看所有更改的最佳方法是什么?实际上,我可能会在一段时间内展开此审查,或者在审查我的一些文件后进行一些更改,然后再返回未审查的文件。

简而言之,我正在寻找一种方法,可以一次轻松地 difftool 文件,然后将它们标记为已审核。我知道那里有很多 UI 解决方案,但我对原生 git 解决方案很感兴趣。

 

被拒绝的想法:

  1. 保持所有文件未暂存,然后一次对它们进行一个比较,如果我喜欢该差异,则暂存一个文件。这个想法的问题在于,输入每个文件的完整路径来进行比较(然后暂存它)很麻烦,因为文件可能会散布在许多路径中。
  2. 使用交互式添加模式 ( git add -i)。这个想法的问题是你不能区分未暂存的文件。这意味着要使其工作,我将不得不做一些奇怪的旋转,在其中我会暂存所有内容,然后在文件通过我的审查后,我实际上会取消暂存它,最后我会在提交之前交换暂存和未暂存的文件。总的。
  3. 使用补丁模式。这很酷,但似乎不适用于视觉差异工具。
  4. 使用git gui. 这个实际上非常接近,但我还没有找到一种方法可以通过双击或热键轻松地在每个文件上运行 difftool。

 

具有讽刺意味的是,git add -i如果它不颠倒差异的含义,它将完全满足我的需求。即,默认情况下,diff 适用于未分级的更改,但在交互式添加期间,diff 仅适用于分级更改。这让我感到困惑,特别是因为它的重点git add是暂存文件。

感谢所有想法!谢谢您的帮助。

4

1 回答 1

3

您应该放弃在非分布式 scm 系统中使用的提交的想法......git add -i您正在寻找变体:

  • 使用 'git add -i' 选择您的更改并提交它们;不要试图做到完美,不要犹豫多次提交

  • 对于新文件,我会先提交一个空文件(可能带有一些标题);您可以在编辑器中一一进行:

    1. 清空文件(扔掉你的工作)

    2. git add the-file+git commit -m "the-file: initial checkin"

    3. 撤消步骤 1

重复上述步骤;当你获得一些经验时,你可以使用 'git commit --fixup HEAD~2' 或创建提交消息,如“fixup!添加参数 xyz”或“squash!修复愚蠢的错误”。

有一些工具可以帮助git add -i;例如git-gutter+-mode,在 emacs 中完成了近乎完美的工作,并且 magitc f序列非常酷。

现在,你有类似的历史

added parameter xyz
the-file-A: initial checkin
fixed stupid bug
the-file-B: initial checkin
fixup! added parameter xyz
fixup! added parameter xyz
squash! fixed stupid bug
...

现在,git rebase -i --autosquash到您的主分支,重新排序提交,您将获得:

the-file-A: initial checkin
the-file-B: initial checkin
added parameter xyz
fixed stupid bug

其中后两个提交包含对多个文件/位置的更改。

这些提交中的每一个都与一个问题有关,并且可以进行审查。

您可以使用git rebase -f -e make.

于 2019-02-28T21:57:05.797 回答