在Weblate中,我们有时会创建合并提交,最终将其推送到上游存储库。我希望它们以不同的顺序构造父提交,这样GitHub这样的工具会在显示合并提交时显示Weblate更改而不是上游存储库中的更改(它们总是将第一个父级视为当前分支,将第二个父级视为合并提交)。
您可以看到示例here - 这几乎是git diff 4a4f5aaa8...bb81599ac
,而我希望获得git diff bb81599ac...4a4f5aaa8
。所以我需要的是在合并提交中有不同的父提交顺序。
目前的工作原理:
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
),我们可以创建临时分支,在那里进行合并并合并:
# 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
这样,合并提交将以我想要的方式构建,但是这似乎是非常复杂的方式。是否有更简单的方法来实现相同的目标?
答案 0 :(得分:5)
您的方法可能是最好的,最不容易出错,因为它只使用瓷器命令。你的另一个选择是使用一些管道,这将需要一些哈希杂耍。
在没有提交的情况下合并,使用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>
这种方法应该没有太多困难可以编写脚本。