Git将主分支倒带到主';历史

Git将主分支倒带到主';历史,git,Git,我在我的git回购中有以下最近的历史记录 * 7661a06 (HEAD, origin/devConsolidate, devConsolidate) Fix seg fault; OCBA intermediary compares by value() now also | * 0bbe038 (origin/master, master) Flawed work no seedShift |/ * 62fe9db Turn on OCBA_DEBUG; nan/inf values

我在我的git回购中有以下最近的历史记录

* 7661a06 (HEAD, origin/devConsolidate, devConsolidate) Fix seg fault; OCBA intermediary compares by value() now also
| * 0bbe038 (origin/master, master) Flawed work no seedShift
|/  
* 62fe9db Turn on OCBA_DEBUG; nan/inf values in OCBA prior to crash
* 71298c8 Turn on OCBA (non-intermediary); seg fault occurs
* 3693904 No OpenMP, no OCBA; no memory leaks on valgrind
* 9d5686c Disable OpenMP threads
* 80bbc3b Debug (-O0) build now throws exception also
* e148013 Post convert simulation4_NEJMdisutilities [] to at()
* 66cfba9 Post convert OCBA [] to at()
* 32db3be Pre convert OCBA [] to at()
* 4a9f25b Prep for debugging
* 907e88b Found error (vector out of bounds); need to fix from here
* ca6c639 Implement elapsed, iteration, and max time in OCBA
* db68c15 Fix SEG FAULT; OCBA now working (with intermediary)
* f1c6f05 GA now uses OCBA; GA/OCBA params from config file; produces SEG FAULT
| * 3b16dcf (origin/genCRNgraph, genCRNgraph) Generate QALYs test and control independent-sampling
|/  
*   001eff2 Merge branch 'OCBAdev'
f16f05
的(后代)之后的所有提交都是为了调试问题而完成的。事后看来,我应该创建一个单独的分支来进行调试,但我是在
master
中完成的。现在,在commit
7661a06
中,我修复了这个bug

我想移动(倒带?)主分支(或指针),使其位于commit
f1c6f05
。完成此操作后,我可以根据提交
7661a06
62fe9db
之间的差异生成补丁,并将其应用于
f16f05
。因此,我的git日志的一部分应该如下所示:

* 7661a06 (origin/devConsolidate, devConsolidate) Fix seg fault; OCBA intermediary compares by value() now also
| * 0bbe038 Flawed work no seedShift
|/  
* 62fe9db Turn on OCBA_DEBUG; nan/inf values in OCBA prior to crash
           .
           .        
           .
* db68c15 Fix SEG FAULT; OCBA now working (with intermediary)
| * <HASH> (HEAD, origin/master, master) Fix problem and rewind master
|/
* f1c6f05 GA now uses OCBA; GA/OCBA params from config file; produces SEG FAULT
| * 3b16dcf (origin/genCRNgraph, genCRNgraph) Generate QALYs test and control independent-sampling
|/  
*   001eff2 Merge branch 'OCBAdev'
*7661a06(原点/devConsolidate,devConsolidate)修复seg故障;OCBA中介现在也按value()进行比较
|*0bbe038有缺陷的工作没有轮班
|/  
*62fe9db开启OCBA_调试;崩溃前OCBA中的nan/inf值
.
.        
.
*db68c15修复SEG故障;OCBA正在工作(与中介机构合作)
|*(主机、原点/主机、主机)修复问题并倒带主机
|/
*f1c6f05 GA现在使用OCBA;配置文件中的GA/OCBA参数;产生SEG故障
|*3b16dcf(原点/genCRNgraph,genCRNgraph)生成QALYs测试和控制独立采样
|/  
*001eff2合并分支“奥巴德夫”
我将使用什么命令来实现所有这些?具体来说,我将如何:(1)移动主机,(2)生成补丁,以及(3)应用补丁

git checkout master
git reset --hard f1c6f05
git rebase --onto master 62fe9db devConsolidate
如果在此之后您对
devConsolidate
的历史记录感到满意:

git checkout master
git merge devConsolidate

由于您已经将
master
推送到
origin
origin/master
位于
0bbe038
),这将给自推送到
origin
后已从
提取或提取的任何人带来问题。因此,您可能需要与其他人沟通和协调正在发生的事情,以便他们能够根据需要进行调整

考虑到这一点,以下是您将如何做到这一点:

1) 将主机移回
f1c6f05

git checkout master
git reset --hard f1c6f05
git push -f origin master
2+3)假设
7661a06
是修复程序的唯一相关提交,而不是生成并应用修补程序,您只需执行以下操作:

git checkout -b bug-fix-branch master
git cherry-pick 7661a06
git checkout master
git revert f1c6f05..62fe9db
git push master
您可能会遇到一些小冲突,具体取决于所有“调试”提交实际上做了什么,以及它们是否触及了
7661a06
提交更改的内容附近的任何内容,但这些应该很容易修复。完成后,执行以下操作以将更改合并回主文件:

git checkout master
git merge bug-fix-branch
git branch -d bug-fix-branch    # optional, maybe not desired
git push origin master
此时,其他所有人都需要获取/拉取新的
master
分支,并重新启动所有挂起的工作

如果对他人的干扰不可接受,您也可以这样做:

git checkout -b bug-fix-branch master
git cherry-pick 7661a06
git checkout master
git revert f1c6f05..62fe9db
git push master

这将在主机上创建新的提交,撤消所有这些“调试”提交的效果,但实际上不会从历史记录中删除它们。因此,工作目录的结尾内容应该看起来相同,但历史记录看起来会非常不同。在这种情况下,应该不会对其他人造成干扰,因此根据您的环境/工作流程,这可能是更好的选择,但它确实为后代记录了所犯的错误,并且如果您需要使用
git bisect
跟踪新的bug或其他东西,可能会导致混乱/问题…

,我忘了提到这是私人回购。没有其他开发人员。好的,那么在这种情况下,
origin
要么是一个“备份”回购协议,要么只是另一个系统上回购协议的另一个副本(可能是台式机还是笔记本电脑)?在这两种情况下,使用
git reset
git push-f
所带来的麻烦应该是相当小的。但是,如果
origin
不是裸repo,您可能会在路上遇到额外的碰撞-您可能需要确保在推之前没有签出
master
origin
只是我存储在私有github repo上的备份。这会删除我的任何提交吗?(我不想这样。)用Git删除提交确实很困难。所有这些提交仍然可以通过它们的散列访问(直到它们被垃圾收集,至少30天内不会发生)。重写历史记录(
git reset
git rebase
在本例中)始终会创建新版本的历史记录,并将指针(分支)移动到新版本。如果您想要引用在
git reset
git rebase
之前的位置,只需将一个分支放到那里:
git branch foo
。如果忘记了这样做,可以使用
git reflog
跟踪分支的历史记录。