88

我正在尝试编写变基脚本,我的脚本将根据变基是否导致任何冲突而采用不同的路径。

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

4

5 回答 5

60

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

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

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

如果变基成功但您意识到要撤消它怎么办,您可以运行

git reset --hard ORIG_HEAD
于 2015-10-10T13:55:34.010 回答
41

如果您只想查看变基是否成功,但又想“回滚”,则始终可以将分支提示重新定位回原始提交。只需标记或记下原始 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)。

于 2018-01-05T15:40:02.903 回答
7

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

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

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

我能想到的唯一方法是git diff在当前位置和您要重新定位到的分支中的最后一次提交之间。但这并不能真正为您提供所需的内容-您实际上只需要两点之间的冲突更改列表。可能有一种方法可以做到这一点git diff,但这不是一个正常的补丁。

于 2016-01-14T16:32:22.013 回答
5

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

  1. git reflog -20- 为您提供 HEAD 的最后 20 个位置,并附上一些说明
  2. git checkout <the_branch_name>- 把你的头放在树枝上
  3. git reset --hard <old_sha1_found_in_reflog>- 将你的 HEAD 和分支放在旧的 ref 上,这样你就可以恢复旧的分支。

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

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

因此,在 之后不会丢失任何东西rebase,您只需要知道如何找到并恢复它。

例如,您可以在 之前放置一个标签,然后rebase恢复或删除它。它避开了你所有的 SHA1 研究步骤。

于 2016-12-09T13:48:07.177 回答
4

基于@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
于 2020-03-03T19:49:08.280 回答