4

假设在运行时git stash pop,收到一条CONFLICT消息(由于自动合并尝试失败)。

有没有一种快速的方法来git解决所有冲突以支持刚刚弹出的存储?

编辑:我刚刚编写了以下脚本来测试提出的两种替代方案。它

  1. 在目录中创建一个新的 git 存储库/tmp/$1,并cds 到它;
  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以某种方式读懂了我的想法。)

4

2 回答 2

3

您需要git checkout --theirs <file>每个冲突文件运行:

git checkout --theirs `git diff --name-only --diff-filter=U`
于 2013-05-08T20:56:08.483 回答
2

只需自己进行合并,而不是存储弹出。存储提交名为stash.

git merge --squash -Xtheirs stash
于 2013-05-09T13:49:20.513 回答