繁体   English   中英

“git pull --rebase --autostash”不应该总是自动弹出存储吗? 即使发生冲突?

[英]Shouldn't "git pull --rebase --autostash" always pop the stash automatically? Even when there are conflicts?

几年前,在之前的一份工作中,我们将 git 与一个(旧)插件一起使用,称为“ git up ”。
https://github.com/aanand/git-up
“不再维护或支持此插件。”
过去更新您的工作区非常容易:
只需键入“git up”,查看哪些文件有冲突,编辑这些文件以解决冲突,执行“git add”,就完成了。

我现在在另一家公司工作。 他们今年早些时候开始使用 git。 我们没有一个清晰简单的方法让每个人都更新我们的工作区。 我想介绍一种非常简单的方法来更新您的工作区。 尽可能简单 没有提交,没有合并。

似乎最简单的方法是使用带有 --rebase 和 --autostash 标志的“git pull”。 您可以通过在 .gitconfig 文件中设置这些值来执行相同的操作。 或者使用别名:

git config --global alias.up '!git fetch && git rebase --autostash origin'

这有点工作。 当没有冲突时,stash 会自动弹出。 除了键入“git up”或“git pull --rebase --autostash”之外,我不需要做任何事情。

有一个问题。 当出现冲突时,git 拒绝将 stash 应用回我的工作区。 它说:

Applying autostash resulted in conflicts.
Your changes are safe in the stash.
You can run "git stash pop" or "git stash drop" at any time.
Successfully rebased and updated refs/heads/main.
$ git stash list
stash@{0}: autostash
$ 

当我输入“git stash pop”时,stash 被弹出,我的本地更改会再次自动编辑到我的工作区中(使用通常的 >>>> 和 <<<< 标记)。 这总是成功的。

请注意,当我更改了一个也在远程存储库上更改的文件时,git 总是拒绝自动弹出存储。 不仅是在发生真正的冲突时(同一行上的更改)。 而且当我的更改与远程存储库的更改相去甚远时。 这让我怀疑我看到的行为真的不是故意的。

但是为什么 --autostash 不会自动弹出存储? 我与我公司的 git 支持人员进行了交谈。 他们还希望藏匿处自动弹出。 即使有冲突。 我做了一些谷歌搜索。 我发现没有任何迹象表明藏匿处不应自动弹出。

所以我的问题是:我能期待什么? 当我使用 --autostash 时,stash 是否应该总是自动弹出 还是我看到的行为正常? 这是一个错误吗? 我们本地的 git-team 是否更改了可执行文件或全局配置中的某些内容? (他们说他们没有)。

行为与 2.26.2 和 2.33 相同。 谢谢。

您看到的行为(呃,行为)正常的,因为操作仍在进行中 在操作完成后,自动存储应该被弹出——或者更确切地说,是丢弃。 确实,在这种情况下,操作的 rebase部分已经完成,但是 stash 没有完全应用,所以git stash apply步骤失败了:

Applying autostash resulted in conflicts.

(我认为Git 做了一个git reset --hard来消除对git stash apply的尝试,让你在这一点上自己做,但我不使用 autostash。请注意,运行git stash pop发生冲突,并且会只应用,而不是丢弃,藏匿处。)

我个人不喜欢 autostash,因为它过于复杂:它包含一个多步骤操作,包括进行 stash 提交、rebase,然后应用和删除 stash 提交。 相反积攒的,我建议你重订之前刚刚提交 这样,最后一次提交是 rebase 的一部分,因此只需完成一个操作。

完成后,您可以使用git reset删除重新提交的提交,如果甚至需要的话:我喜欢较小的提交,我可以稍后在它们“准备好迎接黄金时间”时进行合并,并留下一个一堆小的“这不是我想要的,但它是进步”在我正在进行的工作中的提交有助于解决这个问题。 最终,我运行了一个git rebase -i或一系列的命令来对小型提交进行排序和组合。

(不是为了让这成为对git stash的小咆哮,而是...... git stash本身通常很糟糕。避免它。)

事实证明这是一个错误。 使用 autostash 时,stash 应该自动弹出。 即使有冲突。 正如我所料。 今年早些时候(或去年)有人破坏了该功能。 我检查了 git 源代码的最新版本(“下一个”)。 弹出再次自动发生。

还有一个问题。 在弹出之后,并且在没有问题的情况下应用更改之后,我希望存储也会自动删除(丢弃)。 那不会发生。 我不知道这是故意的,还是一个错误。 我怀疑这是一个错误。 如果一切正常,为什么要保留藏匿处? 我敢打赌没有人知道,也没有人敢决定是否解决这个问题。

可悲的是:我问了一大群人当前的行为(没有自动弹出)是故意的还是错误的。 同事,安装/维护我们的 git 的人,我们内部的 git 支持人员,我们当地的 git 专家,我们的外部 git 支持团队。 和这里。 我得到了无数的答案。 他们没有一个是正确的。 大多数人甚至没有回答这个问题:“我不喜欢 rebase,我不喜欢 autostash,我不喜欢 stash,你为什么不做我所做的,那更好”。 没有人真正回答我的问题。 我不怪这里试图回答的人,但在逆流划船2个月后,我有点恼火。 对不起。

我很高兴我坚持了下来。 我很高兴这个问题很快就会得到解决。 现在唯一剩下的就是确保当我们不再需要它时,它会被丢弃。 如有必要,我会自己修复它并将修复提供给 git 存储库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM