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