如何使 git merge 处理对我的工作树的未提交更改?
题
我和一位同事目前都在主分支上工作。我的工作树中有一些我不想提交的代码(调试语句等)。现在,如果他对其中一些相同的文件提交更改,我将无法合并它们:
$ 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
本质上,删除我未提交的更改,进行合并,然后重新应用更改。我如何告诉 merge 自动将我的工作树与我试图引入的更改合并?
解决方案
据我所知,您可以做的最好的事情就是 git stash
。我也觉得奇怪,合并只想处理干净的树木。
其他提示
忘掉你从颠覆中学到的一切。
在引入外部更改之前始终提交。
想象一下,你有一棵大部分工作的树 - 也许并不完美,但你正在取得一些进展。然后你去做一个合并,你带来的代码只会造成严重破坏(本身就是错误,需要处理的冲突太多等等)。如果你能撤消它会不会很好?
如果你承诺,你可以。如果你不这样做,你就会受苦。
请记住:你所提交的内容 并不是你推送的内容,但是你不提交的内容很容易丢失。
做好安全和轻松的事情,尽早提交并经常提交。
- 如果本地工作未提交
- 并且您引入了远程分支中不存在的全新文件:
- 或者受本地工作影响的文件与受您需要从远程拉取的更改影响的文件零重叠:
- 你很幸运:
git pull
会“正常工作”
- 你很幸运:
- 否则:
- 如果您的本地更改与您正在拉取的更改没有重叠:
- git stash 将起作用:
git stash save
git pull
git stash pop
- git stash 将起作用:
- 如果您的本地更改与您正在拉取的更改有一些重叠:
- git stash 将需要手动解决冲突:
git stash save
git pull
git stash pop
- 解决合并冲突
git reset
git stash drop
- git stash 将需要手动解决冲突:
- 如果您的本地更改与您正在拉取的更改没有重叠:
- 如果致力于本地工作
- 并且受本地工作影响的文件与受影响的文件零重叠
- 你很幸运:
git pull
会“正常工作” - 然而:
git pull --rebase
由于历史更清晰,将会“工作得更好” - 没有合并提交;您的更改将在上游更改之后提交
- 你很幸运:
- 否则:
- git pull 将需要手动解决冲突:
git pull
- 解决合并冲突
git add FILE
对于每个冲突的文件git commit
git pull --rebase
由于历史更清晰,仍然可以“工作得更好”- 然而,解决合并冲突可能要困难得多
- git pull 将需要手动解决冲突:
- 并且受本地工作影响的文件与受影响的文件零重叠
您无法告诉 git merge
合并对本地存储库进行更改的文件的更改。这可以防止您在合并失败时丢失更改。
使用CVS和SVN合并方法,如果您没有在更新之前手动复制文件并且在合并时将它们加扰,则必须手动重新编辑才能恢复到良好状态。
如果您在进行合并之前提交更改或存储它们,则一切都是可逆的。如果合并不顺利,你可以尝试几种方法使其成功,并选择效果最好的方法。
如果您确实提交了实验或调试更改,您可以使用 git rebase
在通过 git merge
提交之后移动它们,以便更容易摆脱它们他们或者为了避免意外地将他们推到存储库。
请注意,在已推送到共享存储库的分支上使用 git rebase
会让每个从该存储库中拉出来的人感到悲伤。
在这些情况下,我更喜欢使用 git stash
,但如果合并更改了我已编辑但未提交的文件,我只会使用它。