Git:将我的工作插入两次提交

Git:将我的工作插入两次提交,git,git-commit,Git,Git Commit,我是Git的新手,我想我在我的主分支中造成了混乱 发生的事情如下: 我当时正在工作(平静地工作,没有打扰任何人),我得到了这样的承诺 a --> b --> C --> D a --> b --> E --> f a、b是其他人的提交,而C和D是我的提交。我把所有的东西都推到了我们的主存储库,一个我们必须在每次推送时运行测试的自动工具说构建失败了。所以我惊慌失措。我创建了一个新目录并重新克隆了存储库,直到提交b(当那个自动化工具说构建是可以的)进行了一些非

我是Git的新手,我想我在我的主分支中造成了混乱

发生的事情如下:

我当时正在工作(平静地工作,没有打扰任何人),我得到了这样的承诺

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