是否存在某种“git rebase --dry-run”,它会提前通知我冲突?

时间:2015-04-08 14:23:44

标签: git git-rebase git-merge-conflict

我正在尝试编写rebase脚本,我的脚本将采用不同的路径,具体取决于rebase是否会导致任何冲突。

在执行rebase之前,有没有办法确定rebase是否会导致冲突?

5 个答案:

答案 0 :(得分:36)

在撰写本文时(Git v2.6.1 v2.10.0),git rebase命令不提供--dry-run选项。在实际尝试改变之前,无法知道你是否会遇到冲突。

但是,如果您运行git rebase并遇到冲突,则该过程将停止并以非零状态退出。您可以做的是检查rebase操作的退出状态,如果它不为零,则运行git rebase --abort取消rebase:

git rebase ... || git rebase --abort

答案 1 :(得分:19)

如果你只想查看rebase 是否成功但是你想“回滚”,你可以一直reposition the branch tip回到原来的提交。< / strong>只需标记或记下原始SHA。

或者更简单一点,创建一个新的临时分支,在其中“分级”rebase:

git checkout your-branch
git checkout -b tmp
git rebase other-branch

如果成功但您想“回滚”,则your-branch不会受到影响。只需git branch -D tmp,您就会回到原点。

如果存在冲突并且您已经做了一些工作来解决它们,而现在您想要保留变基,只需将您的分支提示重新定位到tmp(然后git branch -D tmp)。

答案 2 :(得分:6)

我怀疑git rebase ... --dry-run是不可能的,原因如下。

当您执行git rebase时,git将回滚到起点,然后逐步应用每个提交的补丁以使分支更新。如果它遇到冲突,它将停止并且在继续之前等待您解决冲突。冲突后冲突的路径取决于您如何解决冲突 - 如果您以某种方式解决冲突,可能会引入(或消除)以后的冲突。

因此,git rebase ... --dry-run只能为您提供第一次冲突 - 后续冲突的报告将取决于第一次冲突的解决方式。

我能想到这样做的唯一方法是在当前位置和您重新定位的分支中的最后一次提交之间通过git diff。但这并没有真正给你你想要的东西 - 你真的需要一个两点之间冲突变化的清单。 可能git diff的一种方式,但它不是正常的补丁。

答案 3 :(得分:4)

您仍然可以执行git rebase,随意使用它,而不是恢复之前的所有更改。 假设你已经完成了某些分支到master的变形,你不喜欢它:

  1. git reflog -20 - 为您提供HEAD的最后20个位置,并附上一些描述
  2. git checkout <the_branch_name> - 将您的HEAD放在分支上
  3. git reset --hard <old_sha1_found_in_reflog> - 将您的HEAD和分支放在旧参考号上,这样您就可以恢复旧分支。
  4. 这里有一些机制可以理解:

    1. 你永远不会删除git中的任何内容,而不是删除命令。它是通过垃圾收集器并删除未引用的分支(默认为3个月)。所以你的分支,从变基之前,仍然存在。
    2. 同样的分支rebase也是如此,它只是在旧的树旁边重写的一棵新树。
    3. rebase及其他关于HEAD操作的所有历史记录都写在reflog
    4. 您可以使用@{N}
    5. 中的reflog注释

      所以,在rebase之后没有任何遗失,你只需要知道如何找到并恢复它。

      例如,您可以在rebase之前为自己设置一个标记,而不是恢复它或删除它。它避开了你所有的SHA1研究步骤。

答案 4 :(得分:2)

@joneit的解决方案为基础:

temp创建一个新的your-branch分支,然后尝试将该临时分支重新建立到new-base上:

git checkout -b temp <your-branch> && git rebase <new-base>

例如测试分支feature1是否可以重新设置到master上:

git checkout -b temp feature1 && git rebase master