我正在尝试对脚本进行脚本重定,并且脚本将采用不同的路径,具体取决于重设是否导致任何冲突。
有没有一种方法可以确定在执行重定基之前,重定基是否会导致冲突?
我正在尝试对脚本进行脚本重定,并且脚本将采用不同的路径,具体取决于重设是否导致任何冲突。
有没有一种方法可以确定在执行重定基之前,重定基是否会导致冲突?
git rebase
并遇到合并冲突,则该过程将停止并以非零状态退出。您可以检查rebase操作的退出状态,如果它不为零,请运行git rebase --abort
以取消操作。
Answers:
在撰写本文时(Git v2.6.1v2.10.0),该git rebase
命令不提供任何--dry-run
选项。在实际尝试重新设置基准之前,无法知道是否会遇到冲突。
但是,如果您运行git rebase
并遇到冲突,则该过程将停止并以非零状态退出。您可以做的是检查变基操作的退出状态,如果非零,请运行git rebase --abort
以取消变基:
git rebase ... || git rebase --abort
git checkout --detach foo
。
git reset --hard ORIG_HEAD
将分支移回到重新设置基准之前的位置。
如果您只想查看重新建立基准是否成功,但又想“回滚” ,则可以始终将分支提示重新定位为原始提交。只需标记或记下原始SHA。
也许更简单,创建一个新的临时分支以在其中“暂存”该基础:
git checkout your-branch
git checkout -b tmp
git rebase other-branch
如果成功但是您想要“回滚”,your-branch
则保持不变。公正git branch -D tmp
,您又回到了起点。
如果存在冲突,并且您做了一些工作来解决它们,那么现在您想要保留基准,只需将分支提示重新定位到tmp
(然后再git branch -D tmp
)。
git checkout -b tmp your-branch
我怀疑这git rebase ... --dry-run
是不可能的,原因如下。
当您执行时git rebase
,git会回滚到起点,然后为每个提交增量应用补丁,以使分支保持最新状态。如果遇到冲突,它将停止并等待您解决冲突,然后再继续。在发生冲突后,变基所采取的路径取决于解决冲突的方式-如果以某种方式解决冲突,则可能会引入(或消除)以后的冲突。
因此,git rebase ... --dry-run
只能给您第一个冲突-以后冲突的报告将取决于如何解决第一个冲突。
我能想到的唯一方法是git diff
在当前位置和要重新定位到的分支中的最后一次提交之间。但这并不能真正满足您的需求-您实际上只需要列出两点之间相互矛盾的更改列表。有可能是一个办法做到这一点的git diff
,但它不是一个正常的补丁。
您仍然可以做git rebase,根据需要使用它,而不是恢复以前的所有更改。假设您已完成将某个分支重新建立到的基础master
,但您不喜欢它:
git reflog -20
-稍微说明一下HEAD的最后20个位置git checkout <the_branch_name>
-将您的HEAD放在树枝上git reset --hard <old_sha1_found_in_reflog>
-将您的HEAD和分支放在旧的ref上,这样您就可以恢复旧的分支。这里有一些要理解的机制:
rebase
和您其他有关HEAD操作的历史记录都写在reflog
@{N}
来自的注释reflog
因此,在之后rebase
,您什么都不会丢失,您只需要知道如何查找和恢复它即可。
例如,您可以将自己放置在标签之前,然后将rebase
其还原或删除。它可以避免您进行SHA1研究的所有步骤。
git rebase
您使用的命令的确切形式是什么?您是否在使用任何可选标志?您正在使用哪种脚本语言?贝壳?