web-dev-qa-db-ja.com

データを上書きせずにgit checkoutするには

- どのようにできますか git-checkoutデータを上書きせずに?

走る

 git checkout master

私は得る

error: Entry 'forms/answer.php' would be overwritten by merge. Cannot merge.

これは意外です。私がgit-checkout。私は常にコマンドの後に個別に実行しましたgit merge new-feature。チェックアウト時にGitがマージされる場合、これは明らかに不要であるようです。

Gitは、forms/answers.phpにコミットされていない作業コピーまたはインデックスの変更があることを警告しています。

git-stashを使用して変更を保存し、次にgit-stash applyを使用して変更を復元できます。

git-stashの一般的な使用例は、変更に取り組んでいるが、バグ修正のために別のブランチを一時的にチェックアウトする必要がある場合です。したがって、インデックスと作業コピーの変更をstashし、他のブランチをチェックアウトし、バグ修正を行い、コミットし、元のブランチをチェックアウトして、-git-stash適用変更を復元し、中断したところから再開します。

54
Karl Voigtland

Gitは(git checkout <branch>を使用して)ブランチを切り替えるときにコミットされていない変更の双方向のマージを行いますが、通常は簡単な(ツリーレベルの)マージのみを行います。

git-stashsolution by Karl Voigtland に加えて、次のオプションのいずれかを選択して、 git checkout に追加オプションを与えることができます。

  • Gitにマージをより難しくする-m/--mergeオプションで切り替えるブランチにコミットされていない変更を指示します。このオプションを使用すると、現在のブランチ、作業ツリーの内容、新しいブランチの間の3者間マージが行われ、新しいブランチに移動します。

  • Gitにoverwriteコミットされていない変更を伝え、-fオプションを使用してローカルの変更を破棄します。警告:コミットされていない変更は失われます!

19
Jakub Narębski

git reset --softを使用して、HEADが新しいブランチを指すようにしますが、すべてのファイルはそのままにしておきます(新しいブランチで変更されたファイルを含む)。次に、git checkout新しいブランチから本当に必要なファイルだけをチェックアウトします。

       git reset [<mode>] [<commit>]
           This form resets the current branch head to <commit> and possibly updates the index (resetting it to the
           tree of <commit>) and the working tree depending on <mode>. If <mode> is omitted, defaults to --mixed.
           The <mode> must be one of the following:

           --soft
               Does not touch the index file or the working tree at all (but resets the head to <commit>, just like
               all modes do). This leaves all your changed files "Changes to be committed", as git status would put
               it.
1
Evgeny