【问题标题】:How can I see what has changed in a file before committing to git?在提交到 git 之前,如何查看文件中的更改?
【发布时间】:2011-05-26 06:52:01
【问题描述】:

我注意到,在处理一两张票时,如果我离开,我不确定自己做了什么,发生了什么变化等等。

有没有办法在 git add 然后 git commit 之前查看对给定文件所做的更改?

【问题讨论】:

    标签: git


    【解决方案1】:

    使用git-diff:

    git diff -- yourfile
    

    【讨论】:

      【解决方案2】:

      git diff filename

      【讨论】:

        【解决方案3】:

        git diff

        显示工作树和索引或树之间的更改、索引和树之间的更改、两棵树之间的更改或磁盘上两个文件之间的更改。

        【讨论】:

        • 引用有点过分——默认情况下,它执行第一个比较:在工作树和索引之间。
        【解决方案4】:

        你在寻找

        git diff --staged

        根据您的具体情况,有三种有用的方法可以使用git diff

        1. 显示索引和工作树之间的差异;也就是说,您尚未提交的更改:
        git diff [filename]
        
        1. 显示当前提交和索引之间的差异;也就是说,你将要提交的内容(--staged 做的完全一样,使用你喜欢的):
        git diff --cached [filename]
        
        1. 显示当前提交和工作树之间的差异:
        git diff HEAD [filename]
        

        git diff 在目录上递归工作,如果没有给出路径,它会显示所有更改。

        【讨论】:

        • @sveilleux2 不,只运行不带任何参数的 git diff - 正如答案的最后一句话所说,如果没有给出路径,它会显示所有更改。 ([filename] 上的括号表示一个可选参数。)使用*,您可以让 shell 列出所有文件,因此如果您在子目录中,您只能在该子目录中获取内容(而不是整个repo),您将错过隐藏文件中的更改。
        • # 显示当前提交和索引之间的差异 # 即你将要提交的内容 git diff --cached [文件名] 你不是说:# 显示当前提交和索引之间的差异#也就是说,你要push 什么? git diff --cached [文件名]
        • 要查看添加文件后的差异(即“git add”之后),请执行“git diff --staged [filename]”
        • 哦,为什么这么复杂?!如果我们有几十个文件怎么办?...只是向 git 接口抱怨...是的,看起来,git add -p 是检查所有文件的替代方法。
        • @Jefromi - 请考虑在您的主要答案中添加git diff --staged [filename],因为这是更经常需要的情况。
        【解决方案5】:

        记住,您提交的是更改,而不是文件。

        因此,我很少使用 git add -p(或 magit 等效项)来添加我的更改。

        【讨论】:

        • git 确实 NOT 处理更改——试图将其视为混淆和错误的主要来源。 git 处理快照。
        【解决方案6】:

        对我来说git add -p 是最有用的方式(我认为是 git 开发人员的意图?)来审查所有未暂存的更改(它显示每个文件的差异),选择一组应该与提交,然后当你完成所有这些时,然后使用git commit,并重复下一次提交。然后,您可以使每个提交成为一组有用或有意义的更改,即使它们发生在不同的文件中。我还建议为每个票证或类似活动创建一个新分支,并使用checkout 在它们之间切换(如果您不想在切换之前提交,可能使用git stash),但如果您正在做很多快速更改,这可能是一种痛苦。不要忘记经常合并。

        【讨论】:

        • 所以不要使用 git add 文件名使用 git add -p?
        • git add -p 是暂存的组合,查看您可以暂存的更改并以交互方式一一选择它们。有关 git add -p 的更多信息,请参阅Commit only part of a file in Git
        【解决方案7】:

        您还可以使用 git 友好的文本编辑器。它们在已修改的线条上显示颜色,为添加的线条显示另一种颜色,为删除的线条显示另一种颜色,等等。

        一个很好的文本编辑器是GitHub's Atom 1.0

        【讨论】:

          【解决方案8】:
          git diff <path>/filename
          

          路径可以是完整的系统路径,直到文件或
          如果您在项目中,您还可以粘贴修改后的文件路径
          对于带有路径的修改文件使用:git status

          【讨论】:

            【解决方案9】:

            好吧,我的情况是您不想关心文件列表。把它们都展示出来。

            当您已经使用文件列表运行 git add 时:

            $ git diff --cached $(git diff --cached --name-only)
            

            git 的更新版本中,您也可以使用--staged,它是--cached 的同义词。

            同样可以用于没有添加文件但没有--cached选项。

            $ git diff $(git diff --name-only)
            

            “缓存”选项的 Git 命令别名:

            $ git config --global alias.diff-cached '!git diff --cached $(git diff --cached --name-only)'
            

            【讨论】:

            • 感谢详细信息 git diff --cached --name-only 是我正在寻找的命令....
            【解决方案10】:

            转到您各自的 git repo,然后运行以下命令:

            git diff 文件名

            它将打开标记有更改的文件,按回车键向下滚动文件。

            附:文件名应包含文件的完整路径,否则您可以通过进入文件的相应目录/文件夹来运行没有完整文件路径的运行

            【讨论】:

              【解决方案11】:

              对于某些路径,其他答案将返回 fatal: ambiguous argument 形式的错误。

              在这些情况下,diff 需要一个分隔符来区分文件名参数和提交字符串。例如,要回答您需要执行的问题:

              $ git diff --cached -- <path-to-file>
              

              这将显示修改后的文件和上次提交之间的更改。

              另一方面:

              git diff --cached HEAD~3 <path-to-file>
              

              将显示本地版本与第三次提交前的版本之间的更改。

              【讨论】:

                猜你喜欢
                • 2013-07-07
                • 1970-01-01
                • 2011-07-05
                • 2011-09-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-01-15
                • 2019-11-16
                相关资源
                最近更新 更多