56

我和一位同事目前都在 master 分支上工作。我的工作树中有一些我不想提交的代码(调试语句等)。现在,如果他对其中一些相同的文件进行更改,我将无法合并它们:

$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.

来自颠覆背景,我习惯于在我从存储库中提取更改时自动合并我的工作树,如果有冲突,我会手动解决它们。

我发现在 git 中执行此操作的最快方法是:

$ git stash
$ git merge origin/master
$ git stash pop

本质上,删除我未提交的更改,进行合并,然后重新应用更改。如何告诉合并自动将我的工作树与我试图引入的更改合并?

4

4 回答 4

45

忘记你从颠覆中学到的一切。

在引入外部更改之前始终提交。

想象一下,你有一棵大部分工作的树——也许并不完美,但你正在取得一些进展。然后你去做一个合并,你引入的代码只是造成了严重破坏(本身就是错误的,太多的冲突需要处理,等等......)。如果您可以撤消它,那不是很好吗?

如果你承诺,你可以。如果你不这样做,你只会受苦。

记住:你提交的不一定是推动的,但你不提交的很容易丢失。

只需做安全和简单的事情,尽早提交并经常提交。

于 2009-05-02T01:45:08.777 回答
24

据我所知,你能做的最好的就是你已经拥有的git stash。我也觉得奇怪的是 merge 只想处理干净的树。

于 2009-05-02T00:35:41.063 回答
8
  • 如果本地工作未提交
    • 而且您引入了远程分支中不存在的全新文件:
    • 或者受本地工作影响的文件与受您需要从远程提取的更改影响的文件有零重叠:
      • 你很幸运:git pull会“正常工作”
    • 除此以外:
      • 如果您的本地更改与您正在提取的更改没有重叠:
        • git stash 将起作用:
          • git stash save
          • git pull
          • git stash pop
      • 如果您的本地更改与您正在提取的更改有一些重叠:
        • git stash 需要手动解决冲突:
          • git stash save
          • git pull
          • git stash pop
          • 解决合并冲突
          • git reset
          • git stash drop
  • 如果提交本地工作
    • 并且受本地工作影响的文件与受本地工作影响的文件有零重叠
      • 你很幸运:git pull会“正常工作”
      • 但是:git pull --rebase由于历史更清晰,将“工作得更好”
      • 没有合并提交;您的更改将在上游更改后提交
    • 除此以外:
      • git pull 需要手动解决冲突:
        • git pull
        • 解决合并冲突
        • git add FILE对于每个冲突的文件
        • git commit
      • git pull --rebase由于历史更清晰,仍然可以“工作得更好”
        • 但是,解决合并冲突可能要困难得多

详细解释请看:https ://happygitwithr.com/pull-tricky.html

于 2019-03-19T01:50:59.780 回答
2

您无法告诉git merge合并对本地存储库有更改的文件的更改。这可以防止您在合并失败时丢失您的更改。

使用 CVS 和 SVN 合并方法,如果您在更新之前没有手动复制文件并且在合并时将它们打乱,您必须手动重新编辑才能恢复到良好状态。

如果您在进行合并之前提交您的更改或存储它们,那么一切都是可逆的。如果合并不顺利,您可以尝试几种方法来解决问题,然后选择效果最好的一种。

如果您确实提交了实验性或调试更改,您可能会git rebase在您通过的提交之后移动它们,git merge以便更容易摆脱它们或避免将它们意外推送到存储库。

请注意,git rebase在您已推送到共享存储库的分支上使用将使从该存储库中提取的每个人都感到悲痛。

我更喜欢git stash在这些情况下使用它,但我只在合并更改我已编辑但未提交的文件时使用它。

于 2010-01-22T14:05:03.883 回答