私はちょうど好奇心からこれを求めています。実際の状況でこのような状況に対処する他の方法がありますが、私はgitの以下の動作が少し奇妙なことがわかります。stashからのRebasing、奇妙な結果
要約:Stashingは、カーテンの後ろに2つのコミットを作成します.1つはインデックスを含み、もう1つは追加されない編集を含みます。後者をチェックアウトしてリベースしようとすると、何らかの形でインデックスからの変更だけが得られます。何故ですか?
詳細な例は、次のとおりです。
まず、インデックスに追加されたもう一つの編集、インデックスに追加されていない、その後1本のより、編集、および隠し、1コミットでのレポを作成してみましょう:
git init
echo 1 > a.txt
git add a.txt
git commit -m"First commit"
echo 2 >> a.txt
git add a.txt
echo 3 >> a.txt
git stash
git log --all --graph --oneline
* 5c00fc0 WIP on master: c8af537 First commit
|\
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit
だから、git stash
は、自分のハッシュ(私の場合は、インデックスの場合は965c986、非追加の編集の場合は5c00fc0)を使用して、インデックスと追加されていない編集をコミットとして保存するようです。
今すぐ新しいファイルを編集し、コミット:
echo x >> b.txt
git add b.txt
git commit -m"Second commit"
ので、コミットのすべてが今のように見える:
git log --all --graph --oneline
* b589f50 Second commit
| * 5c00fc0 WIP on master: c8af537 First commit
| |\
|//
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit
言って、私たちは今、隠し編集を取り、それらを組み合わせたいです2回目のコミット。今
git checkout 5c00fc0
[warning message here]
cat a.txt
1
2
3
git rebase master
First, rewinding head to replay your work on top of it...
Applying: index on master: c8af537 First commit
しかし、結果のファイル:この(git stash apply
をのような、しかし、我々はすでに、その後スタッシュを洗浄し、いた場合REFLOGからコミット掘っ何)が、ちょうどで試してみましょうを行うには、他の方法があります。 a.txt
だけです:
cat a.txt
1
2
これは全体のグラフである:
git log --all --graph --oneline
* 5fc3ade index on master: c8af537 First commit
* b589f50 Second commit
| * 5c00fc0 WIP on master: c8af537 First commit
| |\
|//
| * 965c986 index on master: c8af537 First commit
|/
* c8af537 First commit
だから、リベースだけAP、我々は5c00fc0をコミットチェックアウトしていても、のように見えますコミット965c986からの変更、つまり、私たちが隠していたときのインデックスにあった編集を加えました。しかし、5c00fc0にあったものは無視されました。
質問:なぜですか?この行動のいくつかの合理的な説明がありますか?またはこれはバグと見なされるべきですか?
これはインデックスのコミットを無視する理由を説明していません。リベースは通常、マージコミットを削除しますが、マージされたコードが削除されるわけではありません。 – Ilion
インデックスコミットを無視しません。 –