git rebase - 将原始提交哈希添加到提交消息中
git rebase - add original commit hash to commit messages
有什么方法可以在 rebase 中做与 cherry-pick -x
相同的事情(将原始提交的哈希添加到复制的提交的消息中)?
我目前可以通过替换以下内容来解决这个问题
git checkout other-branch
git rebase master
git checkout master
git merge other-branch
与
git checkout master
....
git cherry-pick -x other-branch^^^^
git cherry-pick -x other-branch^^^
git cherry-pick -x other-branch^^
git cherry-pick -x other-branch^
git cherry-pick -x other-branch
所以,这是我的解决方案:
git rebase <branch> \
-ix "git rev-parse --short HEAD > tmp && \
echo 'from: $<branch_shortid>' > tmp && \
git commit --amend -F tmp"
确保 branch_shortid
是正确的并且是在您希望变基内容 from.
的 b运行ch 上生成的
免责声明:我不确定这是否适用于 所有 情况,特别是如果您有一些 st运行ge 或复杂的参考系统。我 运行 这是一个非常简单的 git 回购生成的:
$ git init
$ echo "a" > a.txt && git add . && git commit -m "first commit"
$ git checkout -b "feature1"
$ echo "b" > b.txt && git add . && git commit -m "second commit"
$ echo "c" > c.txt && git add . && git commit -m "third commit"
$ feature1id=$(git rev-parse --short HEAD)
$ git checkout master
$ git rebase feature1 \
-ix "git rev-parse --short HEAD > tmp && \
echo 'from: $feature1_id' > tmp && \
git commit --amend -F tmp"
这是相应的输出:
讨论:
如前所述,我认为您使用 git reflog
是一个更好的解决方案,用于调查从哪个提交中将 b运行ch 合并到所需的提交中。
rebase 的要点是将提交应用到另一个 b运行ch 的顶部,就好像那首先是提交结构一样:
Rebasing produces a linear history.
它不是很漂亮,但它完成了工作;
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
脚本的每一部分;
- 将我们刚刚完成的commit message放入
tmp
;
- 获取我们刚刚从
.git/rebase-merge/done
重新定位的提交的哈希并将其附加到 tmp
.
- 修改我们刚刚使用
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,您可以自己轻松构建其选择列表,并使用您想要的任何选项进行 cherrypicks:
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}
}
按照您使用 git rebase master
的方式使用 batchxpickto master
。
真的,我更喜欢,但这是另一种选择,它的策略可能更有用。
在 的基础上,我最终得到了一个如下所示的脚本
#! /usr/bin/env bash
set -e
if [[ "$@" != "" ]];
then
git rebase $@ --exec="[=10=]"
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^^^^
它会把当前的哈希值放在所有提交中(并更改过程中的所有哈希值)。
有什么方法可以在 rebase 中做与 cherry-pick -x
相同的事情(将原始提交的哈希添加到复制的提交的消息中)?
我目前可以通过替换以下内容来解决这个问题
git checkout other-branch
git rebase master
git checkout master
git merge other-branch
与
git checkout master
....
git cherry-pick -x other-branch^^^^
git cherry-pick -x other-branch^^^
git cherry-pick -x other-branch^^
git cherry-pick -x other-branch^
git cherry-pick -x other-branch
所以,这是我的解决方案:
git rebase <branch> \
-ix "git rev-parse --short HEAD > tmp && \
echo 'from: $<branch_shortid>' > tmp && \
git commit --amend -F tmp"
确保 branch_shortid
是正确的并且是在您希望变基内容 from.
免责声明:我不确定这是否适用于 所有 情况,特别是如果您有一些 st运行ge 或复杂的参考系统。我 运行 这是一个非常简单的 git 回购生成的:
$ git init
$ echo "a" > a.txt && git add . && git commit -m "first commit"
$ git checkout -b "feature1"
$ echo "b" > b.txt && git add . && git commit -m "second commit"
$ echo "c" > c.txt && git add . && git commit -m "third commit"
$ feature1id=$(git rev-parse --short HEAD)
$ git checkout master
$ git rebase feature1 \
-ix "git rev-parse --short HEAD > tmp && \
echo 'from: $feature1_id' > tmp && \
git commit --amend -F tmp"
这是相应的输出:
讨论:
如前所述,我认为您使用 git reflog
是一个更好的解决方案,用于调查从哪个提交中将 b运行ch 合并到所需的提交中。
rebase 的要点是将提交应用到另一个 b运行ch 的顶部,就好像那首先是提交结构一样:
Rebasing produces a linear history.
它不是很漂亮,但它完成了工作;
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
脚本的每一部分;
- 将我们刚刚完成的commit message放入
tmp
; - 获取我们刚刚从
.git/rebase-merge/done
重新定位的提交的哈希并将其附加到tmp
. - 修改我们刚刚使用
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,您可以自己轻松构建其选择列表,并使用您想要的任何选项进行 cherrypicks:
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}
}
按照您使用 git rebase master
的方式使用 batchxpickto master
。
真的,我更喜欢
在
#! /usr/bin/env bash
set -e
if [[ "$@" != "" ]];
then
git rebase $@ --exec="[=10=]"
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^^^^
它会把当前的哈希值放在所有提交中(并更改过程中的所有哈希值)。