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

wa7juj8i  于 2022-12-21  发布在  Git
关注(0)|答案(5)|浏览(106)

我正在尝试脚本重定基,我的脚本将采取不同的路径取决于重定基是否导致任何冲突。
在执行变基之前,是否有办法确定变基是否会导致冲突?

to94eoyn

to94eoyn1#

在写这篇文章的时候(Git v2.6.1v2.10.0),git rebase命令没有提供--dry-run选项,在实际尝试变基之前,没有办法知道是否会遇到冲突。
但是,如果运行git rebase时遇到冲突,进程将停止并以非零状态退出,您可以检查rebase操作的退出状态,如果状态为非零,则运行git rebase --abort取消rebase:

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

如果重新定基成功,但您意识到要撤消它,则可以运行

git reset --hard ORIG_HEAD
bttbmeg0

bttbmeg02#

如果你只是想看看改基 * 是否会 * 成功,然后你想“回滚”,**你可以随时reposition the branch tip回到原来的提交。**只需标记或记下原来的SHA。
或者更简单的方法是创建一个新的临时分支来“暂存”重定基:

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

如果它成功了,但是你想“回滚”,your-branch是不变的,只要git branch -D tmp,你就回到了你开始的地方。
如果有冲突,你做了一些工作来解决它们,现在你想保留rebase,只需重新定位你的分支提示到tmp(然后git branch -D tmp)。

lymnna71

lymnna713#

我怀疑git rebase ... --dry-run是不可能的,原因如下。
当你执行git rebase时,git会回滚到起始点,然后为每次提交增量地应用补丁,使分支更新到最新状态。如果遇到冲突,它会停止并等待你解决冲突后再继续执行。冲突后rebase的路径取决于你如何解决冲突--如果你以某种方式解决冲突,这可能引入(或消除)以后的冲突。
因此,git rebase ... --dry-run只能为您提供第一个冲突-后续冲突的报告将取决于第一个冲突是如何解决的。
我能想到的唯一方法是通过git diff在当前位置和你要重定基的分支中的最后一次提交之间。但这并不能真正给予你你要找的东西-你只需要一个两点之间冲突更改的列表。有 * 可能 * 用git diff来做这件事,但它不是一个普通的补丁。

a64a0gku

a64a0gku4#

你仍然可以做git rebase,你想怎么做就怎么做,然后恢复之前的所有修改。假设你已经完成了master中某个分支的rebase,但你不喜欢它:

  1. git reflog -20-给你头的最后20个位置,并有一点描述
  2. git checkout <the_branch_name>-将您的头部放在分支上
  3. git reset --hard <old_sha1_found_in_reflog>-把你的HEAD和分支放在旧的ref上,这样你就可以恢复旧的分支。
    这里有一些需要理解的机制:
    1.在git中,你永远不要删除任何东西,无论如何,不要用命令。垃圾收集器会检查并删除未被引用的分支(默认为3个月)。所以你的分支,在rebase之前,仍然存在。
    1.同样的道理也适用于同一个分支上的基础更新,它只是一个新的树重写旁边的旧的。
  4. rebase和其他关于HEAD操作的所有历史记录都写在reflog
    1.您可以使用reflog中的@{N}注解
    因此,在rebase之后不会丢失任何东西,您只需要知道如何找到并恢复它。
    例如,您可以在rebase之前放置一个标签,然后恢复到它或删除它。它可以避开所有的SHA1研究步骤。
wsxa1bj1

wsxa1bj15#

基于@joneit的解决方案:
your-branch创建一个新的temp分支,并尝试将临时分支重定到new-base上:

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

例如,测试分支feature1是否可以重定基到master上:

git checkout -b temp feature1 && git rebase master

相关问题