2017-09-20 47 views
0

所以,的Git藏匿流行 - 解決衝突與合併工具

我遇到這種突然的,因爲它在史詩浮躁的形式,呈現我的應用程序沒用,但混帳藏匿彈出(或應用)自動處理合並衝突。當它這樣做,它增加了兩個版本的文件,像這樣:

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

不知道該先損失了一些時間,因爲這些添加的行無效的XML文件。

所以,我想知道是否有一種方法來強制git存儲不自動合併,但離開衝突的地方,使他們可以與git mergetool解決,而不是要求我打開每個文件編輯器並處理「merte」進程而沒有爲合併衝突設計的工具的好處。

感謝 Jaeden「SIFO DYAS」 al'Raec Ruiner

回答

1

通過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