在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/