0

我对 git 还很陌生,我想弄清楚为什么我的工作流程会删除其他人所做的工作。工作流程如下:

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

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

  3. 当谈到推动这些错误的修复时,我会做一个隐藏来保存我所有其他的工作,然后从遥控器中提取。(在这个阶段我的假设是我与其他人所做的工作是内联的,并且当前的头部与遥控器是内联的)

  4. 然后我应用存储并推送假设只有我提交的更改将被推送

不幸的是,这删除了其他人所做的工作。

所以我的问题是:

  1. 如果'stash apply'本质上是一个合并,为什么/如何发生这种情况?'stash apply' 不应该将我的本地更改合并到返回的内容(即其他人的工作)吗?

    1. stash 实际上是存储所有提交的文件还是仅存储已提交的文件?因为如果是这样,我知道我应该做一个变基而不是简单的拉动

下面是相关图表的样子。

在此处输入图像描述

4

2 回答 2

0

如果你的序列是......

git pull
git stash apply
git push

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

让我们重建您所说的内容以及存储库的样子...

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

你会开始看起来像这样:

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

这里的 D 和 E 是您的错误修复,您正在执行正常的添加/提交过程。其他工作位于您的索引或磁盘中,此处未表示。

  1. 当谈到推动这些错误的修复时,我做了一个隐藏来保存我所有其他的工作......

git stash save将存储挂起您当前的提交。

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

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

拉取是提取加合并。获取后,如果有其他人将工作推送到远程,您的 repo 将如下所示:

      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}]

然后我应用存储并推送假设只有我提交的更改将被推送

Apply 不是像git merge合并历史那样的合并,它更像git cherry-pick应用补丁。它将获取 E 和 F 之间的差异并用它修补 J。可能存在您必须解决的冲突。Git 可能会默默地弄错。

这是学术性的,因为git stash apply不承诺,这取决于你。只要您在申请后没有提交,您的存储库就不应该有任何更改。当您推送时,您正在推送 D、E(您的错误修复)和 J(与 origin/master 的合并点)。

您在 D 和 E 中所做的某些事情完全有可能将合并与 G、H 和 I 混淆,所以 J 将是我开始寻找的地方。我会git log --stat --decorate --graph J查看添加和删除的内容以及何时添加和删除(--decorate 和--graph 将生成我一直在使用的那些行和标签,以便更好地理解存储库)。

您可以通过查看git reflog已移动 HEAD 的所有命令的历史记录以及它指向的 ID来恢复 J。Git 垃圾收集非常无趣,而且可能还会持续数周。

于 2015-01-18T19:50:48.190 回答
0
  1. 在某种程度上stash apply确实可以看作是一种合并。但它不会创建合并提交,因此认为它只是将隐藏的更改应用于当前提交的顶部会更正确。
  2. stash隐藏所有修改(无论您是否git add编辑)

话虽如此,您所描述的内容相当奇怪:除非您强制推送(git push -fgit push --force),否则 git 不会让您推送会删除现有远程提交的提交,因此您无法删除其他人的工作。

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

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

于 2015-01-18T18:35:41.473 回答