【问题标题】:How can I see what I am about to push with git?我怎样才能看到我将要使用 git 推送什么?
【发布时间】:2011-04-07 21:44:29
【问题描述】:

有没有办法查看如果我执行git push 命令会推送什么?

我所描绘的类似于 Github 的“拉取请求”功能的“文件已更改”选项卡。当我发出拉取请求时,我可以查看如果他们接受我的拉取请求会拉入什么:

命令行没问题,但我更喜欢某种 GUI(如上面的屏幕截图)。

【问题讨论】:

标签: git


【解决方案1】:

总是有预演:

git push --dry-run

它会做除了实际发送数据之外的所有事情。

如果您想要更图形化的视图,您有很多选择。

Tig 和 git 附带的 gitk 脚本都显示本地副本的当前分支和远程或源的分支。

因此,您在原点之后所做的任何提交都是将被推送的提交。

在您要推送的分支中,通过键入gitk& 从 shell 打开 gitk,然后查看远程上的内容与您将要推送到远程的内容之间的区别,选择您的本地未推送提交并右键- 单击遥控器并选择“Diff this -> selected”:

【讨论】:

  • git push --dry-run 没有向我展示我希望看到的任何东西。 gitk 更接近,但它没有向我显示将被推送的所有更改的总和。因此,如果我将 6 次提交推送到远程,我想查看将推送的总和。我不在乎每个提交分别有什么,因为一个提交可能会被下一个完全否定。
  • 如果您需要推送内容的差异,请执行git diff --stat HEAD origin/mastergit diff HEAD origin/masterHEAD 很重要,否则您在差异中包含未提交的更改
  • git 在尝试将数据推送到远程之前不会自动进行空运行是否有某种原因?如果您正在推送大量数据,它会上传所有数据,然后显示任何错误。您刚刚浪费了时间和带宽来上传您现在必须重新上传的数据。这似乎是一种奇怪的行为。
  • git push --dry-run 的问题是它仍然需要远程写权限。因此,如果您有一个没有权限推送上游的克隆,但您想查看本地未推送的更改是什么,--dry-run 不会这样做。
  • 这是一个很好的解决方案,但需要注意的是它确实需要连接到远程(如果适用,包括输入 SSH 密钥)。如果您只想查看 branchorigin/branch 之间的区别,我会选择 Ionuț G. Stan 的回答,因为它实际上不需要连接到远程仓库。这可能是好是坏,取决于您的需要。
【解决方案2】:

使用git gui,您可以在此处查看实际提交中发生的更改列表。您还可以使用gitk,它为 reflogs 提供了一个简单的界面。只需比较remotes/...master 就可以看到会推送什么。它提供了一个类似于您的屏幕截图的界面。

这两个程序都包含在 git 中。

【讨论】:

  • 我在 git gui 中没有看到任何地方显示已提交但未推送的所有内容。
  • 在 git gui 中你可以看到,什么被修改但没有被提交。在 gik 中(通过gitk --all,您可以获得所有 cmets 的完整列表。现在您可以将您的 dev-branch 的实际状态与您的远程推送进行比较。
【解决方案3】:

对于要推送的文件列表,运行:

git diff --stat --cached [remote/branch]

例子:

git diff --stat --cached origin/master

要推送的文件的代码差异,运行:

git diff [remote repo/branch]

要查看将要更改的文件的完整文件路径,请运行:

git diff --numstat [remote repo/branch]

如果您想在 GUI 中查看这些差异,您需要为此配置 git。见How do I view 'git diff' output with a visual diff program?

【讨论】:

  • 没有提交的 git diff --cached 的两种变体只会显示与 HEAD 相关的差异。我想你的意思是 git diff [--stat] --cached origin/master,假设 origin 的主分支是 master
  • 这不是你想要的。您应该区分 HEAD,而不是索引,与原点 (git diff origin/master HEAD)。当且仅当您没有为提交暂存更改时,对索引进行比较将给出相同的结果。如果您已暂存更改,它们将包含在差异中,但由于尚未提交,因此显然不会被推送。
  • 此答案需要编辑以包含来自@Jefromi git diff --stat origin/master HEAD 的评论中的信息是正确答案。
  • @mfontani 对我有正确的答案。我想检查从我已经提交的内容中会推送什么,而不是如果我提交我所做的所有更改,将会提交什么。 git diff --cached [remote/branch] 成功了 :)
  • 您可以使用 @{u} 而不是输入 origin/master,例如 git diff @{u} 或 git diff HEAD @{u} 请注意,这仅在您已经有上游跟踪分支时才有效创建并链接。当我有很多分支和很多遥控器时,我发现它很有用,这样我就不必考虑链接到哪里了。
【解决方案4】:

您可能想运行git difftool origin/master...。这应该显示当前分支上尚未在 origin/master 分支上的内容的统一差异,并将其显示在您选择的图形差异工具中。要获得最新信息,请先运行 git fetch

【讨论】:

  • git difftool -d origin/master,我的 difftool 设置为融合,所以效果很好,谢谢!
  • git difftool -d 好多了,感谢 Aquarius Power。唯一的问题是它没有检测到移动的文件,而是将它们显示为已删除和添加。
【解决方案5】:

如果您使用的是 Mac OS X,我建议您使用 Tower,它是一个很棒的程序,让我与 Git 打交道成为一种乐趣。我现在不再需要记住终端命令,它提供了一个很棒的 GUI 来查看、跟踪和解决文件中的差异。

不,我不隶属于他们,我只是使用他们的软件并且非常喜欢它。

http://www.git-tower.com/

【讨论】:

  • 我用的是Tower,怎么能看到已经提交但没有推送的文件呢?
  • 这不能回答问题。
【解决方案6】:

在将本地版本推送到远程仓库之前比较本地版本的一种方法(干运行中的推送):

使用 TortoiseGit:
右键单击根文件夹项目 > TortoiseGit > 与以前版本的差异 >
对于版本 2,请选择 refs/remotes/origin/master

【讨论】:

    【解决方案7】:

    尝试git diff origin/master..master(假设origin/master 是您的上游)。与git push --dry-run 不同,即使您没有上游的写权限,这仍然有效。

    【讨论】:

      【解决方案8】:

      要查看更改了哪些文件查看与您可以使用的 master 分支相比的实际代码更改:

      git diff --stat --patch origin master
      

      注意:如果您碰巧使用任何 Intellij IDE,那么您可以右键单击您的顶级项目,选择 Git > 与分支比较 >并选择您想要的来源,例如origin/master。在将出现的文件树中,您可以双击文件以查看视觉差异。与上面的命令行选项不同,您可以从差异窗口编辑本地版本。

      【讨论】:

        【解决方案9】:

        简单列出等待推送的提交:这是你会记得的

        git cherry -v
        

        在 SHA1 旁边显示提交主题。

        【讨论】:

        • 一件有趣的事情是,您可以指定一个遥控器进行比较,例如:git cherry -v heroku/remote,以防您将代码保存在多个遥控器中。
        • 什么是让我们能够真正关联这些提交所包含的差异的最佳补充命令?
        • 这个命令很好,但我想要更多细节,比如在推送期间要更改的文件的名称。
        • 我发现这个命令git diff --stat --cached origin/branchname很好地列出了更改的文件。
        • 有趣,为什么当我使用git cherry -v 时命令刚刚结束,我又回到了终端,好像什么都没发生一样?有什么线索吗?
        【解决方案10】:

        您可以通过以下方式列出提交:

        git cherry -v
        

        然后与以下命令进行比较,其中 ^ 的数量等于提交的数量(在示例中为 2 次提交):

        git diff HEAD^^
        

        【讨论】:

        • 查看最新提交列表是一件好事。这不会给出文件的名称。因此,正如有人回答的那样,使用试运行选项和补丁选项更好。 git diff --stat --patch origin master git push --dry-run
        【解决方案11】:
        1. 如果你有远程写权限
        git push --dry-run
        
        1. 如果您没有远程写权限
        git diff --stat HEAD remote/branch
        

        【讨论】:

          【解决方案12】:

          只要加上我的两分钱...... 我想在 gitlab 运行器上的 gitlab 管道中运行作业时实现这一点。 最好的方法是使用这个脚本:

          git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA
          

          在我的情况下,我还想按扩展名过滤文件,为此我使用了:

          git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'
          

          之后,您可以将这个列表转发到其他地方,也许是一个 linter ;)

          希望这会对某人有所帮助。

          【讨论】:

            【解决方案13】:

            git commit -m "{your commit message}"之后,你会在推送前得到一个commit hash。 因此,您可以通过运行以下命令来查看您将要使用git 推送的内容:

            git diff origin/{your_branch_name} commit hash
            

            例如: git diff origin/master c0e06d2

            【讨论】:

            • 感谢您的回答,但我认为这个问题不是必需的,因为这个问题已经很老了,而且投票率很高。你最好把精力花在不同的问题上。
            【解决方案14】:

            只是想为 PyCharm 用户添加: 可以右键文件,-> Git -> 与分支比较

            然后你可以选择master(或任何其他)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-12-12
              • 1970-01-01
              • 2016-07-20
              • 2021-11-25
              • 2013-02-08
              • 1970-01-01
              • 2012-05-09
              • 2010-11-17
              相关资源
              最近更新 更多