我正在尝试编写rebase脚本,我的脚本将采用不同的路径,具体取决于rebase是否会导致任何冲突。
在执行rebase之前,有没有办法确定rebase是否会导致冲突?
答案 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
的变形,你不喜欢它:
git reflog -20
- 为您提供HEAD的最后20个位置,并附上一些描述git checkout <the_branch_name>
- 将您的HEAD放在分支上git reset --hard <old_sha1_found_in_reflog>
- 将您的HEAD和分支放在旧参考号上,这样您就可以恢复旧分支。这里有一些机制可以理解:
rebase
及其他关于HEAD操作的所有历史记录都写在reflog
@{N}
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