Git:将我的工作插入两次提交
我是Git的新手,我想我在我的主分支中造成了混乱 发生的事情如下: 我当时正在工作(平静地工作,没有打扰任何人),我得到了这样的承诺Git:将我的工作插入两次提交,git,git-commit,Git,Git Commit,我是Git的新手,我想我在我的主分支中造成了混乱 发生的事情如下: 我当时正在工作(平静地工作,没有打扰任何人),我得到了这样的承诺 a --> b --> C --> D a --> b --> E --> f a、b是其他人的提交,而C和D是我的提交。我把所有的东西都推到了我们的主存储库,一个我们必须在每次推送时运行测试的自动工具说构建失败了。所以我惊慌失措。我创建了一个新目录并重新克隆了存储库,直到提交b(当那个自动化工具说构建是可以的)进行了一些非
a --> b --> C --> D
a --> b --> E --> f
a、b
是其他人的提交,而C
和D
是我的提交。我把所有的东西都推到了我们的主存储库,一个我们必须在每次推送时运行测试的自动工具说构建失败了。所以我惊慌失措。我创建了一个新目录并重新克隆了存储库,直到提交b
(当那个自动化工具说构建是可以的)进行了一些非常小的更改并强制推送(是的,我不是很聪明,但是已经很晚了,我很害怕),所以在这一点上,远程存储库看起来是这样的:
a --> b --> E
但事实证明,我最初提交的C
和D
是正确的,失败的是自动工具。这是假阳性!!当我意识到,有人再次提交到主分支(远程存储库),所以在这一点上看起来是这样的
a --> b --> C --> D
a --> b --> E --> f
我想做的是在不破坏同事工作的情况下安全地将我的良好承诺C
和D
插入分支。我的计算机中的目录中仍然有这些提交,但只要我执行git pull
,它们就会被销毁
我希望远程存储库看起来像:
a --> b --> C --> D --> f
或
甚至
a --> b --> E --> f --> C --> D
(保留超级虚拟提交E
,我不介意)
基本上,我希望C
和D
在那里,而不破坏我同事的f
提交
这可能吗
我处于恐慌状态,所以一切都会有所帮助。你可以拿回
C
和D
[编辑:如果你在原始回购中“丢失”了它们,但我发现你没有]。使用git reflog
按ID查找它们:
$ git reflog
或:
(如果您在master
上,只想看到那里发生的更改),等等
找到提交D
后,在其上粘贴分支标签。假设上面的输出清楚地表明,HEAD@{3}
就是您想要的。然后:
$ git branch recover_my_stuff 'HEAD@{3}'
或:
通过编号(以及使用不同的名称等)来完成。在此之前,您可以运行gitk HEAD@{3}
和gitk 0123456
,或git log HEAD@{3}
等,以再次检查这是否是您想要的。一旦有了分支标签,git branch
和gitk--all
将再次向您显示它
编辑:既然原始回购协议中仍然有它们,那么让我们在那里工作吧。首先,您的
master
当前具有a-b-C-D
序列。让我们将此分支重命名为temp
,然后使用git fetch
更新远程回购,并创建一个新的master
,跟踪origin/master
:
$ git branch -m master temp
$ git fetch origin
$ git checkout -b master --track origin/master
(此处,temp
——因为它只是原始master
的重命名——将“跟踪”origin/master
,所以git会告诉你它不同于origin/master
,它在前面和后面都有几次提交。但是你不必在意,你可以忽略git的这些通知。如果你愿意,你可以通过编辑git配置让它停止“跟踪”,但这两种方式都是无害的。)
好的,那么,假设您已经完成了上述操作,
gitk
现在(以更漂亮的图形形式)显示了这一点。我将使用分支标签temp
来处理恢复的内容,并假设其余的都在master
上(好吧,你说的是:-):
现在您将看到:
a - b - E - f <-- master, origin/master
\ \
\ C'-D' <-- HEAD=temp
\
C - D [no branch label]
这是同一个提交图,我们只是更改了头部指向(主)的位置,并删除了不可见的提交
$ git merge temp
merge
操作将“快进”主控,因为实现合并所需的唯一方法是将标签从提交f
滑到提交D'
:
a - b - E - f <-- origin/master
\
C'-D' <-- HEAD=master, temp
a-b-E-f你可以拿回C
和D
[编辑:如果你在原始回购协议中“丢失”了它们,但我看你没有]。使用git reflog
按ID查找它们:
$ git reflog
或:
(如果您在master
上,只想看到那里发生的更改),等等
找到提交D
后,在其上粘贴分支标签。假设上面的输出清楚地表明,HEAD@{3}
就是您想要的。然后:
$ git branch recover_my_stuff 'HEAD@{3}'
或:
通过编号(以及使用不同的名称等)来完成。在此之前,您可以运行gitk HEAD@{3}
和gitk 0123456
,或git log HEAD@{3}
等,以再次检查这是否是您想要的。一旦有了分支标签,git branch
和gitk--all
将再次向您显示它
编辑:既然原始回购协议中仍然有它们,那么让我们在那里工作吧。首先,您的master
当前具有a-b-C-D
序列。让我们将此分支重命名为temp
,然后使用git fetch
更新远程回购,并创建一个新的master
,跟踪origin/master
:
$ git branch -m master temp
$ git fetch origin
$ git checkout -b master --track origin/master
(此处,temp
——因为它只是原始master
的重命名——将“跟踪”origin/master
,所以git会告诉你它不同于origin/master
,它在前面和后面都有几次提交。但是你不必在意,你可以忽略git的这些通知。如果你愿意,你可以通过编辑git配置让它停止“跟踪”,但这两种方式都是无害的。)
好的,那么,假设您已经完成了上述操作,gitk
现在(以更漂亮的图形形式)显示了这一点。我将使用分支标签temp
来显示恢复的内容,并假设其余的都在master
(好的,
a - b - E - f <-- origin/master
\
C'-D' <-- HEAD=master, temp
git pull --rebase