繁体   English   中英

有没有办法制作 Git 暂存/取消暂存文件而不是更改?

[英]Is there a way to make Git stage/unstage files instead of changes?

每次编辑后都必须不断地重新暂存已经暂存的文件,这是在浪费我的时间。 我已经暂存了一次文件。 忘记重新暂存文件意味着可能不会提交必要的更改。

关于 git 如何处理更改而不是文件的教育声明还需要附带有关如何进行更改(无需命名文件)的信息,这不需要冗长的 CLI 指令。 AFAICT git add需要的文件名之类的。

编辑:这不是指定问题的重复,因为我不想在每次已经暂存的文件编辑之后做某事(运行任何 CLI 命令、单击按钮等),甚至在提交之前只做一次。 我问是否有办法在这方面配置 git(.gitattribute 等)的行为,所以它总是按照我需要的方式运行。 我想在提交时处理文件,因为文件是我正在编辑的内容,并且在几乎所有常用工具中都被描述为更改列表。

如果您要问的是是否可以使用git add添加文件,然后对该文件所做的所有后续更改自动包含在下一次提交中,那么不,Git 没有内置该功能。

但是,您可以编写一个别名来执行此操作并使用它来代替git commit

[alias]
ci = "!f() { git status --porcelain | grep '^[AMD]' | cut -b4- | xargs git commit \"$@\" --; }; f"

然后,您可以运行git ci ,它会自动将所有更改提交到任何暂存文件。

但是在别名之外,如果没有一些外部工具,这是不可能的。 这种工作方式是有意的,即使它不符合您的喜好。

考虑到您的询问以及您所做的评论和编辑,确定 Git 是一个面向快照的VCS 这一事实可能会很有用。 每个提交实际上都包含一棵树 object,它指向该提交引用的每个文件。

每次您更改文件时,它是否是一个字节,它被假定为新的东西然后再次记录。 但是,由于所有内容都使用它们的 SHA1 和进行索引,因此只有不同的内容被单独保存。 如果您多次录制同一个文件或恢复到以前的版本,则只会录制一次。 所有这些东西都被压缩了,所以你永远不会因为这个而面临任何空间问题。

通过这种方式,这种行为被引入为类似于文件系统的快照机制,这使得它可以接受。

这回答了您的第一个问题:文件始终被记录,而不是更改。 您在浏览提交时看到的实际上是该提交与其父提交之间的自动“差异”操作。 这也使您能够轻松地在两个任意修订之间进行“差异”,而无需先解决任何问题。 它还向自己保证,一旦您可以提交,您将可以访问其全部文件,即使您看不到它的历史记录(对于影子克隆或如果您的存储库已损坏很有用)。

如果你现在想在每次提交时自动嵌入所有修改过的文件,你可以使用git add -u标记所有更新的文件,或git add -A以包含所有新文件和更新的文件,甚至git commit -a在单个操作中add -u/commit

您还可以轻松地定义别名命令,如果您使用的是 shell,则可以从外部定义,也可以在gitconfig文件的[alias]部分定义。 例如,我个人使用:

[alias]
    root = rev-parse --show-toplevel

... 有一个git root命令来查找我的存储库的根目录。

但是……你可能不想这样做。

Git 不能自动执行此操作的原因是为了鼓励开发人员准备“熟”,一次专注于一个目的的单一提交,即使此任务一次适用于多个文件,另一方面,如果,同一个文件可以在不同的地方为不同的目的进行修改。

这就是为什么,从这个角度来看,一次暂存所有修改过的文件通常是没有意义的,因为除非您非常频繁地提交,否则所有修改过的文件不太可能一次只涉及一个主题。

如果您真的不关心它并且您想要保存您工作的 state,使用上述命令仍然很容易做到这一点,但相信我,执行干净的提交至少与代码本身一样有价值。 当你独自工作时,它真的很重要,它在团队合作中变得至关重要。

至于现在的索引:它实际上是一个非常聪明的方式来处理整个事情。 起初,索引只是已经跟踪的文件列表。 这是一个位于.git/index下的平面二进制文件。 但它不会坚持保存名称,它还会引用这些文件关联的内容对象。 这意味着对象是在add时创建的,当你提交时,Git 只需要记录这个索引的 state。

这真的很有趣,因为这使 Git 能够知道文件是否未更改、已暂存、未暂存或两者兼而有之。 Also, when you select hunks with git add -p , Git won't collect temporary bits of changes stored somewhere: it will directly amend the index, which then allows you to prepare exactly what you want or revert it to its initial state if you改变主意。

Git 并不像看起来那么神秘。 您需要掌握的唯一概念是 object 概念、索引的工作方式和可选的 reflog,以便在 go 出错时轻松恢复。 特别是,不要试图模仿 Mercurial 的行为:起初看起来很容易,但很快就会让你陷入死胡同。

你可能对这个帖子感兴趣: git中的暂存区有什么用

嗯,这就是 GIT 如此有用的部分原因,它允许您进行增量更改并在更新代码时查看差异。 您可以使用git add -u自动更新更改,这与 GIT 的目的和源代码控制自动更新的目的背道而驰,但我认为您不能这样做。

查看文件更改差异的好处是diff ,它在开发时派上用场,它显示了暂存前的新更改:

git diff

git 添加补丁标志是一种可以减轻您的挫败感的有用工具:

git add -p

它将查看您在文件中更改的大量代码,并让您选择要暂存的代码。 您不需要处理太多文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM