是否有某种“git rebase --dry-run”,可以提前通知我冲突?

问题描述 投票:0回答:6

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

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

git git-rebase git-merge-conflict
6个回答
74
投票

在撰写本文时(Git v2.6.1 v2.10.0),

git rebase
命令不提供
--dry-run
选项。在实际尝试变基之前,无法知道是否会遇到冲突。

但是,如果您运行

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

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

如果变基成功但你意识到你想撤消它,你可以运行

git reset --hard @{1}

50
投票

如果您只是想看看变基是否会成功,但又想“回滚”,您始终可以将分支尖端重新定位到原始提交。只需标记或记下原创 SHA。

或者也许更简单,创建一个新的临时分支来“暂存”变基:

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

如果成功但您想“回滚”,则

your-branch
保持不变。只需
git branch -D tmp
,您就回到了起点。

如果存在冲突,并且您做了一些工作来解决它们,并且您现在想要保留变基,只需将您的分支尖端重新定位到

tmp
(然后
git branch -D tmp
)。


9
投票

我怀疑

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

当您执行

git rebase
时,git将回滚到起点,然后为每个提交增量应用补丁以使分支保持最新。如果遇到冲突,它将停止并等待您解决冲突,然后再继续。冲突后变基所采取的路径取决于您解决冲突的方式 - 如果您以某种方式解决它,可能会引入(或消除)以后的冲突。

因此,

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

我能想到的唯一方法是通过当前位置和要变基到的分支中的最后一次提交之间的

git diff
。但这并不能真正为您提供所需的内容 - 您实际上只需要两点之间“冲突”更改的列表。 可能有一种方法可以用git diff来做到这一点,但这不是一个普通的补丁。
    


5
投票
master

,并且您不喜欢它:


    git reflog -20
  1. - 为您提供头部的最后 20 个位置以及一些描述
  2. git checkout <the_branch_name>
  3. - 将你的头放在树枝上
  4. git reset --hard <old_sha1_found_in_reflog>
  5. - 将你的 HEAD 和分支放在旧的引用上,这样你就可以恢复旧的分支。
    
    
    
  6. 这里有一些机制需要理解:

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

之后不会丢失任何内容,您只需要知道如何找到并恢复它即可。


例如,您可以在

rebase

之前放置一个标签,而不是恢复或删除它。它避开了您所有的 SHA1 研究步骤。

    


5
投票
@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



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.