Git:检查先前的提交并将其置于顶部?

时间:2018-02-15 15:08:24

标签: git github

您好,感谢您的时间。

我做了一些我想要维护的提交,但是我确实需要从前一点开始。所以这个想法是我想在历史中维护最近的提交,但我需要从之前的代码中编写代码,我知道它的工作正常。

特别是我需要从回购中获取:https://github.com/PrototipoAtlas/Prototipo/commits/master

提交: refaactor提取ControlsPanel

所以我做了:

git checkout 88975b656fae250f469507b3f1f80364810a0e7c

但是,我怎么能把它放在存储库的顶部?

我试过了:

git commit

它说没有做出任何改变。

我也读过:

Git checkout old commit, and further make new commits

How to checkout an old commit and make it a new commit

Checkout old commit and make it a new commit

How to revert Git repository to a previous commit?

但我没有找到一个我完全理解的答案

你能帮助我吗?

2 个答案:

答案 0 :(得分:1)

我相信你正在寻找像“git revision”这样的东西,但还要看看这篇“rewriting history”文章

另一个选项可能是interactive rebase,它允许您更改提交的顺序。

答案 1 :(得分:1)

TL; DR

$ git cherry-pick --strategy=recursive -X theirs <commit>

如果我理解正确,你想保留所有的提交,但是&#34;假装&#34;它们从来没有通过将状态带到提交的状态而发生。如果我是正确的,请让我解释一下:

通过设计,git可以使用指向提交的指针。你在git中的状态是HEAD,它是指向ref的指针。默认引用(即,如果你没有移动),是refs / head / master或branch master。

$ cat .git/HEAD 
ref: refs/heads/master

反过来,这是指向提交的指针。

$ cat .git/refs/heads/master 
6a7c2df372d612dff5fb5ce8cfbcea02f4ad5bee

我告诉你这个问题,向你解释checkout的作用。当您执行它时,您会收到此消息

  

注意:退房&#39; b17058ee12b46cb7b9a15057efe2f1872ff076cc&#39;。

     

你处于分离头部&#39;州。你可以四处看看,制作   实验更改并提交它们,您可以放弃任何提交   你在这种状态下通过表演而不影响任何分支   另一个结账。

     

如果您想创建一个新分支来保留您创建的提交,那么   可以通过再次使用-b和checkout命令来执行此操作(现在或稍后)。   例如:

     

git checkout -b

     

HEAD现在是b17058e ... b

如果您现在查看.git/HEAD

$ cat .git/HEAD
b17058ee12b46cb7b9a15057efe2f1872ff076cc

这意味着您指向提交,但您无法按照消息的指示提交更改。您可以从此提交创建分支,但您不是要求这样做。要做你想做的事,你需要:

$ git cherry-pick --strategy=recursive -X theirs <commit>

Cherry-pick是一个git命令,它获取提交并将其应用于HEAD。但是,它试图合并,因此当你想要的只是替换提交时,你会遇到很多冲突。因此,您可以将--strategy=recursive -X theirs作为参数进行挑选,以表示您希望您的更改被您选择的提交覆盖。