Git:为什么我没有看到我签出的文件上的最新更改?

Git:为什么我没有看到我签出的文件上的最新更改?,git,Git,我在一家本地分支机构工作,我知道一个我必须更改但尚未更改的文件已被其他开发人员更改。在我自己开始更改文件之前,我需要这些更改。例如,我可以看到,在显示git repo的基于web的工具中,该文件已经更改。我做过一些事情,比如git fetch remotes/origin/develope(这是所有开发人员推动的分支的名称),然后是git checkout changedFile.java。当我做git日志或使用gitk时,我仍然看不到最新的更改。我错过了什么 编辑:我想说的是,如果你有一个本地

我在一家本地分支机构工作,我知道一个我必须更改但尚未更改的文件已被其他开发人员更改。在我自己开始更改文件之前,我需要这些更改。例如,我可以看到,在显示git repo的基于web的工具中,该文件已经更改。我做过一些事情,比如git fetch remotes/origin/develope(这是所有开发人员推动的分支的名称),然后是git checkout changedFile.java。当我做git日志或使用gitk时,我仍然看不到最新的更改。我错过了什么

编辑:我想说的是,如果你有一个本地分支而不是开发,你不能从远程开发更新该分支上的文件

编辑:git checkout origin/develop--path/to/changedFile.java尽我所能准确地说出了我想要什么,并让我进一步激发了这一点:我当时正在处理本地分支,而远程开发(这不是我正在处理的本地分支的名称)出现了偏差。我正要更改其中一个文件,而该特定文件已更改。在我看来,我可以使用该文件的版本,而不需要以后的更改,然后再进行合并,或者得到更改,这样可能会更容易合并。所以结账成功了,我唯一的问题是,为什么这样做是错误的?

TL;博士 如果您只想查看文件,请使用git show,例如:

git show origin/develop:changedFile.java
如果使用git checkout origin/develope--changedFile.java,这将通过索引将其提取到工作树中,但这通常不是一个好主意

关于提交和索引/暂存区域的预先了解 Git是关于提交的。提交不是文件,尽管提交实际上包含文件。更准确地说,每次提交都包含每个文件的完整快照,即您(或任何人)提交时的状态。(即使这样也不完全正确。)

为了进行新的提交,Git为您提供了两个处理文件的地方。其中一个叫做工作树,是非常明显的。工作树中的文件有它们的普通形式,您的计算机一直在处理这些文件。它们可以被读取、写入、就地更新、附加到任何内容。换句话说,工作树就是你工作的地方

出于各种原因,Git允许您在工作树中拥有不会提交的文件。这些是未跟踪的文件。Git对未跟踪的文件不做任何处理,只是不断抱怨它们未跟踪。要关闭它,您可以在
.gitignore
中列出特定的未跟踪文件,这并不能让Git真正忽略它们,它只是关闭了它们的未跟踪性,如果您使用大规模的“添加所有内容”操作,它就不会
Git添加它们。(请注意,如果文件已被跟踪,则将其列在
.gitignore
中无效。)

每个跟踪文件都有另一份副本。这个额外的副本称为索引或临时区域副本,实际上是Git知道它是一个跟踪文件的方式。这些副本总是存在的,事实上,当您进行新的提交时,Git通过索引副本而不是工作树副本进行提交!这就是为什么Git不断要求您
Git添加
东西的原因:
Git add
命令意味着“从工作树复制到索引”。它只会在你说“git add”
时进行复制;如果再次更改该文件,则必须重新复制它

运行
git commit
时,git会打包当前索引内容(每个文件的另一个新副本!)、您的姓名和电子邮件地址以及当前时间、您编写的提交消息以及当前或
头的哈希ID
提交。然后,它对所有这些内容进行新的提交,并使当前分支名称(存储在
HEAD
中)指向您刚刚进行的新提交。这个提交(大部分)是永久性的,并且(完全)是只读的,所以它会永远保存您所做的事情,或者直到您明确地让它消失为止(即使是这样,Git也会将它保留至少30天“以防万一”)

我们可以通过写下它们丑陋的大哈希ID并用箭头将每个提交连接到其父级来绘制您的提交和所有其他提交。我们使用当前分支名称中较大的箭头:

... <-194ab72  <-c309ac4   <-- develop
(由于内部箭头总是向后移动且从不改变,我们现在几乎可以停止绘制它们)

git show
几乎可以显示任何内容 不带任何参数运行
git show
,通过打印日志消息,然后将其与其父级进行比较,显示当前提交。这会将快照转换为“自上一个快照以来的更改”

运行
git show origin/develope
显示位于
origin/develope
顶端的提交。它做同样的事情:打印日志消息,然后将提交与其父级进行比较,以查看自其父级以来发生了什么变化

运行
git show origin/develope:path/to/file.txt
可以在
origin/develope
指定的提交中显示
path/to/file.txt
的内容

既然您已经了解了上述内容,下面介绍如何使用它 您一直在编写一些代码。也许你做出了承诺,也许没有。您在工作树中有一些更改。其他人在其他存储库中进行了一些其他更改,并提交了它(生成整个快照),并推动了他们的提交,以便它位于
origin/develope

您运行了
git fetch origin
,它更新了您的
origin/developer
,以记录他们的新提交。让我们画出:

...--G--H--I   <-- develop
            \
             J   <-- origin/develop
或者,您可以使用
git-rebase
。git rebase所做的是复制提交,在完成将提交复制到新的和改进的提交后,放弃原始提交。(这是提交的正常永久性被撤消的地方。)如果将提交
K
复制到新的im
...--G--H--I   <-- develop
...--G--H--I   <-- develop
            \
             J   <-- origin/develop
...--G--H--I--K   <-- develop
            \
             J   <-- origin/develop
...--G--H--I--K--M   <-- develop
            \ __/
             J   <-- origin/develop
...--G--H--I--K   [abandoned]
            \
             J   <-- origin/develop
              \
               K'  <-- develop
...--G--H--I--K--M   <-- origin/develop, develop
            \ __/
             J
...--G--H--I--K   [abandoned]
            \
             J   <-- origin/develop
              \
               K'  <-- develop
...--G--H--I   K'  <-- develop
            \ /
             J   <-- origin/develop
...--G--H--I--J--K   <-- origin/develop, develop
       K   [abandoned]
      /
...--J--K'   <-- develop
      K   [abandoned]
     /
     | K'   [abandoned]
     |/
...--J--K''' <-- develop
      \
       K''  [abandoned]