我不得不使用命令返回 Git 中的六次提交
git checkout idofthecommit
我一直在做的是继续提交,提交,提交。由于我没有创建真正的新分支,因此当我使用 git push 到外部存储库时
git push origin master
它告诉我一切都是最新的。
这意味着我实际上并没有对 master 进行任何更改。
如何将我一直在做的提交移动到主分支?
我不得不使用命令返回 Git 中的六次提交
git checkout idofthecommit
我一直在做的是继续提交,提交,提交。由于我没有创建真正的新分支,因此当我使用 git push 到外部存储库时
git push origin master
它告诉我一切都是最新的。
这意味着我实际上并没有对 master 进行任何更改。
如何将我一直在做的提交移动到主分支?
如果您对您运行的命令的描述是正确的 - 现在就创建一个您正在处理的分支,以创建一个可靠的命名引用 ( git branch WIP HEAD
)。git rebase master
然后针对 master ( ) 和 checkout master 进行rebase并在 WIP 中合并。
您可以相当简单地对此进行测试,以复制情况并探索您需要的命令以及它们的作用。因为这git graph
是一个别名git log --graph --oneline --decorate --abbrev-commit
,只是产生一个漂亮的 git 日志。
创建一个包含 8 个提交的演示存储库,然后签出六个并创建更多提交
$ cd /tmp && git init demo && cd demo
$ for msg in one two three four five six seven eight; do echo $msg>file && git add file && git commit -m $msg; done
$ git checkout HEAD~6
$ for msg in nine ten eleven; do echo $msg>file && git add file && git commit -m $msg; done
所以让我们看看这个:
$ git graph --all
* e81b31c (HEAD) eleven
* c005e75 ten
* c567d25 nine
| * 4d28c3d (master) eight
| * 380f715 seven
| * 9966c80 six
| * 6b2f757 five
| * e43d079 four
| * ce0ff34 three
|/
* 8d5a6e1 two
* 1f880ae one
所以实际上这看起来就像是从 8d5a6e1 中提取的一个特性分支。唯一特别的是它唯一的参考是HEAD。如果您现在添加一个分支引用,它将成为一个正常的功能分支。
如果您在使用分支标记标记此工作分支之前不小心签出了 master 或其他一些分支,那么您将失去对这个新提交链顶部的引用。现在你失去了分支。在这种情况下,您需要使用 reflog 来查找该链上的最后一个提交并添加对该提交的分支引用。我们可以从上面的演示存储库中看到这一点:
$ git reflog
e81b31c HEAD@{0}: commit: eleven
c005e75 HEAD@{1}: commit: ten
c567d25 HEAD@{2}: commit: nine
8d5a6e1 HEAD@{3}: checkout: moving from master to HEAD~6
4d28c3d HEAD@{4}: reset: moving to 4d28c3d
....
我们可以从 reflog 中看到返回了一些提交,我们检查了 HEAD~6,然后又添加了三个提交。然后我们可以发出git branch recover-commits e81b31c
一个指向该组提交的分支并恢复它们。