gpt4 book ai didi

git - 在没有交互式 rebase 的情况下压缩历史中间的两个 Git 提交

转载 作者:IT王子 更新时间:2023-10-29 00:47:41 25 4
gpt4 key购买 nike

我正在将旧的 SVN 存储库转换为 Git,其中包括尝试在所有正确的位置获取所有分支/标签。那部分进展顺利,但有时我想在我的脚本中添加一个历史提交,稍后我想在下一次提交时压缩。问题是我不是一个一个地抓取提交,而是作为一个大组抓取,所以我无法在将它们从 SVN 存储库中 pull 出时压缩它们。最后,我的存储库如下所示:

* (branch_2, HEAD) commit 5
* commit 4
* commit 3
* SQUASH ME!
* (branch_1) commit 2
* commit 1

我希望能够使用 SQUASH ME! 压缩 commit 3,这对于交互式 rebase 来说显然很容易,但在脚本中更具挑战性。我似乎遇到的主要问题是,虽然很容易 checkout branch_1 或它之前的任何提交,但很难以编程方式请求 after 提交,这对我来说很难预测我需要从 branch_2 返回多少次提交。我真的很想能够做这样的事情:

git checkout branch_1+2

有什么建议吗?

最佳答案

您所说的不是squash,而是fixup,因为squash 会交互地询问您提交消息,而fixup 使用来自 HEAD 提交的提交消息

这是一个无需干预即可执行此操作的脚本。

脚本:/usr/bin/git-fixup

#/bin/bash
# This command fixesup one commit onto his parent
set -e

# We need a commit from the first argument of that command
commit=${1:?No commit given as first argument}
startingbranch=$(git rev-parse --abbrev-ref HEAD)

# Checkout the parent of the asked commit
git checkout "$commit"
git checkout HEAD~

# Merge the commit into it's parent, keeping the commit message of the parent
git merge --squash "$commit"
git add .
git add --update
git commit --amend --no-edit

# Store the current commit
newcommit=$(git rev-parse HEAD)

# Rebase the starting branch onto the new commit
git checkout "$startingbranch"
git rebase "$newcommit"

使用它

git fixup <commit-id>

例如,如果您的历史是:

ce0e2fd (master, HEAD) commit 4
72ab3c4 commit 3
8150939 commit 2
301c1e1 commit 1

您可以执行 git fixup 72ab3c4,它将“commit 3”和“commit 2” merge 为一个带有消息“commit 2”的提交,并将您放回主分支。

关于git - 在没有交互式 rebase 的情况下压缩历史中间的两个 Git 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32889329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com