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


75

我正在尝试对脚本进行脚本重定,并且脚本将采用不同的路径,具体取决于重设是否导致任何冲突。

有没有一种方法可以确定在执行重定基之前,重定基是否会导致冲突?


git rebase您使用的命令的确切形式是什么?您是否在使用任何可选标志?您正在使用哪种脚本语言?贝壳?
jub0bs 2015年

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

1
您找到了一种方法吗?
crmpicco

1
@crmpicco我基本上按照Jubobs的建议进行了工作,着手进行变基,检查冲突并在需要时中止操作。我希望有一种更优雅的方式……
Jonathan.Brink

2
对于混乱的基准,我经常创建一个新分支,并首先在该分支上进行试用。如果一切顺利,则试运行将成为基础,否则,只需切换回原始分支即可。
jordanpg

Answers:


50

在撰写本文时(Git v2.6.1v2.10.0),该git rebase命令不提供任何--dry-run选项。在实际尝试重新设置基准之前,无法知道是否会遇到冲突。

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

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

10
如果重新设置成功,但是我意识到我想回去怎么办?例如,因为我不想强行推动。
bluenote10

2
@ bluenote10您可以使用分支的reflog将其重置为用于指向基准的提交。
jub0bs

2
@ bluenote10或者,如果您知道无论如何都将放弃重新设置结果,则可以从一个分离的头开始:git checkout --detach foo
渗透者

1
您还可以使用git reset --hard ORIG_HEAD将分支移回到重新设置基准之前的位置。
Jacob Errington

38

如果您只想查看重新建立基准是否成功,但又想“回滚” ,则可以始终将分支提示重新定位为原始提交。只需标记或记下原始SHA。

也许更简单,创建一个新的临时分支以在其中“暂存”该基础:

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

如果成功但是您想要“回滚”,your-branch则保持不变。公正git branch -D tmp,您又回到了起点。

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


11
一个命令代替前两个命令:git checkout -b tmp your-branch
ruvim

7

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

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

因此,git rebase ... --dry-run只能给您第一个冲突-以后冲突的报告将取决于如何解决第一个冲突。

我能想到的唯一方法是git diff在当前位置和要重新定位到的分支中的最后一次提交之间。但这并不能真正满足您的需求-您实际上只需要列出两点之间相互矛盾的更改列表。有可能是一个办法做到这一点的git diff,但它不是一个正常的补丁。


5

您仍然可以做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和分支放在旧的ref上,这样您就可以恢复旧的分支。

这里有一些要理解的机制:

  1. 无论如何,您绝不会删除git中的任何内容,而不是使用命令。它通过并删除未引用分支的垃圾收集器(默认为3个月)。因此,在重新设置基准之前,您的分支仍然存在。
  2. 在相同的分支基础上也是如此,只是在老树旁边重写了一棵新树。
  3. rebase和您其他有关HEAD操作的历史记录都写在reflog
  4. 您可以使用@{N}来自的注释reflog

因此,在之后rebase,您什么都不会丢失,您只需要知道如何查找和恢复它即可。

例如,您可以将自己放置在标签之前,然后将rebase其还原或删除。它可以避免您进行SHA1研究的所有步骤。


2

建立在@joneit的解决方案上:

temp从创建一个新分支,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.