有问题的git工作流程删除了其他人的工作

时间:2015-01-18 18:23:10

标签: git git-workflow

我对git相当新,我想弄清楚为什么我的工作流程删除了其他人所做的工作。工作流程如下:

  1. 我正在处理我本地主分支上的一些错误。 (我知道我应该使用不同的分支,但在这种情况下我没有)

  2. 提交我为这些错误所做的更改,但仍有其他未准备好的工作

  3. 当谈到推送这些错误的修复程序时,我会隐藏所有其他工作,然后从远程执行。 (在这个阶段,我的假设是我与其他人所做的工作内联并且当前的头部与遥控器一致)

  4. 然后我假设只推送我提交的更改

  5. 然后应用存储和推送

    不幸的是,其他人已经删除了这项工作。

    所以我的问题是:

    1. 如果'藏匿适用'本质上是合并为什么/如何发生这种情况?不应该存储申请'将我的本地更改合并到返回的内容(即其他人的工作)?

      1. stash实际上存储了所有已提交的文件,还是只隐藏了存档的文件?因为如果是这样,我明白我应该做一个改变而不是简单的拉动
    2. 下面是相关图表的样子。

      enter image description here

2 个答案:

答案 0 :(得分:0)

  1. 在某种程度上stash apply确实可以被视为一种合并。但它并没有创建合并提交,因此考虑它只是在当前提交的顶部应用您的存储更改会更为正确。
  2. stash隐藏所有修改(无论您是否git add编辑过它们)
  3. 话虽如此,你所描述的内容相当奇怪:除非你强行推送(git push -fgit push --force),否则git不会让你推送会删除现有遥控器的提交提交,因此您无法删除其他人的工作。

    除非你的意思是你在应用藏匿处时部分还原了他们的工作。在这种情况下,这意味着他们的提交仍然是他们的,所以它绝对不会丢失(例如,您只需要恢复自己的提交)。

    最后:即使你删除了他们的提交,并推动了强制,它可能还没有结束:

答案 1 :(得分:0)

如果您的序列是......

git pull
git stash apply
git push

...没有干预提交,那么它就不能成为藏匿处。这就是原因。

让我们重新构建您所说的内容以及存储库的外观......

  
      
  1. 我正在处理我当地主分支上的一些错误。 (我知道我应该使用不同的分支,但在这种情况下我没有)
  2.   

你会开始看起来像这样:

A - B [origin/master] [master]
  
      
  1. 提交我为这些错误所做的更改,但仍有其他未准备好提交的工作。
  2.   
A - B [origin/master] - D - E [master]

D和E这里是你的错误修复,你正在进行正常的添加/提交过程。另一项工作是坐在您的索引或磁盘上,此处未显示。

  
      
  1. 当谈到推动这些错误的修复时,我会藏起来保存我所有的其他工作......
  2.   

git stash save会将当前的提交挂起。

A - B [origin/master] - D - E [master]
                             \
                              F [stash@{0}]
  

然后从遥控器拉出来。 (在这个阶段,我的假设是我与其他人所做的工作内联并且当前的头部与遥控器一致)

pull是一个fetch加上一个合并。获取后,如果其他人将工作推送到遥控器,您的回购将如下所示:

      G - H - I [origin/master]
     /
A - B - D - E [master]
             \
              F [stash@{0}]

然后将origin / master合并为master。

      G - H - I [origin/master]
     /          \
A - B - D - E -  J [master]
             \
              F [stash@{0}]
  

然后我假设只推送我提交的更改

,然后应用存储和推送

应用不是合并历史记录的git merge之类的合并,更像是应用修补程序的git cherry-pick。它将采用E和F之间的差异以及补丁J。您可能需要解决冲突。 Git可能默默地弄错了。

这是学术上因为git stash apply不承诺,这取决于你。只要您在apply之后没有提交,就不应该对您的存储库进行任何更改。当你推动时,你正在推动D,E(你的错误修复)和J(与原点/主人的合并点)。

你在D和E中所做的事情完全有可能与G,H和我的合并感到困惑,所以J就是我开始寻找的地方。我会做一个git log --stat --decorate --graph J来查看添加和删除的内容以及何时(--decorate和--graph将生成我用于更好地理解存储库的那些行和标签)。

您可以通过查看git reflog来恢复J,这是移动了HEAD的所有命令的历史记录以及它指向的ID。 Git垃圾收集非常糟糕,它可能会在那里持续数周。