的Git藏匿流行 - 解决冲突与合并工具

问题描述:

所以,的Git藏匿流行 - 解决冲突与合并工具

我遇到这种突然的,因为它在史诗浮躁的形式,呈现我的应用程序没用,但混帐藏匿弹出(或应用)自动处理合并冲突。当它这样做,它增加了两个版本的文件,像这样:

<<<<<<< Updated [remote] 
    Change from Remote 
======= 
    Change from Stash 
>>>>>>> Stashed changes 

不知道该先损失了一些时间,因为这些添加的行无效的XML文件。

所以,我想知道是否有一种方法来强制git存储不自动合并,但离开冲突的地方,使他们可以与git mergetool解决,而不是要求我打开每个文件编辑器并处理“merte”进程而没有为合并冲突设计的工具的好处。

感谢 Jaeden“SIFO DYAS” al'Raec Ruiner

通过git stash apply - 这所使用的合并进程是git stash pop上半年-is同任何其他的合并,在留下的影响方面:

$ git status 
On branch master 
nothing to commit, working tree clean 
$ git log --all --decorate --oneline --graph 
* f9a96c0 (HEAD -> master) conflicting changes for stash 
| * 069a595 (refs/stash) WIP on master: 6fee57d add file "file" 
| |\ 
|// 
| * c466c42 index on master: 6fee57d add file "file" 
|/ 
* 6fee57d add file "file" 
* 2353af8 initial 

在这一点上,无论我跑git stash applygit stash pop,我得到一个合并冲突,然后处理终止(没有做的git stash pop下半年):

$ git stash apply 
Auto-merging file 
CONFLICT (content): Merge conflict in file 
$ git reset --hard HEAD 
HEAD is now at f9a96c0 conflicting changes for stash 
$ git stash pop 
Auto-merging file 
CONFLICT (content): Merge conflict in file 
$ git stash list 
[email protected]{0}: WIP on master: 6fee57d add file "file" 

在指数目前什么是未合并状态,以文件file目前各3份:

$ git ls-files --stage 
100644 239c0dc4252320079890fff28cd408eb825776f5 0 README 
100644 2983120c0897fea017d8398b5ffdc5e3ef0e17ad 1 file 
100644 27b6da381575999c9ba975e9df9ba6caa45e3165 2 file 
100644 080f90d42698e258e3efa8059c78ebfd5fdd7bd8 3 file 

git mergetool是很愿意在这一点上运行:

$ git mergetool 
[snip configuration complaint - I never use git mergetool 
so it is not configured] 
Merging: 
file 

Normal merge conflict for 'file': 
    {local}: modified file 
    {remote}: modified file 
Hit return to start merge resolution tool (bc): 

所以,我想知道是否有办法执行git存储不自动合并,但离开冲突到位...

此时文件的所有三个版本都存在于索引中。其中只有两个,--ours(通常与HEAD提交版本相同)和--theirs(本例中为存储提交版本)具有方便的git checkout命令语法,但您也可以使用:<number>:path语法提取合并基本版本。运行git mergetool可以为您提供基础,左侧/本地/ ours和右侧/远程/ theirs版本 - 就在运行配置的合并工具之前。

因此,我不确定你的问题是什么。

+0

同意。这是非常标准的版本控制系统行为。 – Mort

+0

好吧,当我运行git merge,比如说revision_5分支并开发分支,并且假设存在冲突。它会尝试自动合并。如果它可以很好,但如果不是,它不会在文件中添加他们和我们的恼人标签,它只会将它们都留下,并且命令行中的活动分支变成(开发|合并)。你是说,即使这不会发生与Git存储应用,它只是将两个版本合并到单个文件,git mergetool仍然会运行,并允许我修复合并? – JaedenRuiner

+0

在* all *合并冲突的情况下,Git应该像这样标记工作树文件。原始文件全部存储在索引中,因此,您可以使用* 5 *个活动版本(HEAD;索引阶段1,2,3和4)来替代通常的三个活动版本的文件(HEAD,索引阶段0,工作树) 3;工作树)。通过采用工作树版本,在其中一条路径上运行'git add'或'git rm',可以将三个高阶索引阶段副本还原到单阶段0索引副本。如果git mergetool脚本认为它运行的工具成功,那么'git mergetool'脚本会为你运行'git add'。 – torek