如何让git merge处理我工作树的未提交更改?

Jer*_*amp 48 git git-stash git-merge

一位同事和我现在都在主分公司工作.我在工作树中有一些我不想提交的代码(调试语句等).现在,如果他对某些相同的文件进行更改,我就无法合并它们:

$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.
Run Code Online (Sandbox Code Playgroud)

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

我发现在git中这样做的最快方法是:

$ git stash
$ git merge origin/master
$ git stash pop
Run Code Online (Sandbox Code Playgroud)

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

Dus*_*tin 39

忘掉你从颠覆中学到的一切.

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

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

如果你承诺,你可以.如果你不这样做,你就会受苦.

记住:你犯了什么不是你推什么,但你不承诺,你可以很容易失去.

只做安全和轻松的事情,尽早提交并经常提交.

  • 您可以使用"rebase -i"重新排序提交,并将调试语句的介绍移到最后. (3认同)
  • 所以我提交我的调试语句然后合并.然后我做了一些我想推动的真正改变.我如何得到我的调试语句,现在我要提交的东西依赖于那个提交? (2认同)

Nor*_*sey 21

据我所知,你能做的最好的就是你已经拥有的东西git stash.我也觉得奇怪,合并只想处理干净的树木.

  • Casabash:如果没有冲突就无法应用它,那么git stash pop不会删除它.然后在你没有本地更改时再次运行miniscript.Git stash是一个noop,然后是git merge,然后再次弹出旧的stash ...... (10认同)
  • 我将把它放在我的.bashrc:gm(){git stash; git merge $ @; git stash pop}然后等着看我需要多长时间才能咬我的屁股. (3认同)

Leo*_*lez 6

  • 如果本地工作未提交
    • 并且您引入了远程分支中不存在的全新文件:
    • 或者受您本地工作影响的文件与受您需要从远程拉取的更改影响的文件零重叠:
      • 你很幸运: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