6

我的 git repo 中有以下最近的历史记录。

* 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'

(的后代)之后的所有提交f1c6f05都是为了调试问题。事后看来,我应该创建一个单独的分支来进行此调试,但我在master. 现在,在 commit 中7661a06,我已经修复了这个错误。

我想移动(倒带?)master分支(或指针),使其位于 commit f1c6f05。完成此操作后,我可以从提交之间的差异生成补丁7661a06并将62fe9db其应用于f1c6f05. 结果,我的 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'

我将使用哪些命令来实现所有这些?具体来说,我将如何:(1)移动主机,(2)生成补丁,(3)应用补丁?

4

2 回答 2

11

由于您已经推master送到origin( origin/masteris at ),这将对自您推送以来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

您可能会遇到一些小冲突,具​​体取决于所有“调试”提交实际上做了什么,以及它们是否触及了7661a06提交更改附近的任何内容,但这些应该很容易修复。完成后,执行此操作以将该更改合并回 master:

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 master
git revert f1c6f05..62fe9db
git push master

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

于 2013-06-14T15:53:32.400 回答
1
git checkout master
git reset --hard f1c6f05
git rebase --onto master 62fe9db devConsolidate

如果您对之后的历史感到满意devConsolidate

git checkout master
git merge devConsolidate
于 2013-06-14T15:49:24.210 回答