Gitの作業ディレクトリの変更を保持しながら変更を隠します


145

git stash変更を隠し、作業ディレクトリにも保持するコマンドはありますか?だから基本的にgit stash; git stash applyは一歩で?




1
@MariuszPawelskiいいえ、そうではありません。その質問は私の質問よりも具体的です。私の質問への答えは単に「いいえ」でした。しかしリンクをありがとう、それは一部の人々、または後で私自身にも役立つかもしれません。
Michael Dorst

明確にするために、ファイルに手を付けずにおく必要がないので、私の質問は異なります。私は単にに代わるものを探していましたgit stash && git stash apply。その質問への答えが私のものとはかなり違うことに気づくでしょう。
Michael Dorst

ああ、そうですね、あなたの質問は少し具体的ではありません。しかし、その答えもあなたの要件を満たすので、私はその質問を入れました。そうすれば、この質問はサイドバーに「リンク済み」として表示されるので、誰かに役立つかもしれません。
Mariusz Pawelski

回答:


156

価値があることについて、これを行う別の方法は、保持したい変更をステージングしてから、次のものを使用してすべてを隠しておくことです--keep-index

$ git add modified-file.txt
$ git stash push --keep-index

上記のコマンドはすべてを隠しますが、作業ディレクトリにファイルがステージングされたままになります。

以下からの公式のLinuxカーネルGitのドキュメントgit stashまたはからのgit-SCM

この--keep-indexオプションを使用すると、インデックスに既に追加されているすべての変更がそのまま残ります。


3
これは、これまで見てきた--keep-indexの最も簡単な説明です。私はそれがドキュメントに書かれている方法でかなりの意味を理解していませんでした。
40刑事

52

git stashその後、git stash applygit stash && git stash apply)のファイルを隠しておくと、その直後にスタッシュを適用します。したがって、結局のところ、変更はstashと作業ディレクトリにあります。

必要な場合は、エイリアスを作成できます。このようなものを置くだけです~/.gitconfig

[alias]
    sta = "!git stash && git stash apply"

このアプローチの欠点は、すべてのファイルが隠されて再作成されることです。これは、問題のファイルのタイムスタンプが変更されることを意味します。(私がを実行する前にファイルを開いた場合、ファイルを保存しようとするとEmacsが文句を言うgit staので、あなたmakeや友人が使用している場合は不要な再構築が発生する可能性があります。)


1
また、違いは何であるgit stash; git stash applyとはgit stash && git stash apply
Michael Dorst 2013


2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"はそれを行うべきです。

どのように私はこのエイリアスを使用するように変更することができgit stash save、引数とし、それからやりますかgit stash apply
spinningarrow

1
@ JaySidri、bangは、実際にはgit引数自体ではなく、外部コマンドであることを意味します。docsによると:「ご存知のように、Gitは新しいコマンドを別名を付けたものに置き換えます。ただし、Gitサブコマンドではなく外部コマンドを実行したい場合があります。その場合、コマンドを! キャラクター。"
madhead

10

実用的に使用される可能性がある回答の小さな拡張。

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

注:「git add」なしでは機能しません(たとえば、変更されたがコミットファイルに追加されなかった場合)
alex_1948511 '29

4

秘訣ではなくFWIWが役立つかもしれないトリックがあります:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

そして今、あなたはあなたの自由に使えるコミットタグ付きスタッシュを持っgit stash popています、とにかくそれを行うことは不可能ですが、そこからパッチの作成やファイルのリセットなどのことを行うことができ、作業中のdirファイルもそのままです。


2

を使用git stash createしてstashコミットを作成し、次を使用してstashに保存できますgit stash store

git stash store $(git stash create) -m "Stash commit message"

これをgitエイリアスに保存すると、より便利になります。

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

これはすべてのことを行うわけではないことに注意してくださいgit stash push。たとえば、ブランチ名をコミットに追加しません(例: " stash@{0}: On myBranch: Stash commit message")。


1
これ大好き!しかし一つの補正は:man git-stash言う-m <message>コミットハッシュの前に来る必要があります。最新のgitで何か変更がある場合を除きます。
タニウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.