我在写一个脚本,使一些琐碎的修改,然后提交他们的git。因为这些都是微不足道的变化,我想这样做git commit --amend每当我可以逃脱它 - 具体地说,当修改不会“陷入困境”的任何其他分支的历史。如果修改将陷入困境的另一个分支,我希望做一个标准,而不是git commit

例如,如果我的树枝看起来像这样(在GIT中GUI一拉“可视化的所有分支历史”):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

和我跑在主分支这个剧本,然后我不想做一个修正,因为我会被替换实验分支的历史的一部分。从技术上讲,这实际上不会打破任何东西 - 原来的承诺仍然是实验性的历史的一部分,仍然会引用这样就不会被回收 - 但有近,但并非十分完全相同的提交两个不同的分支,让生活困难时,我以后要变基或合并,所以这是一个情况下,我想避免的。

我怎样才能让我的脚本会自动检测是否提交有什么从中支?

如果简化假设的帮助,我总是在主人的头运行此脚本,我只使用git作为本地资源库 - 我不推或拉任何地方更改

本脚本是用Ruby,所以我可以掏出来git的命令行,或者我可以用git的Ruby绑定 - 无论将使这个任务更容易

有帮助吗?

解决方案

只要运行了git branch --contains HEAD得到的支链“包含”列表这次提交。如果该列表是空的,提交应该是ammending安全。您可能还需要包括-a标志列表本地和远程分支机构。

此外,也可以比较git rev-parse HEADgit merge-base HEAD other-branch输出。如果这些承诺的ID相同,则当前提交在其他分支的提交历史。

其他提示

在提交图是单向的:给出一个承诺,你就知道它的所有祖先,但没有任何孩子。你必须在端点和原路返回,直到你得到的承诺(或多个)来启动你想要的。

使用git rev-list [some commit] --children(HEAD是默认值):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

在左侧列中相反的时间顺序提交SHA-1的列表。什么是承诺的权利是儿童(--children)认为提交。顶部提交是HEAD,因此具有没有孩子

因此,如果你用grep你SHA-1在此列表中,它有什么权利的,它至少有一个孩子:

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

在上面的例子中,提交6910...有一个孩子,ef8a...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top