git - 在 git 中以相反的父顺序创建 merge 提交

标签 git github merge git-merge

Weblate我们有时会创建最终推送到上游存储库的 merge 提交。我希望它们是用不同顺序的父提交构建的,这样像 GitHub 这样的工具在显示 merge 提交时会显示 Weblate 更改而不是上游存储库中的更改(它们总是将第一个父项视为当前分支,将第二个父项视为 merge 的分支).

你可以看到例子here - 这几乎是 git diff 4a4f5aaa8...bb81599ac,而我想得到 git diff bb81599ac...4a4f5aaa8。所以我需要的是在 merge 提交中有不同顺序的父提交。

目前的运作方式:

git clone https://github.com/WeblateOrg/weblate.git
edit translations
git commit -a -m 'Translated using Weblate'
git remote update origin
git merge orgin/master  
# Now we have merge commit in case there are changes in upstream meanwhile

作为一个明显的解决方法(而不是普通的 git merge orgin/master),我们可以创建临时分支,在那里进行 merge 然后 merge 回来:

# Create local branch for upstream
git branch tmp origin/master
# Checkout upstream branch
git checkout tmp
# Merge current Weblate changes, this can lead to conflict
git merge master
# Checkout branch with Weblate changes
git checkout master
# Merge temporary branch (this is fast forward so does not create merge commit)
git merge tmp
# Delete temporary branch
git branch -d tmp

这样 merge 提交将以我想要的方式构建,但是这样做似乎很复杂。有没有更简单的方法来实现相同的目标?

最佳答案

您的方法可能是最好且最不容易出错的方法,因为它只使用陶瓷命令。您的另一个选择是使用一些管道,这将需要一些散列杂耍。

在没有提交的情况下 merge ,使用 squash 选项覆盖 no-commit 对象,如下所示:

git checkout master
git merge --squash branch

然后使用 git-write-tree 为您的索引创建一个树对象并使用 git-commit-tree 手动制作您的提交:

git write-tree
git commit-tree -p parent1 -p parent2 -m "message" <tree-hash>

这个方法应该是可编写脚本的,没有太多困难。

关于git - 在 git 中以相反的父顺序创建 merge 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48302475/

相关文章:

eclipse - 如何在 Eclipse IDE 中使用 Git 工作树?

git - 如何删除所有文件 "added by them"?

git - 如何在没有冲突的情况下在 git 中 pull 远程分支?

c++ - 使用具有 2 个数组作为参数的合并函数进行合并排序

git - Jenkins :错误:获取远程仓库时出错 'origin'

android-studio - 错误 : Setting VM flags failed: unrecognized flags: disable-dart-dev

git - 如何告诉 GitHub 不要计算外部库中的行数?

git - 除 golang.org 之外的所有源上均出现 "go get"git 错误

python - 根据条件随机组合数据以创建新数据

macos - 如何与 Mercurial merge