我想以编程方式确定,如果我尝试变基,我的功能分支将有变基冲突。 有没有办法让 git 告诉我这些信息,而无需实际执行变基?
如果做不到这一点,在git rebase --abort
变基之前检测变基是否失败的最简单方法是什么?
我的问题与这两个类似,它们是相同的,但用于合并而不是变基
git 可以告诉我合并是否会在没有实际合并的情况下发生冲突吗?
是否有 git-merge --dry-run 选项?
有没有办法让 git 在不实际执行变基的情况下告诉我这些信息?
简短的回答是"不"。 长答案更长,但以"不"结尾:-(...你可以通过编写大量代码来接近,但要获得完整的正确答案,你必须完成变基的所有提交复制步骤,此时你不妨运行变基。
如果做不到这一点,在
git rebase --abort
变基之前检测变基是否失败的最简单方法是什么?
如果变基成功完成,则git rebase
命令返回成功(零(退出代码,如果未成功完成,则返回失败(非零(退出代码。 在 shell 脚本中,您可以只使用git rebase $args || git rebase --abort
.
根据 SVSchmidt 的回答,即使成功,您也可以扩展他的第一个命令以恢复:
git rebase master && (echo "Success" && git reset --hard ORIG_HEAD) || (echo "Fail" && git rebase --abort)
这仍将运行变基,但是在成功的情况下,将您的HEAD
重置回变基之前的旧HEAD
。生成的提交和 reflog 的更改将保留,仅重置分支的引用。
您可能希望为命令的输出添加重定向以避免不必要的输出。这样做时,请记住,变基可能会由于合并冲突以外的其他情况而失败,例如工作目录中的未暂存更改。
如果做不到这一点,在 git 变基之前检测变基失败的最简单方法是什么 - 中止它?
git rebase
失败时返回虚假状态,因此您可以执行以下操作:
git rebase feature && echo "Success" || echo "fail" && git rebase --abort
但是,这将在成功时执行实际的变基。 如果你想测试一个变基是否会成功而不实际执行它,恐怕我唯一的想法是签出另一个分支,检查变基是否成功并切换回来,例如:
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,执行变基,签出原始分支并删除测试分支,然后再回显结果。Hacky,但根据您的用例,这可能会起作用。
最接近变基的"试运行"是从分离的 HEAD 状态运行变基(因此实际上没有修改任何引用(。 所以而不是
git rebase develop feature_X
你可能会这样做
git rebase develop `git rev-parse feature_x`
并检查退出状态。 这种方法的问题是:
1(这很耗时。 基本上对于任何不冲突的分支,整个变基都会运行。 (而且很难想象你怎么能做更少的工作,同时仍然准确地知道变基是否会成功。
2(它创建冗余对象(悬空提交及其依赖项(,这些对象将不可见,但仍然会占用本地存储库中的空间,直到您将悬空提交从引用日志中剔除并运行gc
,或创建一个新的克隆。 如果你经常这样做,浪费的空间真的会加起来。
我也不确定这有多大的用处。 仅仅因为feature_X
和feature_Y
各自会干净地重定基develop
,并不意味着"变基featureX
然后变基featureY
"的顺序一定会干净地完成。 虽然看起来不应该是这样,但在我最近看到的一些事情之后,我不会感到震惊,因为一些边缘情况是变基顺序决定了是否存在冲突。
所以充其量你会得到"唾手可得的果实"——"我知道这些有冲突"。 但是,嘿,你知道,如果这是你需要的代码,那么这就是你需要的代码。
您可以使用自定义的预变基钩子在变基开始之前执行所需的任何检查。这里有一个示例预变基钩子:https://github.com/git/git/blob/master/templates/hooks--pre-rebase.sample
在变基前的钩子代码中,您可以比较更改的文件并检查冲突并停止变基。