Gitで変更された複数のファイルから1つのファイルのみを隠しますか?


3071

ブランチで複数の変更されたファイルの1つだけを隠しておくにはどうすればよいですか?


109
@bukzorの承認された答えは、質問されたとおりの質問に対する正しい答えではないと思います。git stash --keep-indexインデックスは保持されますが、インデックス内とアウトの両方ですべてが隠されます。
Raman

@Antonio元の質問はTortoiseGitとは特に関係がないため、賞金は実際には別の質問でなければならないようです。
JesusFreke 2015

1
@JesusFrekeええ、結果を考えれば、50 repを免れることができたでしょう:)これは、「部分的なstash tortoisegit」を検索しようとした場合にリダイレクトされる質問です。Tortoisegitはここでは人気のトピックではないようです。stackoverflow.com/ questions / tagged / tortoisegit
Antonio

7
>>>>>>>>> git diff -- *filename* > ~/patchその後git checkout -- *filename*、後でパッチを再適用できますgit apply ~/patch
neaumusic

36
以下の既存の回答のほとんどは古くなっています。Git 2.13(2017年第2四半期)以降、でサポートされていgit stash push [--] [<pathspec>...]ます。
Ohad Schneider 2017

回答:


1372

免責事項:次の回答はgit 2.13より前のgitに関するものです。git 2.13以降については、さらに下の別の回答をご覧ください。


警告

コメントで述べたように、これにより、ステージングされたものとステージングされていないものの両方がすべてスタッシュに入れられます。--keep-indexは、スタッシュが行われた後、インデックスをそのままにします。これにより、後でスタッシュをポップしたときにマージの競合が発生する可能性があります。


これにより、以前に追加していないすべてが隠されます。ただ、git addあなたがそれを実行し、維持したいもの。

git stash --keep-index

たとえば、古いコミットを複数のチェンジセットに分割する場合は、次の手順を使用できます。

  1. git rebase -i <last good commit>
  2. 一部の変更をとしてマークしeditます。
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. 必要に応じて修正してください。git add変更を忘れないでください。
  7. git commit
  8. git stash pop
  9. 必要に応じて、#5から繰り返します。
  10. git rebase --continue

47
私は、このアプローチは、はるかに簡単であることがわかりました:stackoverflow.com/a/5506483/457268
k0pernikus

561
なぜこれが支持されているのかはわかりません。誰もが私とは異なる期待を持っている必要があります。元の投稿は「コミットされていない変更の一部だけを隠しておくにはどうすればよいですか?」私が使用する場合git stash save -k、はい、インデックス(の緑git stat)は保持されますが、変更セット全体(緑と赤の両方)が隠されます。これはOPの「一部の変更のみを隠す」という要求に違反します。赤の一部だけを隠しておきたい(将来の使用のため)。
ピストス

70
あなたは(私があったように)@Pistosによってもたらされる質問への回答で、より興味を持っている場合は、ここを見て:stackoverflow.com/questions/5506339/...
ラマン

27
@ラマン:すばらしい! git stash -pまさに私が探していたものです。このスイッチがつい最近追加されたのだろうか。
ピストス2013

14
警告:git stash --keep-index壊れています。さらに変更を加えた場合は、git stash pop後で保存しようとすると、保持していないファイルだけでなく、変更したファイルがstashに含まれるため、マージの競合が発生します。たとえば、Aの変更をテストしたいので、ファイルAとBを変更してからBを隠します。Aの問題を見つけて修正します。私はAをコミットします。古いバージョンのAがマージの競合を引き起こす正当な理由がないので、私は元に戻すことができません。私は基本的にして失うB.を放棄しなければならないので、実際のAとBには、多くのファイル、おそらく二値画像か何かかもしれない
rjmunro

3015

も使用できますgit stash save -p "my commit message"。この方法で、スタッシュに追加するハンクを選択でき、ファイル全体も選択できます。

ハンクごとにいくつかのアクションが表示されます。

   y - stash this hunk
   n - do not stash this hunk
   q - quit; do not stash this hunk or any of the remaining ones
   a - stash this hunk and all later hunks in the file
   d - do not stash this hunk or any of the later hunks in the file
   g - select a hunk to go to
   / - search for a hunk matching the given regex
   j - leave this hunk undecided, see next undecided hunk
   J - leave this hunk undecided, see next hunk
   k - leave this hunk undecided, see previous undecided hunk
   K - leave this hunk undecided, see previous hunk
   s - split the current hunk into smaller hunks
   e - manually edit the current hunk
   ? - print help

5
そうではありませんでした。それは事実の約7年後、ダークスから借りられました。
名目

6
私はTortoiseGitの常習者です。ただし、TortoiseGitはサポートしていませんstash -p。これが最もインタラクティブ/ユーザーフレンドリーであり続けるため、私はこの回答を授与します。
アントニオ

27
追加したいかもしれません:git stash save -p my stash message; 議論の順序はあまり直感的ではないので...
Chris Maes

15
これとの間でgit log -p-pフラグは「自分がやりたいことをするが、表現方法がわからない」という意味である必要があると思います。
カイルストランド

2
なぜこの素晴らしい答えは12位にあるのですか?結局のところ、それらの0、+ 1、+ 2の答えは??????
DenisFLASH 2018年

550

gitは基本的にすべてのリポジトリのコンテンツとインデックス(および1つまたは複数のファイルgit stashではない)を管理することを目的としているため、驚くことではありませんが、すべての作業ディレクトリ

実際、Git 2.13(2017年第2四半期)以降、次のコマンドで個々のファイルを隠しておくことができますgit stash push

git stash push [--] [<pathspec>...]

pathspec' git stash push' が指定された場合、新しいstashは、パス仕様に一致するファイルについてのみ変更された状態を記録します。詳細については、「特定のファイルへの stashの変更」を参照してください。

簡略化した例:

 git stash push path/to/file

この機能のテストケースでは、さらにいくつかのオプションがオフになっています。

test_expect_success 'stash with multiple pathspec arguments' '
    >foo &&
    >bar &&
    >extra &&
    git add foo bar extra &&

    git stash push -- foo bar &&   

    test_path_is_missing bar &&
    test_path_is_missing foo &&
    test_path_is_file extra &&

    git stash pop &&
    test_path_is_file foo &&
    test_path_is_file bar &&
    test_path_is_file extra

元の答え(以下、2010年6月)は、隠しておくものを手動で選択することでした。

Casebashのコメント:

これ(stash --patch元の解決策)は素晴らしいですが、多くの場合、多くのファイルを変更したため、パッチの使用は面倒です

bukzor回答(2011年11月に賛成)は、
git add+git stash --keep-indexに基づいたより実用的な解決策を示唆しています。
彼の答えを見て賛成投票してください。これは(私の代わりに)公式の答えになるはずです。

そのオプションについて、chhhはコメントで代替ワークフローを指摘しています。

git reset --soft明確なステージングを取得するには、このようなstashの後に" "を実行する必要があります。
元の状態に戻るには、ステージング領域が明確であり、ステージングされていない変更をいくつか選択するだけで、取得するインデックスをソフトにリセットできます(あなたのような何かを犯す-bukzor-しました)。


(2010年6月の元の回答:手動スタッシュ)

しかし、git stash save --patchあなたはあなたが後の部分的な隠蔽を達成することを可能にするでしょう:

を使用すると--patch、HEADと隠しておく作業ツリーの差分から、対話的にハンクを選択できます。
stashエントリーは、そのインデックス状態がリポジトリのインデックス状態と同じになるように構築され、そのワークツリーには、インタラクティブに選択した変更のみが含まれます。次に、選択した変更がワークツリーからロールバックされます。

ただし、これにより、完全なインデックス(既にインデックスが作成されている他のファイルが含まれている可能性があるため、必要なものではない可能性があります)と部分的なワークツリー(隠しておきたいファイルのように見える可能性があります)が保存されます。

git stash --patch --no-keep-index

より良い適合かもしれません。


--patch動作しない場合は、手動プロセスで次のようになる可能性があります。

1つまたは複数のファイルの場合、中間的な解決策は次のとおりです。

  • それらをGitリポジトリの外にコピーします
    (実際、eleotlecram興味深い代替案を提案しています
  • git stash
  • それらをコピーして戻します
  • git stash #今回は、必要なファイルのみが隠されます
  • git stash pop stash@{1} #すべてのファイルの変更を再適用
  • git checkout -- afile #ローカルで変更する前に、ファイルをHEADコンテンツにリセットします

そのやや面倒なプロセスの最後に、1つまたは複数のファイルのみが隠されます。


3
これはいいですが、多くのファイルを変更してきたため、パッチの使用は面倒です
Casebash

6
@VonC:回答ごとに1つだけ回答するのが良いスタイルです。また、他人の回答を自分自身にコピー・ペーストするのはマナーが悪い。
bukzor

3
@bukzor:編集した回答が不適切であると思われた場合は申し訳ありません。私の唯一の意図は、あなたの答えをより可視化することでした。その意図をより明確にするために、投稿を再度編集しました。
VonC、2011

1
@Kal:true、stackoverflow.com / a / 13941132/6309が示唆するgit reset(混合)
VonC

3
git is fundamentally about managing a all repository content and index and not one or several files-それは、解決される問題を覆す実装です。それは説明ですが、正当化ではありません。すべてのソース管理システムは、「複数のファイルの管理」に関するものです。最も賛成されているコメントを見てください。
Victor Sergienko、2015

90

ときにgit stash -p(またはgit add -pstash --keep-indexあまりにも面倒だろう)、私はそれが簡単に使用することが判明diffcheckoutapply

特定のファイル/ディレクトリのみを「スタッシュ」するには:

git diff path/to/dir > stashed.diff
git checkout path/to/dir

その後、

git apply stashed.diff

1
git add -p上記の私自身の回答で述べたIの興味深い代替案。+1。
VonC、2014

11
バイナリファイル(PNGなど)がある場合、それらはdiffファイルに出力されないことに注意してください。したがって、これは100%のソリューションではありません。
void.pointer 2014年

1
@RobertDailey:、私には面白いポイントだとして、git diff > file.diffそしてgit apply私のいつも部分スタッシュツールです。git stash -pより大きなチェンジセットへの切り替えを検討する必要があるかもしれません。
thekingoftruth 2014年

1
@thekingoftruthパッチファイルの作成に使用するエイリアスは次のとおりです。バイナリサポートされてますpatch = log --pretty=email --patch-with-stat --reverse --full-index --binary。ただし、パッチをコミットするには変更が必要です。
void.pointer 2014年

2
stashするファイルがのようなものである場合、これは私にとってはきれいに機能しませんでした../../foo/bar.txt。パッチは問題なく生成されますが、パッチを適用するためにリポジトリルートに移動する必要があります。したがって、これで問題が発生した場合は、リポジトリのルートディレクトリから実行していることを確認してください。
Michael Anderson

86

次のgit stash pushようにを使用します。

git stash push [--] [<pathspec>...]

例えば:

git stash push -- my/file.sh

これは、2017年春にリリースされたGit 2.13以降で使用できます。


1
しかし、私はgit stash pushすでに5月前の昨年3月の私の回答ですでに言及しています。そして、その新しいGit 2.13コマンドをここで詳しく説明します:stackoverflow.com/a/42963606/6309
VonC 2017

Gitが非常に速く進歩していることを嬉しく思います。長い間、これは不可能でしたが、2.13がリリースされ、突然、簡単な解決策が利用可能になりました!
sandstrom

1
@VonC正解です。正解についても言及しますが、2つの回答の間では、こちらの方が読みやすくなります(混乱しないテキストと例もあります)。多分彼らは代わりにあなたの答えを編集すべきだったのでしょう
Utopik 2018年

@Utopikあなたは「あなたが正しい」で私を迎えました...しかし、はい、私は例を含むように私の答えを編集しました。
VonC 2018年

次にgit stash apply、隠された変更を回復するために使用しますか?
チャド

49

あなたが3つのファイルを持っているとしましょう

a.rb
b.rb
c.rb

そして、あなたはb.rbとc.rbだけを隠しておき、a.rbは隠したくない

あなたはこのようなことをすることができます

# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp" 

# then stash the other files
git stash save "stash message"

# then undo the previous temp commit
git reset --soft HEAD^
git reset

これで完了です。HTH。


29

これを行う別の方法:

# Save everything
git stash 

# Re-apply everything, but keep the stash
git stash apply

git checkout <"files you don't want in your stash">

# Save only the things you wanted saved
git stash

# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}

git checkout <"files you put in your stash">

(もう一度)このページにアクセスした後、最初の2つの答えが気に入らなかった(最初の答えは質問に答えず、-pインタラクティブモードでの作業があまり好きではなかった)ので、これを思いつきました。

@VonCがリポジトリ外のファイルを使用して提案したのと同じ考え方です。必要な変更をどこかに保存し、不要な変更をスタッシュに削除してから、移動した変更を再度適用します。ただし、私はgit stashを「どこか」として使用しました(その結果、最後に追加の手順が1つあります。スタッシュに入れたカーブを削除します。これは、これらを邪魔にならないように移動したためです)。


1
私はこのアプローチが一番好きです。stashコマンドとrevertコマンドのみを使用して、tortoisegitで簡単なワークフローを提供します。
マークCh

ポジションを使用してSOに関する回答を参照することはお勧めできません。評価が変わると位置が変わります。
ブライアンアッシュ

2
@BryanAshまあ、それはここで重要なことではありません。私は他の答えを実際に参照するのではなく、逸話を出しています。メッセージは、コミュニティが好んだ回答が好きではなかったということであり、これらの回答に実際に含まれているものではありません。さらに、2番目と3番目の回答の900票のギャップにより、近い将来これが変更されることはほとんどありません。変更する必要がある場合は、いつでも編集して「その時点での回答の上位」と言うことができます。本当に、これがこのような状況でどのような問題であるかはわかりません。
Jasper

23

更新(2015年2月14日)-競合のケースをより適切に処理できるようにスクリプトを少し書き直しました。これにより、.rejファイルではなくマージされていない競合として表示されるようになりました。


@bukzorのアプローチの逆を行う方が直感的であることがよくあります。つまり、一部の変更をステージングし、それらのステージングされた変更のみを隠しておきます。

残念ながら、gitはgit stash --only-indexなどを提供していないため、これを行うためのスクリプトを作成しました。

#!/bin/sh

# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`

# create a commit with only the stuff in staging
INDEXTREE=`git write-tree`
INDEXCOMMIT=`echo "" | git commit-tree $INDEXTREE -p HEAD`

# create a child commit with the changes in the working tree
git add -A
WORKINGTREE=`git write-tree`
WORKINGCOMMIT=`echo "" | git commit-tree $WORKINGTREE -p $INDEXCOMMIT`

# get back to a clean state with no changes, staged or otherwise
git reset -q --hard

# Cherry-pick the index changes back to the index, and stash.
# This cherry-pick is guaranteed to succeed
git cherry-pick -n $INDEXCOMMIT
git stash

# Now cherry-pick the working tree changes. This cherry-pick may fail
# due to conflicts
git cherry-pick -n $WORKINGCOMMIT

CONFLICTS=`git ls-files -u`
if test -z "$CONFLICTS"; then
    # If there are no conflicts, it's safe to reset, so that
    # any previously unstaged changes remain unstaged
    #
    # However, if there are conflicts, then we don't want to reset the files
    # and lose the merge/conflict info.
    git reset -q
fi

上記のスクリプトをgit-stash-indexパスのどこかに保存して、それをgit stash-indexとして呼び出すことができます。

# <hack hack hack>
git add <files that you want to stash>
git stash-index

これでstashには、ステージングした変更のみを含む新しいエントリが含まれ、作業ツリーにはまだステージングされていない変更が含まれています。

場合によっては、作業ツリーの変更がインデックスの変更に依存することがあるため、インデックスの変更を隠しておくと、作業ツリーの変更が競合します。この場合、通常のマージされていない競合が発生し、git merge / git mergetool / etcで解決できます。


オススメpushdの代わりcdpopdスクリプトが成功した場合、ユーザーはそれを実行する前と同じディレクトリに終わるようにスクリプトの終わりに。
2015年

1
@Nate:私の知る限り、ユーザーがスクリプトを入手した場合にのみ、ユーザーのディレクトリを変更します。通常(〜/ bin / git-stash-index)またはgit(git stash-index)を介してスクリプトを実行すると、スクリプトは別のターミナルセッションで実行され、そのセッションでの作業ディレクトリの変更は影響しません。ユーザーのターミナルセッションの作業ディレクトリ。これが当てはまらない場合の一般的な使用例を知っていますか?(私が「ありふれた」とは思わないであろう脚本のソース以外)
JesusFreke 2015年

20

隠された変更を含むメッセージを指定したくない場合は、二重ダッシュの後にファイル名を渡します。

$ git stash -- filename.ext

追跡されていない/新しいファイルの場合は、最初にステージングする必要があります。

この方法はgitバージョン2.13以降で機能します


その答えは冗長です。これは簡潔です。それが誰かを助けるなら、私はそれを残します。このページの誰もこの構文と結果について言及していません-彼らは代わりに `git stash push`について言及しています。
シーローカル

これが私が探していた答えです。ありがとう!+1
nicodp

19

Gitでブランチを作成するのは簡単なので、一時的なブランチを作成して個々のファイルをチェックインするだけで済みます。


2
ステージングされていない編集でブランチを作成することはできません。すべての編集を新しいブランチ(スタッシュ/スタッシュポップ)に簡単に移動できますが、次にスクエアブランチに戻ります。これらの編集の一部のみを使用してブランチをテストし、他のブランチを失うことはありませんか?
bukzor

7
ローカルに変更がある場合、ブランチを切り替えることはできません。ただし、新しいブランチを作成し、ファイルを選択的に追加/コミットしてから、別のブランチを作成して、同じことを再帰的に行うことができます。次に、元のブランチをチェックアウトして、選択的にマージして戻します。本質的に機能ブランチを作成しているので、実際にはそれを行うのが自然な方法のようです。
iain

3
@iainマージを必要としない限り、ローカルに変更があればブランチを切り替えることができます。要旨の例を参照してください。これは、少なくともGit v2.7.0以降に当てはまります。
コリンDベネット、

18

あなたは単にこれを行うことができます:

git stash push "filename"

またはオプションのメッセージ

git stash push -m "Some message" "filename"

1
これは何も新しいものを追加しません。Git
スタッシュ

12

次のコードを、という名前のファイルに保存しますstash。使い方はstash <filename_regex>です。引数は、ファイルの完全パスの正規表現です。例えば、/ B / c.txtを隠し、するstash a/b/c.txtまたはstash .*/c.txt、等

$ chmod +x stash
$ stash .*.xml
$ stash xyz.xml

ファイルにコピーするコード:

#! /usr/bin/expect --
log_user 0
set filename_regexp [lindex $argv 0]

spawn git stash -p

for {} 1 {} {
  expect {
    -re "diff --git a/($filename_regexp) " {
      set filename $expect_out(1,string)
    }
    "diff --git a/" {
      set filename ""
    }
    "Stash this hunk " {
      if {$filename == ""} {
        send "n\n"
      } else {
        send "a\n"
        send_user "$filename\n"
      }
    }
    "Stash deletion " {
      send "n\n"
    }
    eof {
      exit
    }
  }
}

2
素晴らしい方法。私はこれを答えとして選んだでしょう。今後の読者のためのヒント:完全なパスで一致する必要があります。例:stash subdir / foo.c
er0

12

使用するたびに変更を破棄することを実際に意味する場合に備えてgit stash(そして実際にgit stashを使用して一時的に隠さないでください)、その場合は

git checkout -- <file>

【ご注意

これgit stashは、ブランチを作成したり、何かを実行したりするための、より迅速で単純な代替手段です。


8

VonCのGitリポジトリの外部にファイルをコピーする「中間」ソリューションの問題は、パス情報が失われることです。

コピーの代わりにtarを使用する方が簡単だと思います(類似のツールがおそらくそうでしょう)。

  • tar cvf /tmp/stash.tar path / to / some / file path / to / some / other / file(...など)
  • git checkout path / to / some / file path / to / some / other / file
  • git stash
  • tar xvf /tmp/stash.tar
  • など(VonCの「中間」の提案を参照)

checkout -f必要はありません、checkout(なしで-f)十分です、私は答えを更新しました。
eleotlecram

8

コミットする前に、ブランチに無関係な変更を加えたことがあります。それを別のブランチに移動して、個別に(マスターのように)コミットしたい場合があります。私はこれをします:

git stash
git checkout master
git stash pop
git add <files that you want to commit>
git commit -m 'Minor feature'
git stash
git checkout topic1
git stash pop
...<resume work>...

最初のstashstash popは削除できることに注意してください。すべての変更masterをチェックアウト時にブランチに引き継ぐことができますが、競合がない場合のみです。また、部分的な変更のために新しいブランチを作成する場合は、スタッシュが必要になります。

競合や新しいブランチがないと仮定して、これを簡略化できます。

git checkout master
git add <files that you want to commit>
git commit -m 'Minor feature'
git checkout topic1
...<resume work>...

隠しておく必要さえない...


8

これは、SourceTreeを使用して3つのステップで簡単に実行できます。

  1. 隠したくないすべてのものを一時的にコミットします。
  2. Gitは他のすべてを追加し、それを隠します。
  3. git resetを実行して一時コミットをポップし、一時コミットの前にコミットをターゲットにします。

これはSourceTreeでほんの数秒で実行でき、追加するファイル(または個々の行)をクリックするだけです。追加したら、それらを一時的なコミットにコミットします。次に、チェックボックスをクリックしてすべての変更を追加し、次にstashをクリックしてすべてを隠します。隠された変更を邪魔にならないようにして、コミットリストを見て、一時的なコミットの前にコミットのハッシュを確認します。次に、 'git reset hash_b4_temp_commit'を実行します。これは、ブランチをその直前にコミットします。これで、隠したくないものだけが残ります。


8

私は使用しますgit stash save --patch。ファイル全体に目的の操作を適用するためのオプションがあるため、対話性が煩わしいとは思いません。


3
この答えの裏付けがほとんどないことに驚かされ、それはエッセイを必要としない最高のソリューションです。
robstarbuck 2017

間違いなく良い答えは、git stash -pファイル全体をすばやく隠して、後で終了できるようにすることです。
Richard Dally

7

ここでのすべての答えはとても複雑です...

これを「隠しておく」とは何ですか。

git diff /dir/to/file/file_to_stash > /tmp/stash.patch
git checkout -- /dir/to/file/file_to_stash

これはファイルの変更を元に戻すためのものです:

git apply /tmp/stash.patch

1つのファイルをスタッシュして再びポップするのとまったく同じ動作。


試しましたが何も起こりません。私はときにgit apply私はエラーを持っていませんが、変更はどちらも持ち帰っていないされていません
ClementWalter

/ tmpに生成したパッチファイルはおそらく削除されました。差分と適用の間で再起動した可能性があります。別のより永続的な場所を試してください。それは動作します。パッチファイルの内容も確認してください。
クリストフフォンダッチ2017

4

私はこれと同様のいくつかのスレッドに対する回答とコメントを確認しました。次のコマンドはいずれも、特定の追跡/追跡解除されたファイルを隠せるようにするためのものではないことに注意してください。

  • git stash -p (--patch):追跡されていないファイルを除外して、ハンクを手動で選択します
  • git stash -k (--keep-index):すべての追跡/非追跡ファイルを隠し、作業ディレクトリに保存します
  • git stash -u (--include-untracked):すべての追跡/非追跡ファイルを隠します
  • git stash -p (--patch) -u (--include-untracked):無効なコマンド

現在、特定の追跡/追跡されていないファイルを隠しておくための最も合理的な方法は、次のとおりです。

  • 隠したくないファイルを一時的にコミットする
  • 追加して隠しておく
  • 一時的なコミットをポップする

私は別の質問への答えに、この手順のために簡単なスクリプトを書いて、そこにあるここでSourceTreeの手順を実行するための手順が


4

解決

ローカル変更:

  • file_A(変更済み)はステージングされていません
  • file_B(変更済み)はステージングされていません
  • file_C(変更済み)はステージングされていません

上の変更のみでスタッシュ「my_stash」を作成するにはfile_C

1. git add file_C
2. git stash save --keep-index temp_stash
3. git stash save my_stash
4. git stash pop stash@#{1}

できました。


説明

  1. file_Cをステージング領域に追加します
  2. 「temp_stash」という名前の一時スタッシュを作成し、変更をfile_Cに保持します
  3. file_Cの変更のみを使用して、必要なstash( "my_stash")を作成します
  4. 「temp_stash」(file_Aおよびfile_B)の変更をローカルコードに適用し、スタッシュを削除します

ステップ間でgit statusを使用して、何が起こっているかを確認できます。


3

2つのブランチ間を切り替えようとすると、この状況が発生します。

" git add filepath" を使用してファイルを追加してください。

後でこの行を実行します

git stash --keep-index


3

1つのファイルを隠しておくには、を使用しますgit stash --patch [file]

プロンプトが表示されます:Stash this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?。入力するだけでa、あなたしている罰金(この塊とファイル内のすべての後にハンクを隠しておきます)。


不足pushしているgit stash push --patch [file]
フィリペエスペランディオ2018年

@FilipeEsperandio pushは、以前のバージョンのGitでのみ機能しますsave。どちらの場合でも、pushまたは「引数なしでgit stashを呼び出すことはgit stash pushと同等」の呼び出しでsave暗示されstashます。ドキュメント
patrick

2

同様の状況。コミットして、問題があることに気付きました。

git commit -a -m "message"
git log -p

答えに基づいて、これは私を助けました。

# revert to previous state, keeping the files changed
git reset HEAD~
#make sure it's ok
git diff
git status
#revert the file we don't want to be within the commit
git checkout specs/nagios/nagios.spec
#make sure it's ok
git status
git diff
#now go ahead with commit
git commit -a -m "same|new message"
#eventually push tu remote
git push

2

この状況では、私はgit add -p(インタラクティブ)、git commit -m blah必要に応じて残っているものを隠します。


2

コマンドラインでそれを行う方法がわかりません。SourceTreeを使用するだけです。ファイルAを変更し、ファイルBに2つの変更ハンクがあるとします。ファイルBの2番目のハンクのみを隠しておき、他のすべてを変更しない場合は、次のようにします。

  1. すべてをステージング
  2. ファイルAのすべての変更を元に戻す作業コピーへの変更を実行します(たとえば、外部差分ツールを起動してファイルを一致させます)。
  3. ファイルBに、2番目の変更のみが適用されているかのように見せます。(たとえば、外部のdiffツールを起動し、最初の変更を元に戻します。)
  4. 「段階的な変更を保持する」を使用してスタッシュを作成します。
  5. すべてをステージング解除
  6. できた!

2
git add .                           //stage all the files
git reset <pathToFileWillBeStashed> //unstage file which will be stashed
git stash                           //stash the file(s)
git reset .                         // unstage all staged files
git stash pop                       // unstash file(s)

1
まあ、あなたはそれをすべきではありません。回答は、質問に対する解決策を提供する必要があります。あなたはあなた自身の質問をすることができます。
L_J 2018

この解決策は、この質問に対する最も簡単な答えの1つです。質問を読んですべての回答を比較し、私の答えを比較してください。もしこの回答が該当する解決策でも質問についての情報でも不十分であるという疑いがある場合は、もう一度お話しすることができます。
celikz

3番目のコマンド「git stash」はステージングされたファイルを受け入れないため、これは機能しません。ステージングされたファイルとステージングされていないファイルの両方がスタッシュに移動します。質問では、1つのファイルのみを隠しておく方法を具体的に質問します
Cyber​​Prodigy

0

複雑な方法の1つは、最初にすべてをコミットすることです。

git add -u
git commit // creates commit with sha-1 A

元のコミットにリセットしますが、新しいコミットからthe_one_fileをチェックアウトします。

git reset --hard HEAD^
git checkout A path/to/the_one_file

これで、the_one_fileを隠しておくことができます。

git stash

元のコミットにリセットしながら、コミットされたコンテンツをファイルシステムに保存してクリーンアップします。

git reset --hard A
git reset --soft HEAD^

ええ、やや厄介です...


0

私が必要とする答えは見つかりませんでした。それは次のように簡単です。

git add -A
git reset HEAD fileThatYouWantToStash
git commit -m "committing all but one file"
git stash

これはちょうど1つのファイルを隠します。


0

素早い回答


gitで特定の変更されたファイルを元に戻すには、次の行を実行します。

git checkout <branch-name> -- <file-path>

これが実際の例です:

git checkout master -- battery_monitoring/msg_passing.py


0

変更されたファイルを隠したい場合は、単に

隠したくないファイルをステージで追加し、実行しますgit stash save --keep-index

ステージングされていないすべての変更されたファイルを隠します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.