【问题标题】:Why can't I git pull with irrelevant local changes?为什么我不能 git pull 不相关的本地更改?
【发布时间】:2018-09-26 15:54:04
【问题描述】:

在git中,如果你有任何未提交的修改,你不能做git pull,给出以下错误:

错误:无法使用 rebase 拉取:您有未暂存的更改。

错误:请提交或隐藏它们。

但它适用于未跟踪的文件。我发现这非常烦人,每次我想要拉取时我都需要git stash,即使我的更改与被拉取的文件无关。

如果我的更改与拉取的更改不冲突,是否有任何解决方法允许拉取?我真的不明白为什么如果拉动不会破坏任何东西,它为什么不起作用。如果这是一个安全问题,那么为什么它适用于新文件?理论上,拉取可以引入相同路径的新文件。

有没有什么办法可以让它变得更简单?

【问题讨论】:

  • 希望在您第一次尝试拉动时看到您的脸,并且与您在工作树上修改的文件发生冲突。换句话说,git 正在看着你,以免弄乱修改后的文件。
  • 从 Git 2.6 开始的一个选项是使用git fetch; git rebase --autostash(或设置git config rebase.autoStash true)在变基之前自动存储更改并在变基完成后弹出。如果与 pop 有任何冲突,您将留下未解决的冲突以及 rebase 之前名为 autostash 的存储;从那里您可以像往常一样解决冲突。

标签: git git-pull


【解决方案1】:

您可以使用git pull --rebase --autostash。这实质上是存储您的本地更改,从远程获取,在其之上进行 rebase,然后在一个命令中弹出存储。

请注意,您还可以将这些标志配置为默认行为:

$ git config pull.rebase true
$ git config rebase.autoStash true

但权力越大,责任越大,只有在你完全确定自己在做什么时才使用此选项。

【讨论】:

  • 这听起来像是个主意。如果有任何冲突的文件,我宁愿被警告,否则合并。
【解决方案2】:

应注意,此行为取决于您的配置。当使用默认的 pull 行为 - “获取和合并” - 您可以进行本地更改,只要更改合并不影响与本地更改相同的文件,pull 仍然可以工作。

但是在做rebase 时,git 更加谨慎。您可以争论这是否有必要,或者它是否更受rebase 中涉及的技术细节的推动,也许您认为用户不应该关心这些。但无论如何,这是git的行为。

如果您真的希望这是自动的,您可以使用自动存储。最简单的方法是说

git pull --autostash

如果您希望它更加自动化,您可以将rebase.autostash 配置值设置为true。但是,这使得自动存储成为配置值范围内 all 变基的默认值(即在 repo 中,或者如果您使用 --global 选项配置它,则在您的机器上)。这意味着当您使用脏工作树进行 rebase 时,您将获得 rebase 尝试(以及可能难以解决的冲突)。 autostash 被认为是“谨慎使用”选项,因此我不建议将其配置为默认值。

就此而言,即使您只是在pull 上使用--autostash 参数,您也应该小心。只是您正在执行基于 rebase 的拉取这一事实被记录为“潜在危险”,因此您需要确保在将 autostash 分层时知道自己在做什么。

【讨论】:

  • 有时我希望 git 更抽象一点,而不是作为一个原始工具。
猜你喜欢
  • 2016-11-02
  • 2020-06-08
  • 2018-02-15
  • 2016-12-11
  • 2021-06-06
  • 2012-05-11
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
相关资源
最近更新 更多