您好,感谢您的时间。
我做了一些我想要维护的提交,但是我确实需要从前一点开始。所以这个想法是我想在历史中维护最近的提交,但我需要从之前的代码中编写代码,我知道它的工作正常。
特别是我需要从回购中获取: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?
但我没有找到一个我完全理解的答案
你能帮助我吗?
答案 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
作为参数进行挑选,以表示您希望您的更改被您选择的提交覆盖。