相当于svn status -u的git

时间:2009-07-16 17:13:03

标签: git svn

什么是svn status -u或更详细svn status --show-updates的git等价物。 svn status --show-updates命令显示svn update命令将从服务器带来的更新。

谢谢!

7 个答案:

答案 0 :(得分:34)

如果没有实际获取更新(也许其他人会),我想不出办法。假设您在默认分支“master”上,并且这些假设更新将来自的上游是默认远程“origin”,请尝试....

git fetch
git log --name-only ..origin/master

请注意双点..不是单个点或省略号 1

这将为您提供仅上游更改的日志条目列表,文件名受影响,您可以将参数更改为git log以获取更多或更少的信息。

在git中“提取”这些更新与将它们应用到本地分支不同。毫无疑问,你已经知道如何用git pull做到这一点。


1 至于双点的来源,name1..name2表示范围。如果省略name1,则会在其位置使用HEAD。此语法指的是从name2可以返回但不包括HEAD的所有提交。 ["Git from the bottom up"]

答案 1 :(得分:30)

Martinho Fernandestialaramex答案都正确描述了您需要做的事情。让我来描述 为什么 就是这样。


的Subversion

Subversion 集中式版本控制系统。这意味着它以客户端 - 服务器方式运行:服务器存储有关版本(存储库)的所有数据,客户端只有工作目录(文件)以及一些管理和帮助数据。这意味着对于大多数命令,客户端必须联系服务器。这也意味着有许多命令询问服务器上的存储库状态或服务器配置,例如“svn status --show-updates”。

(旁注:Subversion在客户端上存储的一个帮助数据是文件的“原始”版本,这意味着检查您所做的更改不需要连接到服务器(这很慢)......但这也意味着SVN结账可能比Git存储库大。

“svn update”(如果存储库在给定分支中有任何更改,则在提交之前需要)从远程下载最后一个版本并且合并(尝试合并)您对远程更改所做的更改。恕我直言,这个更新前提交工作流程不是很好。


GIT中

Git 分布式版本控制系统。这意味着它以点对点的方式运行:每个“客户端”都包含有关版本的所有数据(完整存储库)。中央存储库仅仅是因为社会惯例而非技术限制。这意味着当联系其他远程存储库时,“远程执行”的命令数量非常少。您可以使用“git ls-remote”(以及“git update show”)索引引用(头部也称为分支和标签),您可以使用“git fetch”(或“git”来拉取(获取)或推送(发布)数据远程更新“)/”git push“,如果服务器配置为允许它,您可以使用”git archive --remote“获取远程存储库状态的快照。

因此,要检查远程存储库中但在存储库中不存在的提交,您必须将数据下载到您的计算机。但是“git pull”实际上只不过是下载数据的“git fetch”和合并它的“git merge”(用一点糖来准备提交消息并选择合并哪个分支)。然后你可以使用'git fetch'(或“git remote update”),用“git log”和“gitk”(不仅限于固定输出)检查新带来的提交,然后如果一切都好,则合并更改为“ git merge“。

这不是特定于Git,而是针对所有分布式版本控制系统,尽管SCM提供的已获取但未合并的数据的方式可能不同(Git在'remote /< remotename> / *'命名空间中使用远程跟踪分支,Mercurial根据我的理解,使用未命名的头脑。)


HTH

答案 2 :(得分:13)

如果你拿到:

git fetch <remote>

而不是拉:

git pull <remote>

从遥控器,您可以检查git log更改的内容。要应用更改:

git merge <remote>/<remote-branch>

答案 3 :(得分:4)

您可以使用git ls-remote列出远程存储库中引用的SHA;所以,你可以通过比较输出来看看是否有任何变化:

$ git show-ref origin/master     # <-- Where this repo thinks "origin/master" is
5bad423ae8d9055d989a66598d3c4473dbe97f8f refs/remotes/origin/master
$ git ls-remote origin master    # <-- Where "origin" thinks "master" is
060bbe2125ec5e236a6c6eaed2e715b0328a9106    refs/heads/master

如果它们不同,那么fetch会有变化:

$ git remote update
Fetching origin
...
From github.com:xxxx/yyyy
5bad423..060bbe2  master     -> origin/master

答案 4 :(得分:3)

对我来说,只是为了显示会改变的文件,它是:

git fetch (1)
git diff --name-only ..origin/master (2)
  1. 获取Git“数据库”(仅限.git目录)中的更改,不要更改文件。
  2. 显示合并后将更改的文件的名称
  3. 要更新文件(不仅是Git“数据库”),请执行git merge

答案 5 :(得分:2)

Gits为我们提供了更多检查“更新”的工具。首先,您必须“下载”存储库的最新状态:

git fetch

现在您可以获取已更改文件的列表:

git log --name-status ..origin/master

另外,您可以使用diff查看完整的更改列表:

git diff ..origin/master

起始字母的含义为:添加(A),复制(C),删除(D),修改(M),重命名(R),更改(T),未合并(U),未知(X) ),或已配对破碎(B)

答案 6 :(得分:2)

git fetch && git log --name-status ..origin/master确实显示了要合并的日志。然而,它也拉动了变化。从技术上讲,与svn status -u做同样的事情是不可能的,但是git fetch是如此之快,通常无关紧要

如果在获取之前绝对需要日志,唯一的方法是将(SSH或等效的)连接到远程并在那里发出git log