2013-05-08 44 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