git rebase-添加原始提交哈希以提交消息

git rebase-添加原始提交哈希以提交消息,git,rebase,Git,Rebase,是否有任何方法可以在rebase中执行与cherry pick-x相同的操作(将原始提交的哈希添加到复制提交的消息中) 目前,我可以通过替换以下内容来解决此问题 git checkout other-branch git rebase master git checkout master git merge other-branch 与 因此,以下是我的解决方案: git rebase <branch> \ -ix "git rev-parse --short HEAD

是否有任何方法可以在rebase中执行与cherry pick-x相同的操作(将原始提交的哈希添加到复制提交的消息中)

目前,我可以通过替换以下内容来解决此问题

git checkout other-branch
git rebase master
git checkout master
git merge other-branch


因此,以下是我的解决方案:

git rebase <branch> \
-ix "git rev-parse --short HEAD > tmp &&  \
echo 'from: $<branch_shortid>' > tmp && \
git commit --amend -F tmp"
以下是相应的输出:


讨论: 正如前面所指出的,我认为您使用的是一个更好的解决方案,用于调查从哪个分支上的哪个提交合并到所需的分支上

重定基址的要点是将提交应用到另一个分支的顶部,就好像它最初是提交结构一样:

重定基址会产生一个新的结果


这并不漂亮,但它完成了工作

git rebase --exec='git log --pretty="format:%B" -n 1 > tmp;
    grep -o "\w\{40\}" .git/rebase-merge/done | tail -n 1 >> tmp; 
    git commit --amend -F tmp; 
    rm tmp;' master
解释
--exec
脚本的每个部分

  • 将刚刚完成的提交消息放入
    tmp
  • 抓取我们刚刚从
    .git/rebase merge/done
    重新设置基础的提交的散列,并将其附加到
    tmp
  • Ammend我们刚才使用
    tmp
    作为提交消息进行的提交
  • 删除
    tmp
    文件
我相信你可以把它改成你会喜欢的格式

原作日志

commit 1ebdfc2fd26b0eed9f131197dc3274f6d5048e97
Author: Adam
Date:   Thu Jan 24 16:33:09 2019 +0000

    Content C

commit 632f1a4e1ab5d47c9e4c3ca3abd02a207a5dda09
Author: Adam
Date:   Thu Jan 24 16:33:06 2019 +0000

    Content B

commit a7e0d1eb2e412ec51865ccd405ea513c7677c150
Author: Adam
Date:   Thu Jan 24 16:33:04 2019 +0000

    Content A
重新定基工作日志

commit 79d7ece06185b21631248a13416e5ca5c23e55b2
Author: Adam
Date:   Thu Jan 24 16:33:09 2019 +0000

    Content C
    1ebdfc2fd26b0eed9f131197dc3274f6d5048e97

commit d2fe6267165fa05f5fe489a6321b0b1742d1a74c
Author: Adam
Date:   Thu Jan 24 16:33:06 2019 +0000

    Content B
    632f1a4e1ab5d47c9e4c3ca3abd02a207a5dda09

commit da72fab2008e74f6a8e247f93619943805ebf86e
Author: Adam
Date:   Thu Jan 24 16:33:04 2019 +0000

    Content A
    a7e0d1eb2e412ec51865ccd405ea513c7677c150

如果您只是使用rebase进行批量cherrypick,您可以自己轻松构建其拾取列表,并使用您想要的任何选项进行cherrypick:

batchxpickto() {
        local U=${1-@{u\}}      # given branch or default to configured upstream 
        local B=`git symbolic-ref -q --short HEAD`  # branch name to move if any
        local L=`git cherry $U.. | awk /^+/{print\$2}`  # commits to pick if any
        git checkout $U && ${L:+git cherry-pick -x $L}
        ${B:+git checkout -B $B}
}
使用
batchxpickto master
与使用
git-rebase master
的方式相同

真的,我更喜欢,但这是一个替代方案,它的策略可能更有用。

在此基础上,我最终得到了一个类似这样的脚本

#! /usr/bin/env bash

set -e

if [[ "$@" != "" ]];
then
    git rebase $@ --exec="$0"
    exit 0
fi

HASH="$(grep -o "\w\{40\}" .git/rebase-merge/done | tail -n1)"

git log --pretty="format:%B%n%nwas $HASH" -n1 | git commit --amend -F -

我想避免使用临时文件。我最初是用两个脚本完成的,但后来将它们与这个递归的东西结合成一个脚本,这样就可以很容易地共享它。我已经调用了我的
git record
所以如果你去
git record HEAD^^^^
它会在所有提交中放入当前哈希值(并更改过程中的所有哈希值)。

git rebase master-x不起作用吗?不,这是在每次提交后执行脚本,就像在每次提交后运行测试一样。如果有,那就太好了。另一方面,你为什么要这样做?因为如果你在解决冲突时犯了错误,有时可以查看原始版本是很好的,至少在接下来的几个小时或几天内是这样。你可以不用这样做。在重新设定基准之前,只需做一个分支即可。或者检查reflog。这只是给出旧头的原始提交id,对吗?它不会将每个提交的原始id放在应用它的地方hour@Alex028502您刚刚从:$feature1_id'>tmp中执行了
echo',而没有使用
git rev parse--short HEAD>tmp
。@Alex028502的想法是其中一个是“根”提交,另一个是更动态的“每个”当我尝试完全按照您的方式执行时,我只得到了
exec git rev parse--short HEAD>tmp&&echo:“>tmp&&git commit--amend-F tmp
中的
git rebase todo
我认为该变量不会被导出。但是无论哪种方式,我都不知道它是如何工作的,因为它会把每一个提交消息都放在一起,不管我认为自己在Bash中有多少能力,Git都不理解其中任何一个魔法。
{L:+git
位在做什么?请将我链接到任何bash文档好吗?@Adam
man bash
并查找参数展开,变量名周围的大括号允许对展开进行修改,
:+
说“如果变量已设置且不为空,则展开到以下内容”如果变量未设置或为空,则将
:-
扩展为以下内容,取消
以取消空测试。因此
${1-{u\}
是第一个参数(如果已设置),否则
@{u}
,反斜杠是常用的语法转义;${L:+git cherry pick-x$L}`如果没有cherrypick,则扩展为nothing;依此类推。这不是特定于bash的,这是未得到充分重视的标准内容。很好!我将其转换为可执行文件,以便能够这样编写:
git重新设置某个分支的基础--exec update\u commit\u previous\u hashes\u list
batchxpickto() {
        local U=${1-@{u\}}      # given branch or default to configured upstream 
        local B=`git symbolic-ref -q --short HEAD`  # branch name to move if any
        local L=`git cherry $U.. | awk /^+/{print\$2}`  # commits to pick if any
        git checkout $U && ${L:+git cherry-pick -x $L}
        ${B:+git checkout -B $B}
}
#! /usr/bin/env bash

set -e

if [[ "$@" != "" ]];
then
    git rebase $@ --exec="$0"
    exit 0
fi

HASH="$(grep -o "\w\{40\}" .git/rebase-merge/done | tail -n1)"

git log --pretty="format:%B%n%nwas $HASH" -n1 | git commit --amend -F -