2013-05-08 48 views
4

假设在运行git stash pop时,得到一条CONFLICT消息(由失败的自动合并尝试产生)。如何解决所有合并冲突以支持刚刚弹出的存储?

是否有快速告诉git解决全部有利于刚才弹出的存储的冲突?

编辑:我只写了下面的脚本来测试两个提议的替代方案。它

  1. 在目录/tmp/$1cd s创建一个新的git回购;
  2. 创建文件的第一个版本并提交它;
  3. 对文件进行一些更改并存储文件;
  4. 对文件进行其他更改(包括冲突和非冲突更改)并提交这些更改;最后
  5. 弹出藏匿

此设置阶段为两种相比较提出的方法。这里的脚本:

shopt -s expand_aliases 
alias gcommit='git commit -q --allow-empty-message -m ""' 
alias gmerge='git merge -q --no-edit' 

TESTDIR=/tmp/$1 
rm -rf "$TESTDIR" 
mkdir -p "$TESTDIR" 
cd "$TESTDIR" 

git init -q 
touch chiasmus.txt 
git add . && gcommit 

cat <<EOF > chiasmus.txt 
ask 

what 

... 
EOF 
gcommit -a 

cat <<EOF > chiasmus.txt 
ask 
not 
what 
your country can do for you 
... 
EOF 
git stash -q 

cat <<EOF > chiasmus.txt 
quote: 
ask 

what 
you can do for your country 
... 
jfk 
EOF 
gcommit -a 

git stash pop -q 

然后我跑

% bash gittest.sh checkout 
% bash gittest.sh merge 

% cd /tmp/checkout 
% git checkout --theirs $(git diff --name-only --diff-filter=U) 

% cd /tmp/merge 
% git reset -q --hard 
% git merge -q --no-edit --squash -Xtheirs stash 
Auto-merging chiasmus.txt 
Squash commit -- not updating HEAD 
Automatic merge went well; stopped before committing as requested 

% diff /tmp/{checkout,merge}/chiasmus.txt 
0a1 
> quote: 
5a7 
> jfk 

因此,它看起来像“结账”选项并失去了冲突的变更。然而,事实上,这个选项更贴近我之后的情况,也就是说,git pop的行为与我期望的更接近:回到我跑到git stash期间的时间段。没有自动合并等(IOW,我的问题,如问,果然没有准确地反映了我之后就好像meagar莫名其妙地了解我的想法。)

+0

你有git配置使用像KDiff3合并工具? – 2013-05-08 20:47:53

回答

2

只要自己合并,而不是藏匿流行。隐藏提交的名称为stash

git merge --squash -Xtheirs stash 
+0

谢谢。我决定接受你的答案,因为它更准确地匹配我实际要求的答案,尽管具有讽刺意味的是,meagar的解决方案更接近于我真正*后的...... – kjo 2013-05-09 20:30:28

+0

Heh。是的,我注意到你对我之前提到的问题的回答不满。我承认我认为我在那里给出的两个命令序列完全符合你在那里要求的。但是如果低级命令关闭了你,你也可以代替meagar的回答跳过隐藏弹出窗口和'git checkout stash - 。'尽管如此,仍然会跟踪您提交的提交中的任何新文件。 – jthill 2013-05-09 20:52:50

3

您需要为each file in conflict运行git checkout --theirs <file>

git checkout --theirs `git diff --name-only --diff-filter=U` 
+1

但是,如果有一个混合了冲突和非冲突的本地更改的文件,这将会放弃不冲突的更改吗? – jthill 2013-05-09 14:43:09

+1

编号'--diff-filter = U'将只显示未合并的更改,即标记为包含冲突的文件。 – meagar 2013-05-09 14:46:07

+1

检查他们的版本如何保存--ours版本中的非冲突变更区块? – jthill 2013-05-09 14:49:10