我正在尝试脚本重定基,我的脚本将采取不同的路径取决于重定基是否导致任何冲突。在执行变基之前,是否有办法确定变基是否会导致冲突?
to94eoyn1#
在写这篇文章的时候(Git v2.6.1v2.10.0),git rebase命令没有提供--dry-run选项,在实际尝试变基之前,没有办法知道是否会遇到冲突。但是,如果运行git rebase时遇到冲突,进程将停止并以非零状态退出,您可以检查rebase操作的退出状态,如果状态为非零,则运行git rebase --abort取消rebase:
git rebase
--dry-run
git rebase --abort
git rebase ... || git rebase --abort
如果重新定基成功,但您意识到要撤消它,则可以运行
git reset --hard ORIG_HEAD
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)。
your-branch
git branch -D tmp
tmp
lymnna713#
我怀疑git rebase ... --dry-run是不可能的,原因如下。当你执行git rebase时,git会回滚到起始点,然后为每次提交增量地应用补丁,使分支更新到最新状态。如果遇到冲突,它会停止并等待你解决冲突后再继续执行。冲突后rebase的路径取决于你如何解决冲突--如果你以某种方式解决冲突,这可能引入(或消除)以后的冲突。因此,git rebase ... --dry-run只能为您提供第一个冲突-后续冲突的报告将取决于第一个冲突是如何解决的。我能想到的唯一方法是通过git diff在当前位置和你要重定基的分支中的最后一次提交之间。但这并不能真正给予你你要找的东西-你只需要一个两点之间冲突更改的列表。有 * 可能 * 用git diff来做这件事,但它不是一个普通的补丁。
git rebase ... --dry-run
git diff
a64a0gku4#
你仍然可以做git rebase,你想怎么做就怎么做,然后恢复之前的所有修改。假设你已经完成了master中某个分支的rebase,但你不喜欢它:
master
git reflog -20
git checkout <the_branch_name>
git reset --hard <old_sha1_found_in_reflog>
rebase
reflog
@{N}
wsxa1bj15#
基于@joneit的解决方案:从your-branch创建一个新的temp分支,并尝试将临时分支重定到new-base上:
temp
new-base
git checkout -b temp <your-branch> && git rebase <new-base>
例如,测试分支feature1是否可以重定基到master上:
feature1
git checkout -b temp feature1 && git rebase master
5条答案
按热度按时间to94eoyn1#
在写这篇文章的时候(Git v2.6.1v2.10.0),
git rebase
命令没有提供--dry-run
选项,在实际尝试变基之前,没有办法知道是否会遇到冲突。但是,如果运行
git rebase
时遇到冲突,进程将停止并以非零状态退出,您可以检查rebase操作的退出状态,如果状态为非零,则运行git rebase --abort
取消rebase:如果重新定基成功,但您意识到要撤消它,则可以运行
bttbmeg02#
如果你只是想看看改基 * 是否会 * 成功,然后你想“回滚”,**你可以随时reposition the branch tip回到原来的提交。**只需标记或记下原来的SHA。
或者更简单的方法是创建一个新的临时分支来“暂存”重定基:
如果它成功了,但是你想“回滚”,
your-branch
是不变的,只要git branch -D tmp
,你就回到了你开始的地方。如果有冲突,你做了一些工作来解决它们,现在你想保留rebase,只需重新定位你的分支提示到
tmp
(然后git branch -D tmp
)。lymnna713#
我怀疑
git rebase ... --dry-run
是不可能的,原因如下。当你执行
git rebase
时,git会回滚到起始点,然后为每次提交增量地应用补丁,使分支更新到最新状态。如果遇到冲突,它会停止并等待你解决冲突后再继续执行。冲突后rebase的路径取决于你如何解决冲突--如果你以某种方式解决冲突,这可能引入(或消除)以后的冲突。因此,
git rebase ... --dry-run
只能为您提供第一个冲突-后续冲突的报告将取决于第一个冲突是如何解决的。我能想到的唯一方法是通过
git diff
在当前位置和你要重定基的分支中的最后一次提交之间。但这并不能真正给予你你要找的东西-你只需要一个两点之间冲突更改的列表。有 * 可能 * 用git diff
来做这件事,但它不是一个普通的补丁。a64a0gku4#
你仍然可以做git rebase,你想怎么做就怎么做,然后恢复之前的所有修改。假设你已经完成了
master
中某个分支的rebase,但你不喜欢它:git reflog -20
-给你头的最后20个位置,并有一点描述git checkout <the_branch_name>
-将您的头部放在分支上git reset --hard <old_sha1_found_in_reflog>
-把你的HEAD和分支放在旧的ref上,这样你就可以恢复旧的分支。这里有一些需要理解的机制:
1.在git中,你永远不要删除任何东西,无论如何,不要用命令。垃圾收集器会检查并删除未被引用的分支(默认为3个月)。所以你的分支,在rebase之前,仍然存在。
1.同样的道理也适用于同一个分支上的基础更新,它只是一个新的树重写旁边的旧的。
rebase
和其他关于HEAD操作的所有历史记录都写在reflog
中1.您可以使用
reflog
中的@{N}
注解因此,在
rebase
之后不会丢失任何东西,您只需要知道如何找到并恢复它。例如,您可以在
rebase
之前放置一个标签,然后恢复到它或删除它。它可以避开所有的SHA1研究步骤。wsxa1bj15#
基于@joneit的解决方案:
从
your-branch
创建一个新的temp
分支,并尝试将临时分支重定到new-base
上:例如,测试分支
feature1
是否可以重定基到master
上: