16

この質問の短いバージョンは次のとおりgitです。自動マージをトリガーせずにスタッシュをポップするにはどうすればよいですか?


ではロングバージョンを…

に代わる次のおもちゃの例を考えてみましょうgit stash ... + git pull ... + git pop

まず、git status作業ディレクトリでの唯一の変更は、追跡されたファイルへの変更であることを示していますfoo

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   foo
#
no changes added to commit (use "git add" and/or "git commit -a")

ここで、作業ディレクトリをクリーンな状態にリセットするために、 を実行するための前提条件として、git pull変更したファイルの名前を一時的にfoo(追跡されていない名前に) 変更し、 のバージョンを復元fooHEADます ...

% mv foo foo.$(date +%Y%m%dT%H%M%S)
% git checkout foo
% git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   foo.20130508T110014
nothing added to commit but untracked files present (use "git add" to track)

では、 を実行しますgit pull。この例のために、これは早送りであると想定できます。

% git pull

最後に、一時的に名前を変更した を元に戻しfooます。

% mv foo.20130508T110014 foo

...そして私は戻ってきました

% git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   foo
#

これは a の「道徳的同等物」ですがgit stash save + git pull + git stash pop、後者ではなく前者が次のように「マージ競合」の影響を受けないことを除きます。

% git stash save 'WIP'
% git pull
% git stash pop
Auto-merging foo
CONFLICT (content): Merge conflict in foo

自動マージをトリガーせずに、をrename-checkout-pull-rename使用して上記のシーケンスを複製するにはどうすればよいですか?git stash save + ... + git stash pop

ちなみに、このrename-checkout-...-renameルーチンは、私が というコマンドに期待するものをより厳密に表していstashます。つまり、作業ディレクトリの状態を今保存し、後で置き換えます。この写真には「融合」はありません。

4

4 に答える 4

8

私は遅ればせながらgit、この質問の動機となった問題 (つまり、リポジトリを「未マージ状態」にする可能性のある自動マージ) に対する非常に単純な解決策をすでに提供していることに気付きました。

必要なのは、使用することだけです

git stash branch <branchname> [<stash>]

git stash pop(または)の代わりにgit stash apply。は、隠した変更を適用する目的で<branchname>作成された新しいブランチの名前です。git

これにより、競合が発生しないことが保証された方法でスタッシュがポップされます。

于 2014-02-08T19:12:59.313 に答える
5

stashマージ、それがまさにその仕組みです。

と を使用して、非マージ y スタッシュを実現できwrite-tree read-treeますcheckout-indexこれを実行して元のテスト環境を実現する実際の例を次に示します

マージなしのスタッシュをブルートフォースで適用するには、次のようにします。

git read-tree stash^{tree}
git checkout-index -af
于 2013-05-08T21:47:38.953 に答える
3

OK、次のようなことに遭遇した後:

% git stash pop
Auto-merging foo
CONFLICT (content): Merge conflict in foo
Auto-merging bar
CONFLICT (content): Merge conflict in bar
Auto-merging baz
CONFLICT (content): Merge conflict in baz
...

# $#@?!?!%$!*@#...

...私が思いついた最善の解決策は、次のように応答することです。

% git checkout --theirs $(git diff --name-only --diff-filter=U)
% git reset
% git stash drop

(この回答に基づく。)

于 2013-05-08T21:19:11.853 に答える
2

マージの競合が発生しているということはfoo、サーバーからプルしたファイルに変更があったことを意味します。したがって、ファイルをコピーして元に戻すと、fooファイル内のリポジトリからすべての変更が完全に削除されます。あなたがそれをコミットすると、変更をコミットした相手fooはあなたを嫌うでしょう。

あなたの質問に対する答えは、何を達成しようとしているのかによって異なります。サーバー上の変更がコードと比較されていることを確認しようとしていますか? 完了するまで、他の人のコードを扱うことを避けようとしていますか?

ブランチへの変更が何であったかを確認したいだけの場合は、git fetch代わりに使用git pullして、現在のコードをそれと比較できます。または、変更を今すぐマージしたくない場合は、別のブランチで作業するか、マージの準備ができるまでプルしないことを検討してください。

于 2013-05-09T17:03:04.080 に答える