質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

2回答

2968閲覧

VSCodeでブランチ切り替える際、ソースの変更内容はブランチごとに保持されるようにしたい

H40831

総合スコア975

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

1グッド

2クリップ

投稿2021/09/16 01:22

編集2021/09/16 07:02

VSCodeでブランチを切り替える際の挙動が、前職のPCと今のPCで違うので、前職のPCの挙動に変更したいと思っています。
やりかたがわからないので、ご存知の方、教えて下さい。

#再現したい挙動
まず状況としては、AとBという2つのブランチがあったとして
Aでソースを変更して保存し、コミットせずにブランチを切り替えようとしたときの挙動の話になります。

前職のPCでは、このとき

1.ブランチAでの変更はブランチAに保持され、ブランチBにチェックアウトした際にはその変更は反映されていない。
(ブランチAにチェックアウトし直すと、きちんと変更される。)

というような挙動になっていました。

しかし、今のPCでは

2.ブランチAでの変更が、ブランチBにチェックアウトしても維持される。(commitやstashしない限り、ソースの変更内容をブランチごとに切り分けることはできない)

というような挙動になっています。

他の方に相談したところ、その人はさらに挙動が違うようで

3.そもそもcommitしてないことを警告され、チェックアウトができない(無視してチェックアウトすると、変更が破棄される)

というような挙動になっているそうです。

#試したこと

  • VSCodeのGUIでの操作ではなく、ターミナルからgit checkoutしてみました。

→2と同じ挙動になりました。

  • 前職のPCの挙動は拡張機能の影響だったのかと思い、Git関連の拡張機能としてはGitLensくらいしか入れた覚えがなかったので、GitLensをいれてみました。

→挙動が変わり、3の挙動になりました。(ちなみにこのあとGitLens削除しても3の挙動のままでした)

#まとめ
2の挙動から3の挙動に変わったのは不思議ですが、そこは重要ではなく、
とにかく1の挙動になってほしいというのが本題です。

git stashすればいいとか、SourceTreeを使えばそのような挙動になるみたいなアドバイスはもらえたのですが、
以前できていた操作のほうが使いやすいのにそれを再現できないというのが気持ち悪いので、
VSCodeで1の挙動を再現する方法を教えて頂けたら助かりますm(_ _)m

#追記
前職ではBitBucketを使っており、今はGitHubを使っていて、そこが何かしら関係している可能性があるかもしれません。
その場合、なにをどう調べればいいかもわからないので、とりあえず同じようにBitBucketを使っている人が
1の挙動になるのか、ならないのか確認のため教えていただけると幸いです。

またSourceTreeを使ってみましたがやはり1の挙動にはならないようで、
アドバイスくれた方に再確認したところ、よくよく聞くとやはりその人も2の挙動になっているようでした。

そのため回答欄で教えていただいたとおり、1の挙動になっていたのはかなり特殊な状況だったようですが
特にそういった設定もした記憶がないのに1の挙動になっていた理由(環境のせいなのか、設定のせいなのか等)がとても気になります。
(もちろん前職の環境構築の際に、意識していないところでそういう設定がされていた可能性もあるとおもいますが。)

設定のせいであれば、どういう設定をすればそのようになるのかだとか、
その方法をとった上でどういうデメリットがあるのかはとても気になりますので、やはり一度再現してみたいところです。

shinoharat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/09/16 01:24

「ブランチAでの変更はブランチAに保持され」というのは、「勝手にコミットされている」ということでしょうか?
H40831

2021/09/16 01:29

いえ、コミットはされないです。 ローカルのファイルの内容をブランチごとに書き換えてくれていたようなイメージです。
Daregada

2021/09/16 01:47

(前職のPCで)1の作業をするときにもVSCodeを使っていたのでしょうか?
H40831

2021/09/16 01:50

はい、前職でもVSCodeのGUIでチェックアウトを行っていました
TakaiY

2021/09/16 02:07

> VSCodeのGUIでの操作ではなく、ターミナルからgit checkoutしてみました。→1と同じ挙動になりました とありますが、そんなことは無いと思います。 今、手元でも試してみました。 - 変更がぶつかる場合は、警告が出て変更できない。 - ぶつからない場合は、変分があるままブランチが切り替わる。 です。
H40831

2021/09/16 07:01 編集

こちらもやってみた結果を書いているだけなので、不思議です。 (実際、GitLensをいれて再起動したあとは、おっしゃるとおりの挙動になってます) ただ、そこは本題ではないので、あまりこだわらず、とりあえず1の挙動を再現できたらと思っています。 ↓↓↓ ごめんなさい!! 完全に記述ミスでした。 実際には「2と同じ挙動になりました」です!
Daregada

2021/09/16 06:55

ブランチの切り替え(checkout)は、コマンドラインで行なっていたのか、何らかのGUI操作で行なっていたのか、どちらでしょうか?
H40831

2021/09/16 06:57

前職では、ほとんどVSCodeのGUIで行っていました。 今のPCでは、VSCodeのGUIでもコマンドでもどちらで試しても同じ挙動になることを確認しています。
Zuishin

2021/09/16 23:04 編集

だから、フックでも拡張機能でもできます。 フックならば git init した時にコピーされるコピー元を書き換えればいいし、拡張機能ならあらかじめインストールしておけばいい。 そのどちらでも、ユーザーの記憶に残らず使わせることができます。 前職の環境が知りたいなら前職に聞くしかないし、同じことが再現できればいいのならフックか拡張機能を作ればいい、それだけのことじゃないんですか? それ以上のこと、つまりフックや拡張機能を作ってくれ、または探してくれという作業依頼ですか? ほんの数行のシェルスクリプトで再現できるので、プロのプログラマーにお金を払えば作ってもらえると思いますよ。
Zuishin

2021/09/16 23:22

フックや拡張機能を使わず、手作業で行う方法を書きます。 それをフックや拡張機能で自動化すればいいでしょう。 まず適当なローカルリポジトリを作ってください。 そこに新しいファイルを作ります。 git stash save "branch dependent" -u を実行します。 新しいブランチ newbranch を作り、新しいファイルを作ります。 git stash save "branch dependent" -u を実行します。 git stash list を実行します。 すると、先ほど退避した二つが stash@{0}: On newbranch: branch dependent stash@{1}: On main: branch dependent と並びますね。 つまり、`On (ブランチ名): branch dependent` とあるのが、そのブランチをチェックアウトした時に適用すべきブランチ名です。 git stash pop 0 とすれば stash@{0} が、git stash pop 1 とすれば stash@{1} が適用されます。 これを自動化すれば思惑通りになるのであれば、pre-checkout で退避し、post-checkout で適用すればいいと思いませんか?
H40831

2021/09/17 01:41 編集

ありがとうございます。とても参考になりました。 git stashは別機能として使えていた(stashの一覧にそういったものは表示されていなかった)ので、 これ以外にも方法はないのかな?とか、GitではなくVSCodeの方でなにかしていたんじゃないかな?とか、 気にはなるのですが、前職の先輩に聞いてもわからないとのことでしたので、答えの無い問題になりそうです。 たしかにこの方法をとるくらいなら、やらないほうがいいと言う理由も納得でき、参考になりました。 とても参考になりましたのでベストアンサーにさせていただきたいのですが、 回答欄に投稿していただけないのは、 maisumakunさんの回答をベストアンサーに選ばせたいという思惑でしょうか?
Zuishin

2021/09/17 01:56

回答する気がないからです。 多分越えなければならないハードルがいくつもある上、使い方を間違えるとリポジトリを破壊する危険があると思います。 たとえば、pre-checkout があるものと思い込んでいましたが、遊びで作ってみようと思って調べたら、ありませんでした。 ここは別の方法で代用しなくてはいけません。 git を起動しようとすると起動する、本物の git より起動優先順位の高いコマンドを作り、vscode がブランチを変更する際にどのようなコマンドラインを使うのかを調べ、それをフックするのが一番手っ取り早いかなと思いました。
H40831

2021/09/17 04:27

前職でそこまで込み入ったシステムが秘密裏にはいってたとしたら恐ろしいですね。 ご考察いただき、ありがとうございました!
guest

回答2

0

以前できていた操作のほうが使いやすいのにそれを再現できないというのが気持ち悪いので

むしろ、1のような動作が気持ち悪い、という感覚を持ったほうがいいです。

通常のGit操作には、「ブランチを切り替えた時に、ステージングすらしていない変更を、特定のブランチと紐付けて自動的に保存する」ような機能はありません

裏で何かを行って実現しているのだとは思いますが、その「何か」が見えないまま使うほうが不自然だと感じてしまいます。

投稿2021/09/16 01:49

編集2021/09/16 01:50
maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

H40831

2021/09/16 01:51

ありがとうございます。 やるかやらないかと、できるかできないかは別問題と捉えていただけると幸いです
maisumakun

2021/09/16 02:03

> やるかやらないかと、できるかできないかは別問題と捉えていただけると幸いです 可能か不可能かと、やるべきかやらないべきかもまた別問題です。 他の人の編集でコミットが進むなど複雑な状況になると、編集中のものが失われる、思わぬ形でマージされてしまうなど、「仕組みがわからないままでは」対応不能なトラブルに見舞われる危険があります。
H40831

2021/09/16 02:30

もうしわけありませんが、やるべきかどうかの質問ではなく、やる方法の質問であることをご理解おねがいします。やった結果の悪影響などがありましたら、こちらで責任を持ちます。 恐れ入りますがmaisumakunさんの今回の回答は、回答欄に投稿するにはふさわしくない内容かと思います。
maisumakun

2021/09/16 02:38 編集

> もうしわけありませんが、やるべきかどうかの質問ではなく、やる方法の質問であることをご理解おねがいします。 極端な例ではありますが、「やることが違法になる」ようなことであっても、「やるな」という回答はすべきではないのでしょうか? 自分としては、したいこと自体が妥当ではないのであれば、その旨を回答として提示することが必要だと考えています。
H40831

2021/09/16 02:46 編集

maisumakunさんの考えは理解しました。 今回の場合はやることが違法ではない、かつ深刻な悪影響も予測できないため、 ひきつづき、やる方法の回答をお待ちしたいと思います。
Zuishin

2021/09/16 04:25

ブランチを切り替える時に自動的に退避したり、退避したものを適用したりするフックや拡張機能が入っていたのかもしれません。 そんな恐ろしいものを使っていると、git の新しいコマンドやテストされていないコマンドで、知らないうちにリポジトリが壊れる可能性があるため、私も使わない方がいいと思います。 壊さない自信があるなら、フックでも拡張機能でもできると思うので、自作するか探してみたらいいんじゃないでしょうか。
H40831

2021/09/16 05:41 編集

コメントありがとうございます。 git stashはgit stashで別機能として使えていたので、個人的にはそういうものではない気がしてます。 そんなに大仰な機能なら入れていて覚えてないってこともないと思いますし、 それにSourceTreeではそういう挙動になりますよってアドバイスくれた人はなんだったんだっていう話にもなります。 なんにせよ、再現できない状態であれこれ考えてもお互いに机上の空論でしかないと思います。 ふと思ったのですが、 もしかしたら前職ではGitHubではなくBitBucketを使っていたのが、なにか関係あるのかもと思いました。
Zuishin

2021/09/16 05:45

元同僚に電話して「post-checkout どうなってる? 拡張機能は何が入ってる?」と聞くのが、曖昧な記憶や、確認の取れていない怪しげなアドバイスを根拠とする推論に執着するよりも有益であろうかと思います。
H40831

2021/09/16 05:54

実は確認済みで、GitLens以外に心当たりないっていう話でした。 post-checkoutというのは意識したことないのですこし調べてみます。 すごく当たり前に使っていた機能だったのですが、相当特殊な状況だったようですこしショックを受けてます。
guest

0

自己解決

Gitの標準機能ではそういった機能はないこと、
Teratailの皆さんの考察通りの方法でやるとしたら自動的にstashするような仕組みになり、メリットよりもデメリットのほうが大きいということ、
VSCodeやBitbucketで対応するようなやり方があるのかは誰も心当たりがないことがわかりました。

申し訳ありませんがmaisumakunさんの回答は、
「そのような挙動にする『なにか』を知らないから思考停止してやめとけ」というようなアドバイスであるように聞こえ、
コメントで申し上げた通り質問にたいする回答とは思えなかったため自己解決でクローズさせていただきます。

Zuishinさん、正体不明の挙動に対して深くご考察いただきありがとうございました。

投稿2021/09/17 04:36

H40831

総合スコア975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/09/17 04:43

> 「そのような挙動にする『なにか』を知らないから思考停止してやめとけ」というようなアドバイスであるように聞こえ、 うまく伝わっていないようで申し訳ありません。「全く標準的な操作でないので、裏でトラブルになるリスクだけでなく、標準的でないシーケンスに慣れてしまうこと自体もリスクになりうる」という意味を込めての回答でした。
H40831

2021/09/17 05:53 編集

こちらこそ、意図された通りの意味で受け取ることができず申し訳ありません。 今まで普通に使っていた挙動だったために、納得するのに時間やたくさんの考察が必要だったというのもあったかもしれません。すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問