Git将master分支回滚到master的历史记录中的特定提交

时间:2013-06-14 14:34:16

标签: git

我的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后代({1}}之后的所有提交都是为了调试问题。事后看来,我应该创建一个单独的分支来进行调试,但我在master中完成了所有操作。现在,在提交7661a06中,我修复了错误。

我想移动(倒回?)master分支(或指针),使其位于提交f1c6f05。执行此操作后,我可以从提交7661a0662fe9db之间的差异生成补丁,并将其应用于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)应用补丁?

2 个答案:

答案 0 :(得分:7)

由于您已将master推送至originorigin/master位于0bbe038),因此对于已从{{1}获取或取出的任何人都会造成问题因为你的推动。因此,您可能需要与其他人进行沟通和协调,以便他们根据需要进行调整。

考虑到这一点,不过,这是你要怎么做的:

1)将主人移回origin

f1c6f05

2 + 3)假设git checkout master git reset --hard f1c6f05 git push -f origin master 是您修复的唯一相关提交,而不是生成和应用补丁,您可以简单地执行此操作:

7661a06

你可能会遇到一些小的冲突,具体取决于所有“调试”提交实际上做了什么,以及它们是否触及了git checkout -b bug-fix-branch master git cherry-pick 7661a06 提交更改的附近任何内容,但这些应该很容易修复。完成后,执行此操作将该更改合并回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

这将在master上创建新的提交,撤消所有这些“调试”提交的效果,但实际上不会从历史记录中删除它们。因此,工作目录的结束内容应该看起来一样,但历史记录看起来会有很大不同。在这种情况下,不应该对其他人造成干扰,因此根据您的环境/工作流程,这可能是更好的选择,但它确实为后代记录了所犯的错误,如果您需要,可能会引起混乱/问题。使用git checkout master git revert f1c6f05..62fe9db git push master 来追踪新的错误或其他内容......

答案 1 :(得分:0)

git checkout master
git reset --hard f1c6f05
git rebase --onto master 62fe9db devConsolidate

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

git checkout master
git merge devConsolidate