我来自Subversion背景,当我有一个分支时,我知道我正在处理的是"这些工作文件指向这个分支".
但是对于Git,我不确定我何时在NetBeans或Notepad ++中编辑文件,无论它是与主服务器还是其他分支相关联.
git在bash中没有问题,它告诉我我在做什么.
我使用提交消息"Build 0051"检查了一些源代码到GIT中.
但是,我似乎无法再找到源代码 - 如何使用命令行从GIT存储库中提取此源代码?
更新
更新
源代码肯定存在,现在需要检查它:
C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date: Fri Aug 19 17:24:51 2011 +0100
20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.
C:\Source>
Run Code Online (Sandbox Code Playgroud)
更新
使用以下内容检索丢失的源代码:
C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: …Run Code Online (Sandbox Code Playgroud) 来自mercurial,我使用分支来组织功能.当然,我也想在我的历史中看到这种工作流程.
我使用git开始了我的新项目并完成了我的第一个功能.合并该功能时,我意识到git使用快进,即如果可能,它会将我的更改直接应用到主分支并忘记我的分支.
因此,思考未来:我是唯一一个从事这个项目的人.如果我使用git的默认方法(快进合并),我的历史将导致一个巨大的主分支.没有人知道我为每个功能使用了一个单独的分支,因为最后我只有那个巨大的主分支.这看起来不专业吗?
通过这种推理,我不想要快进合并,也不知道为什么它是默认的.这有什么好处的?
假设我有以下本地存储库,其中包含如下提交树:
master --> a
\
\
develop c --> d
\
\
feature f --> g --> h
Run Code Online (Sandbox Code Playgroud)
master是我的这是最新的稳定版本代码,develop是我的这个'下一个'版本代码,feature是一个正在准备的新功能develop.
我希望能够使用钩子在我的远程仓库上做什么,feature除非提交f是developHEAD 的直接后代,否则推送被拒绝.即提交树看起来像这样,因为功能已经git rebase打开d.
master --> a
\
\
develop c --> d
\
\
feature f --> g --> h
Run Code Online (Sandbox Code Playgroud)
那么有可能:
feature?f是后代的?从那里我将检查父分支的HEAD是什么,并查看f前任是否与父分支HEAD匹配,以确定该特征是否需要重新定位.
我想列出仅属于特定分支的所有提交.
通过以下内容,它列出了分支中的所有提交,但也列出了父(主)的提交
git log mybranch
Run Code Online (Sandbox Code Playgroud)
我找到的另一个选项是排除master可以访问的提交并给我我想要的东西,但我想避免需要知道其他分支名称.
git log mybranch --not master
Run Code Online (Sandbox Code Playgroud)
我试图使用git for-each-ref,但它也列出了mybranch所以实际上它排除了所有:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Run Code Online (Sandbox Code Playgroud)
更新:
我正在测试我刚才发现的一个新选项,直到现在看来这可能是我想要的:
git log --walk-reflogs mybranch
Run Code Online (Sandbox Code Playgroud)
更新(2013-02-13T15:08):
--walk-reflogs选项很好,但我检查了reflogs是否到期(默认为90天,gc.reflogExpire).
我想我找到了我想要的答案:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Run Code Online (Sandbox Code Playgroud)
我只是从可用分支列表中删除当前分支,并使用该列表从日志中排除.这样我只能获得mybranch才能达到的提交.
想象一下以下历史:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
Run Code Online (Sandbox Code Playgroud)
如何将提交"c"合并到主服务器中(即查找合并提交"h")?
我正在尝试做的是版本检查.我想确保代码保持在最低版本之上.所以我需要一种方法来知道当前分支是否包含指定的提交.
我想查看ID提交.例如,我想知道为该ID提交的代码,例如:
git log <commit_id>
Run Code Online (Sandbox Code Playgroud)
这将显示与此ID对应的已提交代码和提交消息.
假装我从我的主分支分支到主题分支,然后我在我的主题分支上做了一些提交.是否有一个命令告诉我主分支上的提交哈希来自我的主题分支?
理想情况下,我不必知道我做了多少次提交(试图避免使用HEAD ^ 5).
我用谷歌搜索过,似乎无法找到答案.谢谢!
我回到了一个旧的项目,我跑了很好的git status去弄清楚发生了什么,我注意到了太多的分支!我想在开始再次工作之前做一些家务,但我不确定哪个分支来自哪个..
EG"branchA"是否来源于"发展"?"branchB"是否来自"master"或"branchA"?
我如何回答上面的示例问题?