Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git rebase-我在rebase和强制推送之后显示错误的提交历史记录_Git_Command Line_Windows 10_Git Rebase - Fatal编程技术网

git rebase-我在rebase和强制推送之后显示错误的提交历史记录

git rebase-我在rebase和强制推送之后显示错误的提交历史记录,git,command-line,windows-10,git-rebase,Git,Command Line,Windows 10,Git Rebase,我在另一个分支上重新设置分支后遇到了一个有趣的问题git-rebase-i HEAD~n不仅显示错误的提交历史记录(旧分支),还显示错误的提交量 我想做什么 我希望能够在正确的提交历史记录上执行git-rebase-I HEAD~n,以便挤压基于我的分支的旧分支的剩余提交 我做了什么导致了这个问题 运行git log和gitk将按原样显示历史记录,这是我的当前提交和它最初基于的功能分支中的旧提交,正如预期的那样。但是,如果我随后运行git-rebase-I HEAD~4,我会得到旧分支的历史记录

我在另一个分支上重新设置分支后遇到了一个有趣的问题
git-rebase-i HEAD~n
不仅显示错误的提交历史记录(旧分支),还显示错误的提交量

我想做什么 我希望能够在正确的提交历史记录上执行
git-rebase-I HEAD~n
,以便挤压基于我的分支的旧分支的剩余提交

我做了什么导致了这个问题 运行
git log
gitk
将按原样显示历史记录,这是我的当前提交和它最初基于的功能分支中的旧提交,正如预期的那样。但是,如果我随后运行
git-rebase-I HEAD~4
,我会得到旧分支的历史记录以及11次提交,而不是我要求的4次:

# Git rebase -i HEAD~4 opens up in VIM like this:
pick f79316dc Commit on old Branch base
pick ba742f2f Commit on old Branch base
pick 7577ea7a Commit on old Branch base
pick 91c4088c Commit on old Branch base
pick 98feed6d Commit on old Branch base
pick e8a73d78 Commit on old Branch base
pick 198f79e7 Commit on old Branch base
pick 10bb699c Commit on old Branch base
pick 1d15a926 Commit on old Branch base
pick 0cf569bb Previous commit I want to squash with
pick 470de8d9 Current FeatureBranch commit
但是
git log
会打印以下内容:

# As it should be when seeing git log and gitk
commit 470de8d92bb490dd14c31d5741b7edec82ca7597 (HEAD -> FeatureBranch, origin/FeatureBranch)
Author: evFox <evFox@fake-email.com>
Date:   Wed Jan 3 16:08:24 2018 +0100
    Feature commit message

commit 0cf569bba43b5747831a28d6cb42209dab1c2ffa
Author: evFox <evFox@fake-email.com>
Date:   Wed Jan 3 12:09:48 2018 +0100
    Feature from old branch still relevant to this; what I want to merge with the later commit.

commit 982c30d9c3b46539340fe48c241192e377d3e136 (origin/Development, Development)
Merge: ab6e7c9d 1d15a926
Author: evFox <evFox@fake-email.com>
Date:   Tue Jan 9 10:51:06 2018 +0000
    Merged PR XX: Merge OldFeatureBranch to Development
我试图通过在
git rebase-I
中增加提交来获得更多历史记录,我可以清楚地看到提交是旧的,与更新和合并之前一样属于OldFeatureBranch:

# Git rebase -i HEAD~20 opens up in VIM like this:
pick bt67f432 Commit on old version DevelopmentBranch
pick 5g67f33s Commit on old version DevelopmentBranch
pick rt53d563 Commit on old version DevelopmentBranch
pick ew5r45fg Commit on old version DevelopmentBranch
pick 9gy3f74f Commit on old version DevelopmentBranch
pick 58u5hh63 Commit on old version DevelopmentBranch
pick 34fdg5d5 Commit on old version DevelopmentBranch
pick n678hcn7 Commit on old version DevelopmentBranch
pick mh7y88dr PR merge of DevelopmentBranch where old Branch base were branched out originally, but not where DevelopmentBranch was when old Branch Base was squashed and merged.
pick f79316dc Commit on old Branch base
pick ba742f2f Commit on old Branch base
pick 7577ea7a Commit on old Branch base
pick 91c4088c Commit on old Branch base
pick 98feed6d Commit on old Branch base
pick e8a73d78 Commit on old Branch base
pick 198f79e7 Commit on old Branch base
pick 10bb699c Commit on old Branch base
pick 1d15a926 Commit on old Branch base
pick 0cf569bb Previous commit I want to squash with
pick 470de8d9 Current FeatureBranch commit
但问题依然存在

可能的解决办法 我想我可以尝试进行软重置,并修改我要压缩的提交:

git reset --soft HEAD~1
但是,这并不能解决我当前的问题,即git-rebase-i HEAD~n历史混乱

但是,如果我运行git rebase-I HEAD~4,我会得到旧分支的历史记录以及11次提交,而不是我要求的4次:

# Git rebase -i HEAD~4 opens up in VIM like this:
pick f79316dc Commit on old Branch base
pick ba742f2f Commit on old Branch base
pick 7577ea7a Commit on old Branch base
pick 91c4088c Commit on old Branch base
pick 98feed6d Commit on old Branch base
pick e8a73d78 Commit on old Branch base
pick 198f79e7 Commit on old Branch base
pick 10bb699c Commit on old Branch base
pick 1d15a926 Commit on old Branch base
pick 0cf569bb Previous commit I want to squash with
pick 470de8d9 Current FeatureBranch commit

您的一个提交是合并。无论何时尝试
挤压
[interactive rebase],您都将获得所有提交。如果中间有一个合并,就会得到所有合并的提交。

< P>我刚刚遇到这个问题,结果我把编辑器打开了,所以每当我重新运行时,它就打开它,直到我仍然从先前的ReBASE运行的缓冲区。要修复它,只需关闭编辑器窗口或终止进程


我刚刚遇到了这个问题,结果发现我的编辑器一直处于打开状态,所以每当我运行rebase时,它都会将其打开到我仍然从上一个rebase运行的缓冲区

这已通过Git 2.24(2019年第4季度)修复。
之前,“
git-rebase-i
”在“
reword
”打开编辑器时显示了错误的标题,如图所示

参见(2019年8月19日)作者。
(于2019年10月11日合并)

rebase-i:在重新编码之前始终更新HEAD 如果用户在重写提交时运行
git log
,那么有时我们会修改正在重写的提交,而有时我们会根据是否可以快进创建新的提交,这会让人感到困惑。
通过始终提交拾取的提交,然后运行“
git commit--amend
”进行重写,修复此不一致性

第一次提交由sequencer执行,无需分叉
git commit
,并且不会影响重新基址的速度。
在测试中,重写100次提交

GIT_EDITOR=true GIT_SEQUENCE_EDITOR='sed -i s/pick/reword/' \
../bin-wrappers/git rebase -i --root
三次运行中最好的一次,当前的master运行了957ms,而这个补丁运行了961ms

此更改修复了在使用
--root
重新排列提交时重新编写新的根提交的问题

请注意,在创建根提交后,新代码不再更新
CHERRY\u PICK\u HEAD
——我不确定为什么旧代码在成功提交后创建该ref,而在其他地方,它在成功提交后被删除


它还改进了git rebase的C版本:

rebase-i
:在
squash
reword
之后检查更新的
todo
当用户停止重基以编辑提交消息时,他们也可以方便地编辑
todo
列表。
rebase的脚本版本支持这一点,但C版本不支持

我们已经检查了
todo
列表是否已由
exec
命令更新,因此将其扩展到重写和挤压。
这样做只需要一个stat调用,因此不会影响重基的速度(特别是当用户刚刚停止编辑消息时)

请注意,对于挤压,当我们编辑链接末尾的消息时,编辑器可能会在与挤压本身不同的拾取上打开


但最近的修复还包括一个回归:在对多个提交运行“
revert
”或“
cherry pick--edit
”时,最近的回归错误地检测到“无需提交,工作树清理”,而不是重放提交,这已经用Git 2.25(2020年第1季度)进行了更正

参见(2019年11月23日)作者。
(于2019年12月6日合并)

:不要重新阅读
todo
中的
revert
cherry pick
报告人:Brian Norris
签字人:SZEDER Gábor

在多次提交时调用“
git revert
”或“
git cherry pick--edit
”时,在编辑完第一条提交消息后,这两个命令应继续处理第二条提交消息,并为其提交消息启动另一个编辑器,当然,假设没有冲突

唉,这一点在2019-08-19,Git v2.24.0-rc0中被无意地改变了(“
rebase-i
:在
squash
reword
之后检查更新的
todo
”):编辑第一条提交消息完成后,“
Git revert
”和“
Git cherry pick--edit
”都会错误退出,声称“无需承诺,工作树干净”

改变行为的原因有两方面:

  • 在此之前,只有在“
    exec
    ”指令之后才检查
    todo
    列表文件的最新性,并且提交将这些检查移动到公共代码路径。
    其目的是该支票应为pe
    GIT_EDITOR=true GIT_SEQUENCE_EDITOR='sed -i s/pick/reword/' \
    ../bin-wrappers/git rebase -i --root