是的,我知道,之前已经问过(并反复回答)这个问题。不幸的是,我从使用这些答案得到的结果似乎没有(似乎)回答这个问题。我用错了吗?我的存储库损坏了吗?你是法官。
到目前为止我的旅程:
在我之前推送过的目录中,我做了git pull git://git.code.sf.net/p/mingw-w64/mingw-w64 master
以确保我拥有最新的代码。下载了几个更新,这并不奇怪。
然后我做了一个干净的项目构建,以确保我的更改仍然可以构建。烨。
我上演了,然后将2个文件提交到我的本地存储库。到目前为止,非常好。
但是在我推动之前,我想检查以确保我只是推动我想要的东西。我使用git仍然感到不舒服,所以在影响公共存储库之前进行一些检查似乎是有道理的。所以(按this)我使用git cherry -v
来查看我的推送内容:
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'没有列出我即将推出的内容,"或者我即将重新推动一系列已经推动的变革。
猜猜可能' cherry'不是我想要的命令,我尝试git diff --stat origin master
(来自here。这列出了我从git pull获得的所有文件。但是它已经列出了文件中的文件。我实际上想要推动。再说一遍,这并不是告诉我我想知道什么。
作为最后一次尝试,我做了git push --dry-run origin master
,其中显示了:
4c2df0d..a76b799 master -> master
现在看起来正确(-ish)。如你所见,a76b799是我的提交。 4c2df0d就是它之前的提交。如上所述,这似乎表示推送将发送2次提交。这比17更好,但是把它称为我即将推出的"的列表。似乎是一段时间。
所以,回到我的问题:如何分析' 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
语法错了吗?
答案 0 :(得分:1)
不要这样做 - 或者更确切地说,不要这样做。 (实际上我建议完全避免
git pull git://git.code.sf.net/p/mingw-w64/mingw-w64 master
git pull
- 它只运行git fetch
后跟第二个命令,选择第二个命令最好手动完成除最简单的情况之外的所有情况 - 但这是一个单独的问题。第二个命令是git merge
或git rebase
,pull
默认为merge
,通常是错误的一个。)
一个想法:我的
git pull
语法错了吗?
它不完全错误,但它会让您的Git出现问题,然后在您运行git cherry
时显示该问题。 您想要的是git pull origin master
。
(你可以现在就这样做 - 但不要或者至少还没有。相反,现在尝试git fetch origin
:git fetch
总是安全的,而git pull
运行第二个命令可能无法执行您想要的操作,因为它的作用取决于git fetch
提取的内容!如果在git fetch origin
之后,git cherry
列出了您的预期那么一切都很好,你准备好了。如果没有,这意味着有人在origin
上游进行了进一步的更改,你得到了决定如何处理的有趣部分&#34;那个。)
基本上只有两个命令 1 让你的Git调用另一个Git,以便你可以交换提交和其他对象:git fetch
和git push
。其他命令(包括git cherry
)依赖于 git fetch
和git 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 remote
或git config
更改此内容,甚至只更改您的编辑器。请查看文件.git/config
以查看:这将非常明显。)
远程跟踪分支是一个稍长的名称,从其中一个遥控器的名称开始。您无法控制这些名称:他们是git fetch
和git push
根据--prune
创建和更新(并使用git fetch
删除) 在另一个Git上看到,并且在您尝试git push
之后,另一个Git接受您的推送请求。远程名称后面的部分只是那个其他Git存储库中分支的名称,就像在那里看到的那样。因此,origin/master
master
的内容的记忆,来自您的上一个fetch
,或者您上一次成功push
。
问题现在应该是显而易见的。当git pull
运行git fetch
时,它会为git fetch
提供远程名称。如果您自己运行git fetch
,则提供遥控器。远程origin
或sfnet
或其他任何内容,然后提供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 pull
或git 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 fetch
或git rebase
,无论你想要的是什么。而且,对于更复杂的情况,你可以运行git merge
后跟{例如{1}}。关键是让git fetch
更新所有git rebase origin/<branch>
远程跟踪分支。)
2 好吧,嵌入在引用中的任何名称。坚持使用所有小写字母数字是一个好主意。虽然Git在这里区分大小写,但Git对这些名称做的一些事情依赖于底层操作系统,如果它对远程跟踪分支名称做了不区分大小写的事情,那么它就会变得混乱。因此,避免使用名称origin/*
可确保永远不会与git ls-remote
发生任何冲突。
3 这个辅助渠道不是那么秘密:the git fetch
documentation中描述了它。它是oriGIN
存储库中的一个名为origin
的文件,其作用有点像其中的各种其他.git
文件,除了它有更多字段。