如果我尝试重新绑定它们,我想以编程方式确定我的功能分支会有rebase冲突。有没有办法让git在没有实际执行rebase的情况下告诉我这些信息?
如果做错了,在git rebase --abort
之前检测rebase是否失败的最简单方法是什么?
我的问题类似于这两个,它们是相同的,但是用于合并而不是rebase
答案 0 :(得分:8)
有没有办法让git在没有实际执行rebase的情况下告诉我这些信息?
简短的回答是" no"。答案较长,但以#34; no"结束。 :-) ...你可以通过编写大量代码来获得相当接近但是为了获得完整正确的答案,你必须完成rebase的所有提交复制步骤,此时你也可以运行rebase。 / p>
如果做错了,在
git rebase --abort
之前检测rebase是否失败的最简单方法是什么?
如果rebase成功完成,git rebase
命令将返回成功(零)退出代码,如果不成功,则返回失败(非零)退出代码。在shell脚本中,您只需使用git rebase $args || git rebase --abort
。
答案 1 :(得分:2)
如果失败了,在git rebase之前检测rebase是否失败的最简单方法是什么? -
git rebase
在失败时返回虚假状态,因此您可以执行类似
git rebase feature && echo "Success" || echo "fail" && git rebase --abort
然而,这将在成功时执行实际的rebase。 如果你想测试,如果一个rebase 成功而没有实际执行它,我恐怕我唯一的想法就是检查另一个分支,检查rebase是否成功,切换回来,例如:
branch=$(git branch | grep '* .*' | sed s/..//); git checkout -b $branch-rebase > /dev/null ; git rebase test-2 > /dev/null && result="Success" || result="fail" ; git rebase --abort ; git checkout $branch ; git branch -D $branch-rebase ; echo $result
我首先记得变量中的当前分支(如果有人有更好的解决方案来确定当前分支,请告诉我),切换到 branchname-rebase ,执行rebase,checkout原始在我回显结果之前分支并删除测试分支。 Hacky,但根据你的用例,这可能有用。
答案 2 :(得分:1)
与rebase的“干运行”最接近的是从分离的HEAD状态运行rebase(因此实际上没有修改ref)。而不是
git rebase develop feature_X
你可以做
git rebase develop `git rev-parse feature_x`
并检查退出状态。这种方法的问题是:
1)这很费时间。基本上对于不冲突的任何分支,整个rebase将运行。 (并且很难想象你如何能够做更少的工作,并且仍然准确地知道反转是否会成功。)
2)它会创建冗余对象(悬挂提交及其依赖关系),这些对象不会可见,但仍然会占用本地仓库中的空间,直到你敲出悬空提交reflog并运行gc
,或者创建一个新的克隆。如果你经常这样做,浪费的空间可能会加起来。
我也不确定这有多大用处。只是因为feature_X
和feature_Y
每个人都干净利落地develop
,并不意味着“rebase featureX
然后rebase featureY
”的序列必然会完成干净。虽然看起来似乎并非如此,但在我最近看到的一些事情之后,我不会感到震惊地了解到一些边缘情况,即rebase的顺序决定是否存在冲突。
所以充其量你会得到“低悬的果实” - “我知道这些事情存在冲突”。但是,嘿,你知道,如果这是你需要的代码,那就是你需要的代码。
答案 3 :(得分:1)
基于answer of SVSchmidt,你可以扩展他的第一个命令,即使在成功的情况下还原:
git rebase master && (echo "Success" && git reset --hard ORIG_HEAD) || (echo "Fail" && git rebase --abort)
这仍将运行rebase,但是在成功的情况下,将HEAD
重置为rebase之前的旧HEAD
。生成的提交和reflog的更改将保留,只有您的分支的引用被重置。
您可能希望为命令输出添加重定向,以避免不必要的输出。这样做时请记住,由于除合并冲突之外的其他情况,rebase可能会失败,例如工作目录中的非分段更改。
答案 4 :(得分:0)
您可以使用自定义pre-rebase挂钩在rebase开始之前进行所需的任何检查。这里有一个示例pre-rebase钩子:https://github.com/git/git/blob/master/templates/hooks--pre-rebase.sample
在pre-rebase钩子代码中,您可以区分已更改的文件并检查冲突并停止rebase。