如何比较本地仓库和远程仓库之间的差异?

18 浏览
0 Comments

如何比较本地仓库和远程仓库之间的差异?

我想要比较我本地克隆的仓库与远程仓库之间的差异。

我使用以下命令:

git add newfile
git commit -m "我的修改"
git diff HEAD origin --name-only

我只想比较被修改文件的内容,而不是文件重命名。

我遇到了两个问题:

1. 如果我改变了文件名,它会将其显示出来。

2. 如果我在远程仓库中添加/修改文件,它也会将其显示出来。我希望只看到相对于我本地仓库的变化。

我该如何解决这个问题?

0
0 Comments

如何比较本地仓库和远程仓库之间的差异?

如果你克隆了一个分支(例如称之为“mybranch”),那么当你克隆仓库时,你将拥有一个名为“origin/mybranch”的分支。这实际上是远程分支的状态。

然后你在本地切换到这个分支,你将拥有一个名为“mybranch”的分支-你进行修改,然后可以在这两个分支之间进行比较:

git diff origin/mybranch mybranch

或者你可以简单地查看HEAD,就像你的例子中一样。当你克隆仓库时,你会处于HEAD位置。当你提交内容时,你仍然处于HEAD位置,但是前一个提交可以通过HEAD~1访问。所以你的git diff命令可以是:

git diff HEAD~1 HEAD

或者只需查看日志git log或图形视图git log --oneline --graph --all --decorate,然后选择任意两个提交哈希值/标签/分支进行比较。

更新

我可能误解了问题。根据你的评论,我认为你只是想比较那些“内容”发生了变化的文件。你可以使用--diff-filter选项:

git diff --diff-filter=M HEAD~1 HEAD

其中"M"表示修改。如果需要,你还可以使用"R"表示重命名(并且你可以组合多个选项,例如git diff --diff-filter=MR HEAD~1 HEAD表示修改和重命名的文件)。

如果我在另一个目录(没有.git文件)中执行git diff,我需要添加哪个标志?

如果你不想只是CD进入你的git目录,你可以使用"-C "选项:git -C /your/git/dir diff HEAD~1 HEAD

我的建议和你的建议有什么不同?

啊哈-更新了答案,我想我没有完全理解你的问题。我认为你写的是“上下文”,而不是“内容”?

我不知道上下文和内容有什么不同。我的意思是,如果我更改文件,它会向我显示。

啊,没关系...有点像这样:“上下文”意味着“与...相关/相对”。“内容”具体指的是某物包含的内容-我认为这就是你的意思。所以一个名称的更改可以在文件的“上下文”中,但不涉及文件的“内容”。我认为你的问题是正确的,但是不够具体,以至于我不能完全理解你的意思:)...无论如何,尝试一下过滤选项,这应该能帮助你。

注意,小写字母,如diff ... --diff-filter=m,意思是“显示除...之外的所有更改”。在这种情况下,M表示“修改”,而A表示添加,D表示删除,所以这将显示添加和删除的文件,但不包括修改的文件。如果你希望显示状态为M或R的文件,你需要diff-filter=MR,而不是diff-filter=mr

更新-谢谢,我似乎搞错了:o

我在哪里可以找到这些信息?Git的文档很难理解。

在这里看:https://git-scm.com/docs/git-diff,然后搜索--diff-filter。

我看过了。它很难理解。没有示例。

是的-它更像是一个参考,我猜有一个示例在最后,但没有一个真实的示例。那里有很多参数要讲解...但是你可以在SO上找到没有涵盖的所有内容:)

在我的本地仓库中,添加新文件并重命名文件的名称被归类为D。为什么?

:这意味着你的diff反了。git diff的参数是按照你给它们的顺序进行比较的,并且你会得到将第一个提交变为第二个提交的指令。反转提交并获得反转的更改。(重命名检测是可选的:使用-M或--find-renames,或将diff.renames设置为true,或使用默认将diff.renames设置为true的最新Git。)

我不明白你的意思。如果我使用--name-status,然后D。请给我一个完整的示例。

在这里看看:stackoverflow.com/questions/7759193,这个链接展示了各种方法(包括OP的示例)。前两个答案非常详细,并展示了如何使用“-C”,“-M”和“--find-renames”选项...

:正如code_fodder所说,看一些其他示例,但是:git diff HEAD^ HEAD将向你展示如何将上一个提交转换为当前提交,而git diff HEAD HEAD^将向你展示如何将当前提交转换为上一个提交。如果你添加了一个新文件new.txt,第一个diff将说:要做这个,添加new.txt,而第二个将说:要做这个,删除new.txt。在设置重命名检测之前(使用-M或其他标志之一),“重命名old.name new.name”表示“删除old.name的内容,添加与new.name相同的内容”。

如何只比较文本类型的文件?我尝试添加-a标志,但不起作用。

:首先,你必须定义你所说的“文本类型文件”是什么。Git的git diff可以告诉它比较特定的路径规范,或者通过.gitattributes在特定文件路径上使用“外部diff”,但通常git diff 表示比较整个提交,要仅比较一对文件,你必须使用git diff

git diff和git log --pretty="format:"之间有什么区别?HEAD与FETCH_HEAD有什么区别?什么时候使用git fetch ?为什么diff origin/branch branch显示自克隆以来的所有差异,尽管已经推送到远程?

git log用于查看一系列提交,而git diff(大多数情况下)用于比较两个特定的提交。git fetch用于将提交获取到你自己的Git仓库中(你可以在其中使用它们),从其他Git仓库中(你无法在其中使用它们)。看起来你真的需要阅读一本Git书籍或教程。

0