Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找Git提交来自哪个分支_Git - Fatal编程技术网

查找Git提交来自哪个分支

查找Git提交来自哪个分支,git,Git,在给定哈希值的情况下,有没有办法找出提交来自哪个分支 如果你能告诉我如何使用Ruby Grit来实现这一点,你就可以获得额外的积分。除了搜索所有树直到找到匹配的哈希之外,没有。虽然Dav正确地指出信息没有直接存储,但这并不意味着你永远无法找到。这里有一些你可以做的事情 查找提交所在的分支 查找并提交a871742。请注意,您必须使用commit的缩写7第一位数字。输出应如下所示: a871742 refs/heads/completion@{0}: commit (amend): mpc-com

在给定哈希值的情况下,有没有办法找出提交来自哪个分支


如果你能告诉我如何使用Ruby Grit来实现这一点,你就可以获得额外的积分。

除了搜索所有树直到找到匹配的哈希之外,没有。

虽然Dav正确地指出信息没有直接存储,但这并不意味着你永远无法找到。这里有一些你可以做的事情

查找提交所在的分支 查找并提交a871742。请注意,您必须使用commit的缩写7第一位数字。输出应如下所示:

a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite
表示提交是在分支“完成”上进行的。默认输出显示缩写的提交散列,因此请确保不要搜索完整散列,否则将找不到任何内容

git reflog show
实际上只是
git log-g--abbrev commit--pretty=oneline
的别名,因此,如果您想修改输出格式以使grep可以使用不同的内容,这就是您的出发点

如果您不是在进行提交的存储库中工作,那么在这种情况下,您最好检查reflogs并查找提交首次引入存储库的时间;运气好的话,你拿到了那根树枝。这有点复杂,因为您不能同时遍历提交树和重登录。您可能希望解析reflog输出,检查每个哈希,看看它是否包含所需的提交

查找后续合并提交 这取决于工作流,但对于良好的工作流,在开发分支上进行提交,然后将这些分支合并到中。您可以这样做:

git log --merges <commit>..
git日志--合并。。
查看将给定提交作为祖先的合并提交。(如果提交只合并了一次,那么第一个应该是您要进行的合并;否则,我想您必须检查几个。)合并提交消息应该包含合并的分支名称

如果您希望能够指望这样做,您可能希望使用
--no ff
选项来
git merge
强制创建合并提交,即使在快进情况下也是如此。(不过,不要太急切。如果使用过度,可能会让人感到困惑。)详细阐述这个话题很有帮助。

2013年12月更新:

git what branch
(Perl脚本,见下文)似乎不再维护。 是一种用Python编写的替代方案,对我来说效果非常好

它基于“”

查找何时将提交合并到一个或多个分支中
查找将
commit
引入指定分支的合并提交

具体地说,在
分支
的第一个父历史记录中查找最早的提交,该分支包含作为祖先的
提交


原始答复2010年9月:

就在(回答前16分钟):

:发现提交在哪个分支上,或者它是如何到达命名分支的

这是一个看起来很有趣的例子:

简介

此程序不考虑提交的影响,只考虑合并操作


作为一个实验,我制作了一个post-commit钩子,在提交元数据中存储关于当前签出分支的信息。我还稍微修改了gitk以显示该信息


您可以在这里查看:

穷人的选择是在
头部使用1,搜索提交,然后可视化地从该提交返回,直到看到合并提交。默认合并消息应指定要合并到的分支,位置:)

1 Tig是一个基于ncurses的Git文本模式接口。它的功能 主要作为Git存储库浏览器,但它也可以帮助登台 在块级别提交的更改,并充当从 各种Git命令

git分支--contains
是执行此操作最明显的“瓷器”命令。如果要仅使用“管道”命令执行类似操作:

COMMIT=$(git rev-parse <ref>) # expands hash if needed
for BRANCH in $(git for-each-ref --format "%(refname)" refs/heads); do
  if $(git rev-list $BRANCH | fgrep -q $COMMIT); then
    echo $BRANCH
  fi
done
COMMIT=$(git rev parse)#根据需要扩展散列
对于以美元为单位的分支机构(每个ref的吉特——格式为“%(refname)”ref/heads);做
if$(git rev list$BRANCH | fgrep-q$COMMIT);然后
echo$分行
fi
完成

(crosspost from)

例如,要发现
c0118fa
提交来自
重新设计\u交互

* ccfd449 (HEAD -> develop) Require to return undef if no digits found
*   93dd5ff Merge pull request #4 from KES777/clean_api
|\
| * 39d82d1 Fix tc0118faests for debugging debugger internals
| * ed67179 Move &push_frame out of core
| * 2fd84b5 Do not lose info about call point
| * 3ab09a2 Improve debugger output: Show info about emitted events
| *   a435005 Merge branch 'redesign_interactions' into clean_api
| |\
| | * a06cc29 Code comments
| | * d5d6266 Remove copy/paste code
| | * c0118fa Allow command to choose how continue interaction
| | * 19cb534 Emit &interact event
您应该运行:

git log c0118fa..HEAD --ancestry-path --merges
并向下滚动以查找最后一次合并提交。即:

commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'redesign_interactions' into clean_api
更新

或者只需一个命令:

git log c0118fa..HEAD --ancestry-path --merges --oneline --color | tail -n 1

要查找本地分支机构:

grep -lR YOUR_COMMIT .git/refs/heads | sed 's/.git\/refs\/heads\///g'
要查找远程分支,请执行以下操作:

grep -lR $commit .git/refs/remotes | sed 's/.git\/refs\/remotes\///g'

如果OP试图确定创建特定提交时分支所遍历的历史(“找出提交来自给定SHA-1哈希值的哪个分支”),那么没有reflog,Git对象数据库中就没有任何记录显示哪个命名分支绑定到哪个提交历史

(我将此作为对评论的回复。)

希望这个脚本能说明我的观点:

rm -rf /tmp/r1 /tmp/r2; mkdir /tmp/r1; cd /tmp/r1
git init; git config user.name n; git config user.email e@x.io
git commit -m"empty" --allow-empty; git branch -m b1; git branch b2
git checkout b1; touch f1; git add f1; git commit -m"Add f1"
git checkout b2; touch f2; git add f2; git commit -m"Add f2"
git merge -m"merge branches" b1; git checkout b1; git merge b2
git clone /tmp/r1 /tmp/r2; cd /tmp/r2; git fetch origin b2:b2
set -x;
cd /tmp/r1; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
cd /tmp/r2; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
输出显示,无法知道带有“Add f1”的提交是来自远程克隆/tmp/r2的分支b1还是b2

(此处输出的最后几行)


这个简单的命令就像一个符咒:

git name rev

例如(其中,测试分支是分支名称):

甚至这也适用于复杂的场景,例如:

origin/branchA/
              /branchB
                      /commit<SHA1>
                                   /commit<SHA2>
origin/branchA/
/布兰奇
/承诺
/承诺
这里
git name rev commit
返回branchB

TL;博士: 如果您关心shell退出状态,请使用以下命令:

  • 当前分支机构
    -当前分支机构的名称
  • 分支名称
    -清除分支名称(每行一个)
  • <
    git log c0118fa..HEAD --ancestry-path --merges --oneline --color | tail -n 1
    
    grep -lR YOUR_COMMIT .git/refs/heads | sed 's/.git\/refs\/heads\///g'
    
    grep -lR $commit .git/refs/remotes | sed 's/.git\/refs\/remotes\///g'
    
    rm -rf /tmp/r1 /tmp/r2; mkdir /tmp/r1; cd /tmp/r1
    git init; git config user.name n; git config user.email e@x.io
    git commit -m"empty" --allow-empty; git branch -m b1; git branch b2
    git checkout b1; touch f1; git add f1; git commit -m"Add f1"
    git checkout b2; touch f2; git add f2; git commit -m"Add f2"
    git merge -m"merge branches" b1; git checkout b1; git merge b2
    git clone /tmp/r1 /tmp/r2; cd /tmp/r2; git fetch origin b2:b2
    set -x;
    cd /tmp/r1; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
    cd /tmp/r2; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
    
    + cd /tmp/r1
    + git log --oneline --graph --decorate
    *   f0c707d (HEAD, b2, b1) merge branches
    |\
    | * 086c9ce Add f1
    * | 80c10e5 Add f2
    |/
    * 18feb84 empty
    + git reflog b1
    f0c707d b1@{0}: merge b2: Fast-forward
    086c9ce b1@{1}: commit: Add f1
    18feb84 b1@{2}: Branch: renamed refs/heads/master to refs/heads/b1
    18feb84 b1@{3}: commit (initial): empty
    + git reflog b2
    f0c707d b2@{0}: merge b1: Merge made by the 'recursive' strategy.
    80c10e5 b2@{1}: commit: Add f2
    18feb84 b2@{2}: branch: Created from b1
    + cd /tmp/r2
    + git log --oneline --graph --decorate
    *   f0c707d (HEAD, origin/b2, origin/b1, origin/HEAD, b2, b1) merge branches
    |\
    | * 086c9ce Add f1
    * | 80c10e5 Add f2
    |/
    * 18feb84 empty
    + git reflog b1
    f0c707d b1@{0}: clone: from /tmp/r1
    + git reflog b2
    f0c707d b2@{0}: fetch origin b2:b2: storing head
    
    git name-rev 651ad3a
    251ad3a remotes/origin/test-branch
    
    origin/branchA/
                  /branchB
                          /commit<SHA1>
                                       /commit<SHA2>
    
    branch-current = "symbolic-ref --short HEAD"  # https://stackoverflow.com/a/19585361/5353461
    branch-names = !"[ -z \"$1\" ] && git branch-current 2>/dev/null || git branch --format='%(refname:short)' --contains \"${1:-HEAD}\" #"  # https://stackoverflow.com/a/19585361/5353461
    branch-name = !"br=$(git branch-names \"$1\") && case \"$br\" in *$'\\n'*) printf \"Multiple branches:\\n%s\" \"$br\">&2; exit 1;; esac; echo \"$br\" #"
    
    % git branch-name eae13ea
    master
    % echo $?
    0
    
    % git branch-name 4bc6188
    Multiple branches:
    attempt-extract
    master%
    % echo $?
    1
    
    remote-fetch = !"branch=$(git branch-name \"$1\") && git config branch.\"$branch\".remote || echo origin #"
    
    git rev-parse HEAD | xargs git name-rev
    
    git rev-parse HEAD | xargs git name-rev | cut -d' ' -f2 | sed 's/remotes\/origin\///g'
    
    git pull --all
    
    git name-rev <SHA>
    
    git branch --contains <SHA>
    
    git name-rev --name-only --exclude=tags/* $SHA
    
    git log --branches --source | grep <sha>
    
    #or if you also care about remotes
    git log --branches --remotes --source | grep <sha>