137

在 Git 拉取之后,它的输出给出了更改量的摘要。

如何查看每个或部分文件的详细更改?

好的,这是我对 Jefromi 的问题:

  1. 我怎么知道我是否在拉高手?我所做的只是“git pull”。

  2. master 指向什么,git 的两个默认头 master 和 HEAD 有什么区别?

  3. 如何查看特定文件中的详细更改?

  4. 我如何git pull再次看到最后一个摘要输出的变化?

  5. git diff和 有什么区别git whatchanged

4

4 回答 4

216

假设你要掌握。您可以参考masterby的先前位置master@{1}(甚至;参见git-rev-parse 手册页master@{10.minutes.ago}的指定修订部分),以便您可以执行以下操作

  • 查看所有更改:git diff master@{1} master

  • 查看给定文件的更改:git diff master@{1} master <file>

  • 查看给定目录中的所有更改:git diff master@{1} master <dir>

  • 再次查看更改摘要:git diff --stat master@{1} master

至于你的“我怎么知道我是否在主人”的问题......好吧,使用分支是 Git 工作流程的重要组成部分。您应该始终知道您所在的分支 - 如果您拉取更改,您希望将它们拉到正确的分支!您可以使用命令查看所有分支的列表,当前签出的分支带有星号git branch。当前分支名称也与git status. 我强烈建议浏览一下要使用的命令手册页——这是慢慢学习一些知识的好方法。

最后一个问题:HEAD是当前签出分支的名称。您确实也可以在这种情况下使用HEADand HEAD@{1},但是使用分支会更加健壮,因为如果您去查看另一个分支。HEAD现在是第二个分支,HEAD@{1}现在是master- 不是你想要的!

为了避免问很多这样的小问题,你可能应该看看 Git 教程。网上有一百万,例如:

于 2009-09-01T15:09:03.120 回答
53

假设你这样做 git pull 是这样的:

$ git pull
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From git@dev.example.com:reponame
   a407564..9f52bed  branchname   -> origin/branchname
Updating a407564..9f52bed
Fast forward
 .../folder/filename          |  209 ++++++++-----
 .../folder2/filename2        |  120 +++++++++++---------
 2 files changed, 210 insertions(+), 119 deletions(-)

您可以使用修订号查看更改内容的差异:

$ git diff a407564..9f52bed
于 2009-09-01T15:12:23.413 回答
6

1.我怎么知道我是不是在拉高手?我所做的只是“git pull”。

命令本身的工作方式如下:

git pull [options] [<repository> [<refspec>…]]

并且默认情况下是指当前分支。您可以使用检查您的分支

git branch -a

这将列出您的本地和远程分支,例如这样(--- 在本地和远程之间添加了一个分隔符以使其更清晰)

*master
foo
bar
baz
---
origin/HEAD -> origin/master
origin/deploy
origin/foo
origin/master
origin/bar
remote2/foo
remote2/baz

然后,当您查看一个远程仓库时,您将看到您所指的内容:

git remote show origin

将列出如下:

* remote origin
  Fetch URL: ssh://git@git.example.com:12345/username/somerepo.git
  Push  URL: ssh://git@git.example.com:12345/username/somerepo.git
  HEAD branch: master
  Remote branches:
    foo    tracked
    master tracked
  Local refs configured for 'git push':
    foo    pushes to foo    (up to date)
    master pushes to master (fast-forwardable)

所以很容易确定从哪里拉到哪里。

3.如何查看特定文件的细节变化?

4.如何再次看到最后一次 git pull 的汇总输出变化?

最简单和最优雅的方式(imo)是:

git diff --stat master@{1}..master --dirstat=cumulative,files

这将为您提供关于您上次拉取和当前工作状态之间变化的两个信息块。示例输出(我在和输出--- 之间添加了一个分隔符以使其更清晰):--stat--dirstat

 mu-plugins/media_att_count.php                     |  0
 mu-plugins/phpinfo.php                             |  0
 mu-plugins/template_debug.php                      |  0
 themes/dev/archive.php                             |  0
 themes/dev/category.php                            | 42 ++++++++++++++++++
 .../page_templates/foo_template.php                |  0
 themes/dev/style.css                               |  0
 themes/dev/tag.php                                 | 44 +++++++++++++++++++
 themes/dev/taxonomy-post_format.php                | 41 +++++++++++++++++
 themes/dev/template_parts/bar_template.php         |  0
 themes/someproject/template_wrappers/loop_foo.php  | 51 ++++++++++++++++++++++
---
 11 files changed, 178 insertions(+)
  71.3% themes/dev/
  28.6% themes/someproject/template_wrappers/
 100.0% themes/
  27.2% mu-plugins/
   9.0% themes/dev/page_templates/
   9.0% themes/dev/template_parts/
  63.6% themes/dev/
   9.0% themes/someproject/template_wrappers/
  72.7% themes/
于 2014-09-18T23:43:03.793 回答
2

这种方式有点 hacky,但它允许您使用图形工具,如gitkor gitgor git-gui

git pull
git reset HEAD@{1}
gitg (or gitk or whatever tool you like)

投票最多的答案给出了使用 git 工具的最佳方法,但我使用这种方法是因为我可以使用带有 GUI 的工具来查看更改:P

然后我会有一个额外的步骤,git checkout .然后再做git pull一次,以便我正确地提取和合并,但我重视检查 GUI 差异的能力,足以处理额外的两个步骤。

于 2014-03-05T22:22:55.120 回答