问:
如何查看我所做的任何本地提交,但尚未推送到远程存储库?有时,git status 会打印出我的分支是在 origin/master 之前提交 X 次,但并非总是如此。
这是我安装 Git 的错误,还是我遗漏了什么?
答1:
huntsbot.com – 高效赚钱,自由工作
git log origin/master..HEAD
您还可以使用相同的语法查看差异
git diff origin/master..HEAD
这为我做到了-出于某种原因 git log origin.. 本身就引发了错误。看起来我的本地分支的配置方式也有问题 - 一旦我进行了我在这里找到的更改:wincent.com/blog/… ...问题已解决,我可以再次使用 git status 来查看我想要的内容。
无价之宝:所以我做了git config --global alias.ahead "log origin/master..HEAD --oneline",这样我就可以快速找到我在哪里。更多糖果:for i in *; do echo $i && git ahead 2>/dev/null; done
git log --stat origin/master..HEAD 额外的精彩
这不是最好的解决方案。 Origin/master 可能并不总是上游分支。更好的解决方案是使用@{u} 而不是“origin/master”来指示上游分支。由于默认情况下暗示了 HEAD,因此也可以将其省略。请参阅@Ben Ling 的回答。传出更改:git log @{u}.. 传入更改:git log ..@{u}
@Nocturne 我只想指出,发布此答案时,@{u} 语法尚不可用,仅在 February 12, 2010 上可用。此外,如果本地分支未配置上游,@{u} 将不起作用。最后,@{u} 目前不支持制表符补全,具有制表符补全的 / 仍然是获取此信息的最快方法之一,无论是否配置了上游,它都可以工作。
答2:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
如果您想查看尚未推送的所有分支上的所有提交,您可能正在寻找类似这样的内容:
git log --branches --not --remotes
如果您只想查看每个分支上的最新提交以及分支名称,则:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
这太棒了。在一个相关的场景中,我有两个本地分支和两个上游分支,并且一只本地手被合并到另一只手中。我想知道哪些提交可以安全地变基,但正常的 git log master..HEAD 不起作用,因为有多个上游。这篇文章将我带到 git log MyBranch --not --remotes,以在单个分支中显示尚未推送到任何上游的所有提交。
我知道您的第二个命令还列出了尚未推送的提交,只是每个分支只显示一个。
--decorate 也显示了分支。 --graph 使其更加明显。
请注意,这些命令仅列出尚未在任何分支中推送的提交。例子:假设你有分支开发分支feat-NewThing。您在本地对 feat-NewThing 进行更改。 (日志有变化。)然后你将 feat-newThing 推送到它的远程分支。 (日志为空)。您合并本地专长新事物以在本地开发。假设快进,日志仍然没有变化。
这是实际的解决方案。唯一一个不需要指定分支或需要定义上游的通常工作的。
答3:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
您可以显示您在本地但不是上游的所有提交
git log @{u}..
@{u} 或 @{upstream} 表示当前分支的上游分支(详见 git rev-parse --help 或 git help revisions)。
在 Windows 上,我需要将最后一个参数括在引号中,例如: git log "@{u}.."
git log @{u}.. -p 最有用的选项之一是 -p,它显示了每次确认中引入的差异。
可能更好 git log @{push}.. ,请参阅 another answer。
我发现这是最好的答案。我还发现,如果没有备忘单,我就无法在地球上记住它。为什么 git 开发人员没有选择明显的、符合 git status 的东西,因为我们想知道一个情况的 status。 git status -v 会更有意义。
答4:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
这对我有用:
git cherry -v
如 Git: See all unpushed commits or commits that are not in another branch 所示。
我认为这应该是主要答案,因为它提供了更简洁的提交列表,而不是所有文件中难以阅读的冗长差异!
git-cherry - “查找尚未应用于上游的提交”,似乎提供了 OP 所要求的内容,但只有提交主题而不是整个提交消息。
值得注意的是,这只会告诉您当前签出的分支上是否有未推送的提交。它不会告诉您是否有未推送提交的本地分支(当前未签出)。
答5:
huntsbot.com – 高效赚钱,自由工作
您可以使用 git log 执行此操作:
git log origin/master..
这假定 origin 是您的上游远程的名称,而 master 是您的上游分支的名称。在 … 之后省略任何修订名称意味着 HEAD,它列出了尚未推送的新提交。
每当我看到带有 git log 和“2-dots-not-3”的答案时,它总是让我想起 stackoverflow.com/questions/53569/… ;)
只是将其添加到答案中 - 如果没有上游设置,此命令会导致说没有设置上游。如果您倾向于使用此命令查看暂存的提交,请运行 git branch --set-upstream master origin/ 以设置上游。
这将与源中的默认分支进行比较,而不是当前的远程分支。
致命:模棱两可的参数“起源..”:未知修订版或路径不在工作树中。
不,它显示了所有不同的最新提交,但不回答原始 Q。
答6:
huntsbot.com – 高效赚钱,自由工作
所有其他答案都谈论“上游”(您从中提取的分支)。但是本地分支可以推送到与其拉出的分支不同的分支。
master 可能不会推送到远程跟踪分支“origin/master”。master 的 upstream 分支可能是 origin/master,但它可以推送到远程跟踪分支 origin/xxx 甚至 anotherUpstreamRepo/yyy。 这些是由 branch.*.pushremote 为当前分支以及 global remote.pushDefault 值设置的。
远程跟踪分支在寻找未推送的提交时计数:跟踪 本地分支 将被推送到的 branch at the remote 的分支。 { 1} 也可以是 origin/xxx 甚至是 anotherUpstreamRepo/yyy。
Git 2.5+(2015 年第二季度)为此引入了一个新的快捷方式:@{push}
请参阅 commit 29bc885、commit 3dbe9db、commit adfe5d0、commit 48c5847、commit a1ad0eb、commit e291c75、commit 979cb24、commit 1ca41a1、commit 3a429d0、commit a9f9f8c、commit 8770e6f、commit da66b27、{ 13}、commit 9e3751d、commit ee2499f [全部从 2015 年 5 月 21 日] 和 commit e41bf35 [2015 年 5 月 1 日] 由 Jeff King (peff) 提供。 (由 commit c4a8354 中的 Junio C Hamano – gitster – 合并,05 2015 年 6 月)
Commit adfe5d0 解释:
sha1_name:实现@{push} 简写
在三角工作流中,每个分支可能有两个不同的兴趣点:您通常从中提取的 @{upstream} 和您通常推送到的目的地。后者没有简写,但它很有用。例如,您可能想知道您尚未推送哪些提交: git log @{push}… 或者作为一个更复杂的示例,假设您通常从 origin/master 拉取更改(您将其设置为您的 @{ upstream}),并将更改推送到您的 fork(例如,作为 myfork/topic)。您可以从多台机器推送到您的分支,这需要您从推送目的地而不是上游集成更改。有了这个补丁,你可以这样做: git rebase @{push} 而不是输入全名。
Commit 29bc885 补充说:
for-each-ref: 接受 “%(push)” 格式
就像我们有 “%(upstream)” 来报告每个 ref 的 “@{upstream}” 一样,这个补丁添加了 “%(push)” 来匹配 “@{push}”。它支持与上游相同的跟踪格式修饰符(因为您可能想知道,例如,哪些分支有提交要推送)。
如果您想查看与您要推送到的分支相比,您的本地分支领先/落后有多少提交:
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
答7:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
我之前有一个提交,没有推送到任何分支,也没有远程或本地。只是提交。其他答案中没有任何东西对我有用,但是:
git reflog
在那里我找到了我的承诺。
如此链接 git-scm.com/docs/git-reflog 中所述,引用日志或“reflogs”记录本地存储库中分支和其他引用的提示何时更新。就我而言,我克隆了一个 repo,创建了一个新分支,删除了该分支,创建了一个新分支,创建了一个提交并更改了提交。所有这些步骤都记录为 HEAD@{0}: commit (amend) : .. [email protected]/docs/git-reflog: commit: ... HEAD@{2}: checkout: 从...移动到 ... HEAD@{ 3}:签出:从...移动到... HEAD@{4}:克隆:来自#sorry格式,显然不允许在评论中使用多行
这也包括原始提交,最好的解决方案是使用@PlagueHammer (stackoverflow.com/a/2016954/624048) 提供的命令
答8:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
方便的 git 别名,用于在当前分支中查找未推送的提交:
alias unpushed =!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD)&& git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH--oneline
这基本上是做什么的:
git log origin/branch..branch
但也确定当前分支名称。
这太棒了!对于那些不熟悉别名的人,只需将它们添加到您的 ~/.gitconfig 文件中的 [alias] 部分。
在 bash 中复制/粘贴不起作用,但该脚本非常有用且易于理解
正如@GaryHaran 指出的那样,这不是 bash 别名。还有一个用于添加别名的 git 命令:git alias 在这种情况下,该命令应该用单引号引起来,以便从 shell 中转义特殊字符。
那将是:git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline'
不过,这似乎与 git log @{u}.. 基本相同 - 请参阅 another answer。
答9:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
你可以试试……
gitk
我知道它不是一个纯粹的命令行选项,但如果你安装了它并且在一个 GUI 系统上,这是一个很好的方式来准确地看到你在寻找什么以及更多。
(实际上我有点惊讶到目前为止没有人提到它。)
gitk --all 查看所有分支。
tig 是 ncurses 替代方案。
@justin-ohms gitk 太棒了!从来不知道这存在!方便在漂亮的 UI 中浏览更改。
@ray tig 在“仅限终端”的情况下最有用 - 您无法访问桌面 GUI。第一次了解它!有趣:tig 是 git 的倒数!
答10:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
git branch -v 将针对每个本地分支显示它是否“领先”。
是的,如果分支 devel 上存在未推送的提交,则相应的行将是 * devel 8a12fc0 [ahead 1] commit msg(* 将仅在与签出分支对应的行上)。 ahead 1 表示“提前一个提交”,即有一个未推送的提交。
不是git branch -vv吗?参照。 docs:“如果给出两次,也打印上游分支的名称(另见 git remote show )。”
这不是要打印上游分支的名称,而是要为每个本地分支打印 behind 和/或 ahead,这足以解决 OP 的问题(检测未推送的提交)。 git branch -v 就足够了,刚刚用 Git 2.16.2 再次测试 :)
-vv 很有用,因为它显示了与远程同步的分支和根本未推送的分支之间的差异。 (只有一个 -v,它们在显示中的显示相同。)
答11:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
我使用以下别名仅获取已提交但尚未推送的文件列表(和状态)(对于当前分支)
git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
然后做:
git unpushed
看起来很有趣,但在我的情况下 $(git name-rev --name-only HEAD) 是“未定义的”
我不得不将 diff 更改为 git diff,因为它默认使用 diff (GNU diffutils) 3.7
您可以改用“FETCH_HEAD”参考: git config --global alias.unpushed "log FETCH_HEAD..HEAD"
原文链接:https://www.huntsbot.com/qa/PdVn/viewing-unpushed-git-commits?lang=zh_CN&from=csdn
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
版权归原作者 HuntsBot 所有, 如有侵权,请联系我们删除。