Git diff所有本地更改,无论是提交还是分段/取消分段

Git diff所有本地更改,无论是提交还是分段/取消分段,git,Git,关于Git,我不喜欢的一点是diff命令的变化取决于它是否是未老化的、暂存的、提交的等等 我有一个分支,我只有git pushed供审查。未将任何内容推送到主分支。然而,我想做一个最后检查的每一行我已经改变,即使它目前还没有上演 我有这个命令: git difftool@{upstream} 但它似乎只显示了自上次提交以来的差异 如何将所有内容(暂存、未暂存、上次提交期间暂存)与主分支进行比较?TL;博士 您现有的git diff或git difftool命令可能会为您提供所有您想知道的信息。如

关于Git,我不喜欢的一点是diff命令的变化取决于它是否是未老化的、暂存的、提交的等等

我有一个分支,我只有
git push
ed供审查。未将任何内容推送到主分支。然而,我想做一个最后检查的每一行我已经改变,即使它目前还没有上演

我有这个命令:

git difftool@{upstream}

但它似乎只显示了自上次提交以来的差异

如何将所有内容(暂存、未暂存、上次提交期间暂存)与主分支进行比较?

TL;博士 您现有的
git diff
git difftool
命令可能会为您提供所有您想知道的信息。如果没有。。。嗯,还有,我们看不懂你的心思。也许你想要的另一件事是
git-diff-origin/master@{upstream}
或者
git-difftool-origin/master@{upstream}

长的 这里有一两个问题,但很难精确描述。令人困惑的是,这个问题通常也不是问题。尽可能简单地说:
git diff
只比较了两件事(好吧,有点:稍后细节会变得有点棘手)。有时我们想要比较两件以上的事情,为此,我们需要多个
git diff
命令

那么,诀窍就是要知道Git在比较什么,也就是说,在差异中有哪两件事。你真的需要知道所有这些东西,才能理解Git在做什么以及为什么,以便有效地使用Git提供的工具。因此,我要做的是描述git diff和git difftool的实际功能

关键背景(长) 请记住,Git是关于提交的:

  • 提交有散列ID,它们是它们的“真实名称”。Git实际上通过它们的散列ID查找提交

  • 每次提交都有一个完整的文件快照。此快照是其主要数据。每个提交都有一些元数据,例如提交人的姓名、提交时间(日期和时间戳)、提交原因(日志消息)。使用不带其他选项的
    git log
    ,您只会看到散列ID和元数据

  • 每次提交中的文件都是完全、完全、100%只读的。它们以一种特殊的Git-only冻结格式存储,经过压缩和重复消除(因此,每次提交都存储每个文件并不重要:每个版本都只有一个副本)

  • 事实上,关于提交的所有内容(包括其所有元数据)都是只读的,一直处于冻结状态。并且,在该元数据中,每个提交都列出其父提交的哈希ID。通常这里只有一个哈希ID。(合并提交至少有两个,通常正好有两个。有多个是它们合并提交的原因。)

  • 分支名、标记名、像
    @{upstream}
    这样的花哨的东西,等等,大多只是命名特定提交的方法。分支名称有一个特殊的属性,您可以“在”它们上获得它(
    git status
    表示分支主节点上的
    on-Branch master
    ),当您这样做时,新的提交会使分支名称标识新的提交,而不是标识您通过
    git checkout
    进行的提交

  • 因此,根据定义,分支名称标识分支中的最后一次提交。早期提交也包含在该分支中,该分支通过跟踪每个提交元数据中的父散列ID来工作

但是,如果每次提交中的所有文件都只能由Git使用,并且不可能更改,那么我们怎么能完成任何工作呢?答案是
git checkout
从归档的提交版本中提取文件。这些文件成为普通的日常文件,我们可以查看和编辑等等

这些普通的日常文件存储在Git所称的工作树或工作树中。但它们实际上根本不在存储库中!这很快变得非常重要

(我们一会儿就回到“舞台”上来。)

我有一个分支,我只有
git push
ed供审查

当您使用git push时,您的git会调用其他git。然后,你的Git向另一个Git发送你所做的任何承诺,而他们没有。所有这些都是通过哈希ID实现的,因为任何提交的哈希ID在每个Git中都是相同的。散列ID的唯一性支持所有这些。两个Git可以共享一个提交,一个Git可以通过散列ID判断是否有另一个Git的提交。你的Git说我提供给你,另一个Git,散列ID_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果没有,他们会要求它,而你的Git会提供它的父提交,这一切都会再次发生;或者,如果他们有,您的Git已经完成了提供部分

这就是你的Git如何知道要发送哪些承诺:那些他们没有的,你用你的
Git推送发送的,就是那些被发送的。然后,在最后,您的Git要求他们的Git设置一个分支名称,以标识您刚才发送的链中的最后一次提交。1

这一切意味着您只能推送提交。您无法从工作树中推送任何文件,这些文件甚至根本不在存储库中。当我们马上讨论暂存一些文件时,您也不能推送暂存文件。您只能推送提交


1实际上,您可以要求他们在一个
git push
中设置多个名称。这里唯一的初始要求是,要让他们将一些名称N设置为hash ID H,他们现在必须拥有hash ID为H的对象。对于提交,这意味着您的Git应该先向他们发送提交H,然后如果他们说“是”,请实际发送,如果他们说“不”谢谢,则不发送,我已经收到了

一旦他们有了需求
git diff <left-side-commit> <right-side-commit>
git diff <left-side-commit>
git show <commit>
git diff <commit-1> <commit-2>
git show <commit>