Git:有没有一种方法可以将两个分支的差异结果暂存起来?

4
我有一个主分支和一个功能分支,但是功能分支包含了太多的提交(它是从一个较早的点分支出来的,然后合并和分叉等)。
我想要将我的功能分支与主分支进行差异比较,然后无论有什么变化,我只需将其存储起来。然后我可以创建一个新的分支,并使用git stash pop命令将其应用,这样就能得到一个更清晰的分支日志历史记录。
有没有简单的方法可以做到这一点?
2个回答

4
我理解你的意思是想将你的"wip"分支与"prod"分支进行diff,并将更改内容存储。您可以创建一个新的分支,然后使用"git stash pop"命令来还原它,这样可以获得更干净的分支历史记录。为了达到这个目的,你不需要使用stash。相反,你可以使用"git diff"创建一个补丁(patch),然后使用"git apply"将其应用到新的分支上。
# Make a new wip branch from prod
git checkout -b new-wip prod

# Get the diff between prod and wip
git diff prod wip > wip.patch

# Apply the patch
git apply wip.patch

然后删除旧分支并将新分支重命名。
git branch -D wip
git branch -m new-wip wip

一般来说,当你想要清理历史记录时,使用 rebase。首先,使用 rebase 重写 wip 分支,以便将其所有更改放在 prod 之上。

git checkout wip
git rebase prod

这将平整任何在 wip 中合并或其他历史遗留问题。现在好像你一直在最新版本的 prod 的基础上编写了所有更改。

然后使用“交互式变基”来修改 wip 分支,使其符合您的要求。其中可以包括使用 fixsquash 将多个更改组合成一个。

# Interactively rewrite the changes since prod
git rebase -i prod

这是一种更为通用和优雅的方法来完成你的目标。它允许你更好地控制你的提交和历史记录。你不仅仅需要把所有东西混在一起,而是可以有选择性地进行操作。


2
感谢你写得很好且信息丰富的回答。你的解决方案有效。然而,我发现@eftshift0的答案更容易应用于我所提出的问题。我给了你的回答点赞,但是接受了eftshift0的答案。 - breezymri

2

让我看看,您想从prod开始一个新的分支,该分支包含wip和prod之间的所有更改,并将其作为单个修订提交到prod,忽略wip的详细历史记录?

如果是这样,我会使用reset命令:

git checkout -b new-wip wip # place new wip where old wip is
git reset --soft prod # set branch pointer where prod is

现在,您应该可以进行提交操作,并获得新的分支new-wip,在prod之后只有一个提交,并且其树与old-wip完全相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接