如何分析' git push'会推动吗?

时间:2016-12-23 06:42:36

标签: git

是的,我知道,之前已经问过(并反复回答)这个问题。不幸的是,我从使用这些答案得到的结果似乎没有(似乎)回答这个问题。我用错了吗?我的存储库损坏了吗?你是法官。

到目前为止我的旅程:

  1. 在我之前推送过的目录中,我做了git pull git://git.code.sf.net/p/mingw-w64/mingw-w64 master以确保我拥有最新的代码。下载了几个更新,这并不奇怪。

  2. 然后我做了一个干净的项目构建,以确保我的更改仍然可以构建。烨。

  3. 我上演了,然后将2个文件提交到我的本地存储库。到目前为止,非常好。

  4. 但是在我推动之前,我想检查以确保我只是推动我想要的东西。我使用git仍然感到不舒服,所以在影响公共存储库之前进行一些检查似乎是有道理的。所以(按this)我使用git cherry -v来查看我的推送内容:

  5. C:\cygwin64\src\mingw-w64d>git cherry -v
    + 390ef6ea3275003c44a404b3bae83455287271ae dwrite_2.h: Added IDWriteFontFace2 declaration.
    + 563731c44e5515ed373b4af03b5a382c7d5ea843 lib32 msvcrt add mkgmtime exports
    + e05f3e86898d91b870c9c7256efd24c8dd6de9cb Add CreateRemoteThreadEx to 32bit kernel32.def
    + 6734c8e40e69f305ada23afe86c1176a9ae0fc10 winpthreads mem leak fixed(bug 571)
    + c798dc2befb7e0b9d9d940aeeffbc7365b01e36a Add missing symbols to crypt library
    + 6c0ebaa1b404b9f27e1f953a16a7f87063e1079e winstorecompat: Add a GetStartupInfo stub
    + f3e50a97fb4ec3df8969c54bc5a575819dfb5b87 dpapi: Crypt*Data functions are allowed on Win10
    + 0f658a7ad80153970a0c43c6580f892c82e8cc48 uuid: Remove duplicated UUIDs
    + d47421eab0299215a33c7d24252b66fff3579b8a winstorecompat: Add GetConsoleOutputCP replacement
    + c77c0298a70b98edb302a7131ea51e739dd35ac3 winstorecompat: Fix mangling header guard.
    + e2cfbae44eda32aa63477b458f91a907633b334c wincrypt: Unconditionally include dpapi.h
    + 15b43db3ad61bca9c6a4abaf49e5f4e691349ee6 include: SwitchToThread is always available on Win10
    + 8a6d5d945c5c344daa464009e467054f2c7fbd8b crt: Add a WindowsApp.lib mri & associated def files
    + b48e3ac8969dd478efa8bfd129af38f080fd6741 crt: Add IMP symbols for lock/unlock_file
    + ac919255813c22aaad9de8b230216f0a8c39d115 GetThemeFont pFont argument is always UTF-16
    + 4c2df0d02ed71ae07e85f1b35ac857a148cd2b8f Define IN6_IS_ADDR_ macros to conform to Posix Spec
    + a76b799dc76dcdf8630dd48307158a5385a9f2ce Bug 541 - fesetenv was broken

    我的提交是 JUST 最后一个。剩下的似乎就是我从git pull中得到的所有东西。'所以,无论是' git cherry'没有列出我即将推出的内容,"或者我即将重新推动一系列已经推动的变革。

    1. 猜猜可能' cherry'不是我想要的命令,我尝试git diff --stat origin master(来自here。这列出了我从git pull获得的所有文件。但是它已经列出了文件中的文件。我实际上想要推动。再说一遍,这并不是告诉我我想知道什么。

    2. 作为最后一次尝试,我做了git push --dry-run origin master,其中显示了:

      4c2df0d..a76b799 master -> master

      现在看起来正确(-ish)。如你所见,a76b799是我的提交。 4c2df0d就是它之前的提交。如上所述,这似乎表示推送将发送2次提交。这比17更好,但是把它称为我即将推出的"的列表。似乎是一段时间。

    3. 所以,回到我的问题:如何分析' git push'会推动吗?

      我在SO上找到的答案并没有告诉我我想知道什么。虽然这可能是因为我使用它们错了,或者我(不知何故)弄乱了我的本地存储库。也许调用push真的即将发送所有17个提交?但那不是什么'推 - 干 - 运行'似乎在说什么?我怎么知道相信哪一个?!?

      试图找出'我要推的东西让我更加困惑的是什么会被推动而不是我开始的时候!

      这个问题的可接受答案是什么样的?好吧,有些事情会让我觉得这是一个开始:

      + a76b799dc76dcdf8630dd48307158a5385a9f2ce Bug 541 - fesetenv was broken

      请注意,与我目前的樱桃不同。输出,我只列出(我希望是)一个即将推送的提交。

      或者会产生一个文件列表,包含将要推送的实际文件(与我当前的&#39; git diff&#39;输出不同),并排除其他所有内容:< / p>

      mingw-w64-crt/misc/fesetenv.c                    |   2 +-
      mingw-w64-crt/misc/feholdexcept.c                |   2 +- 
      

      最后是一种获取补丁的方法(或者如果有多个提交待定,可能还有一个大补丁?)即将推送的更改。

      我想发布我从所有这些命令获得的实际输出,但它超出了SO问题的最大消息大小。它(暂时)可在http://www.limegreensocks.com/mingw-w64/hist.txt查看。 a76b799提交中的文件名为fesetenv.c和feholdexcept.c。

      一个想法:我的git pull语法错了吗?

1 个答案:

答案 0 :(得分:1)

  

git pull git://git.code.sf.net/p/mingw-w64/mingw-w64 master

不要这样做 - 或者更确切地说,不要这样做。 (实际上我建议完全避免git pull - 它只运行git fetch后跟第二个命令,选择第二个命令最好手动完成除最简单的情况之外的所有情况 - 但这是一个单独的问题。第二个命令是git mergegit rebasepull默认为merge,通常是错误的一个。)

  

一个想法:我的git pull语法错了吗?

它不完全错误,但它会让您的Git出现问题,然后在您运行git cherry时显示该问题。 您想要的是git pull origin master

(你可以现在就这样做 - 但不要或者至少还没有。相反,现在尝试git fetch origingit fetch总是安全的,而git pull运行第二个命令可能无法执行您想要的操作,因为它的作用取决于git fetch提取的内容!如果在git fetch origin之后,git cherry列出了您的预期那么一切都很好,你准备好了。如果没有,这意味着有人在origin上游进行了进一步的更改,你得到了决定如何处理的有趣部分&#34;那个。)

背景:这里发生了什么

基本上只有两个命令 1 让你的Git调用另一个Git,以便你可以交换提交和其他对象:git fetchgit push。其他命令(包括git cherry)依赖于 git fetchgit push通常留在后面的远程跟踪项目。

要使这些剩余的命令运行良好,您需要确保git fetch留下良好的跟踪信息,并且 要发生git fetch需要从中获取名为remote

补充工具栏:远程跟踪和远程跟踪分支

远程只是一个简短的名称,例如origin。您可以选择任何您喜欢的名称 2 ,这将是令人难忘的。 默认名称是origin,在您进行初始克隆时设置,如果您只有一个遥控器,您也可以使用它。如果您有多个遥控器,可能会调用一个origin和第二个sfnet

对于其余部分,我只假设origin。这几乎总是正确的,因为没有理由改变默认值,而且大多数人都没有。名称origin现在是网址的缩写,因此您不必再将其拼写出来:origin 表示 git://git.code.sf.net/p/mingw-w64/mingw-w64。 (您可以使用git remotegit config更改此内容,甚至只更改您的编辑器。请查看文件.git/config以查看:这将非常明显。)

远程跟踪分支是一个稍长的名称,从其中一个遥控器的名称开始。您无法控制这些名称:他们是git fetchgit push根据--prune创建和更新(并使用git fetch删除) 在另一个Git上看到,并且在您尝试git push之后,另一个Git接受您的推送请求。远程名称后面的部分只是那个其他Git存储库中分支的名称,就像在那里看到的那样。因此,origin/master 其他 Git所拥有的master的内容的记忆,来自您的上一个fetch ,或者您上一次成功push

使用直接网址时,没有远程

问题现在应该是显而易见的。当git pull运行git fetch时,它会为git fetch提供远程名称。如果您自己运行git fetch,则提供遥控器。远程originsfnet或其他任何内容,然后提供URL 告诉fetch保存新的远程跟踪分支的位置。

如果没有远程名称,git fetch将无法更新任何远程跟踪分支。您的origin/master无法获得更新,甚至可能根本不存在。 (如果它不存在,git cherry将没有上游,所以origin/master显然确实存在。)

这意味着当您(通过git pull)运行git fetch git://git.code.sf.net/p/...时出现问题:您的Git选择了新的提交,但没有更新自己的他们的 { {1}}。然后master使用其秘密侧通道 3 来运行git pullgit merge以合并新提交,即使它们没有永久记录。稍后的git rebase认为他们 提交,因为他们未在git cherry中记录。

正在运行origin/master会根据git fetch origin看到现在的内容来更新您的origin/master - 然后git fetch将是能给你很好的信息。您可以随时运行git cherry,并且经常运行它可能是明智的,因为远程跟踪分支逐渐变得过时 - 无论其他 Git如何更新当然。

(注意:您可以只运行git fetch,它会为您找出git fetch。第二个命令origin也会运行,因此代替git pull你可以运行git pull <remote> <branch>,然后运行一个简单的git fetchgit rebase,无论你想要的是什么。而且,对于更复杂的情况,你可以运行git merge后跟{例如{1}}。关键是让git fetch更新所有git rebase origin/<branch>远程跟踪分支。)

1 fetch除外。 Three! There are three commands when your Git will contact the other Git, when running fetch, push, ls-remote, and show ... er, four. Git's four weapons and fetch, push, ls-remote, and show. And git remote update ... I'll come in again.

2 好吧,嵌入在引用中的任何名称。坚持使用所有小写字母数字是一个好主意。虽然Git在这里区分大小写,但Git对这些名称做的一些事情依赖于底层操作系统,如果它对远程跟踪分支名称做了不区分大小写的事情,那么它就会变得混乱。因此,避免使用名称origin/*可确保永远不会与git ls-remote发生任何冲突。

3 这个辅助渠道不是那么秘密:the git fetch documentation中描述了它。它是oriGIN存储库中的一个名为origin的文件,其作用有点像其中的各种其他.git文件,除了它有更多字段。