Git:如何在提交前将文件标记为已审核?

时间:2019-02-28 21:16:11

标签: git git-diff git-add git-difftool

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

简而言之,我要寻找的是一种轻松地一次difftool文件,然后将其标记为已审核的方法。我知道有很多UI解决方案,但是我对本机git解决方案感兴趣。

被拒绝的想法:

  1. 保留所有未暂存的文件,然后一次比较一个文件,然后暂存一个 文件,如果我喜欢差异。这个想法的问题是 键入每个文件的完整路径比较困难 (然后进行登台),因为文件可能分散在许多文件上 路径。
  2. 使用交互式添加模式(git add -i)。这个想法的问题是你     无法比较未暂存的文件。这意味着     工作,我必须在舞台上做一些奇怪的旋转     一切,然后在文件通过我的审查之后,我实际上会取消登台,     然后最后我将在提交之前交换已暂存和未暂存的文件。     毛。
  3. 使用补丁程序模式。这很酷,但似乎不适用于     视觉差异工具。
  4. 使用git gui。这个真的很接近,但是我还没有 找到了一种方法,可以通过双击轻松在每个文件上运行difftool 或热键。

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

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

1 个答案:

答案 0 :(得分: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!固定的愚蠢的bug”之类的提交消息。

有些工具可以帮助git add -i;例如emacs中的git-gutter+-mode几乎可以完成工作,而且大人物c 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到您的master分支,对提交进行重新排序,您将获得:

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

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

所有这些提交都与一个问题有关,可以进行审查。

您可以使用git rebase -f -e make运行编译和单元测试。