我是一名Perforce资深人士,他正在将我们的组织移至git。我一直坚持的一件事是如何管理大型提交(我不是一次引用许多不同的更改-我知道这不是最佳的-而是一次会同时影响多个文件的单一更改类型)。例如,假设我向一个在数十个文件中调用的函数添加了一个参数。结合使用git命令行和可视化差异工具,在提交之前查看所有更改的最佳方法是什么?实际上,我可能会在一段时间内进行此审核,或者可能在审核了一些文件之后进行了一些更改,然后返回到未审核的文件。
简而言之,我要寻找的是一种轻松地一次difftool文件,然后将其标记为已审核的方法。我知道有很多UI解决方案,但是我对本机git解决方案感兴趣。
被拒绝的想法:
git add -i
)。这个想法的问题是你
无法比较未暂存的文件。这意味着
工作,我必须在舞台上做一些奇怪的旋转
一切,然后在文件通过我的审查之后,我实际上会取消登台,
然后最后我将在提交之前交换已暂存和未暂存的文件。
毛。git gui
。这个真的很接近,但是我还没有
找到了一种方法,可以通过双击轻松在每个文件上运行difftool
或热键。
具有讽刺意味的是,git add -i
如果不颠倒diff的含义,将完全满足我的需求。即,默认情况下,diff适用于未分段的更改,但是在交互式添加期间,diff仅适用于分段的更改。这让我感到困惑,尤其是因为git add
的意义在于暂存文件。
感谢所有想法!谢谢您的帮助。
答案 0 :(得分:3)
您应该放弃在非分布式scm系统中使用提交的想法... git add -i
,而您正在寻找变体:
使用'git add -i'选择更改并提交;不要试图变得完美,不要犹豫进行多次提交
对于新文件,我将首先提交一个空文件(可能带有一些标题);您可以在编辑器中一一完成此操作:
清空文件(放弃您的工作)
git add the-file
+ git commit -m "the-file: initial checkin"
撤消步骤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
运行编译和单元测试。