3

マスターには、機能ブランチに住むほうがよいファイルがいくつかあります。そのようなブランチを作成してそこにファイルを配置すると同時に、マスターからファイルを削除したいと思います。

履歴については気にしません。つまり、ファイルを以前のコミットから削除する必要はありません。私がする時

$ git ls-files
stay.txt
move.txt

$ git checkout -b feature
Switched to a new branch 'feature'

$ git checkout master
Switched to branch 'master'

$ git rm move.txt

HEADの状況は私が望むようなものです。ただし、マスターを機能にマージするときに問題が発生します。私はそれに対処する必要がありますか、それともそのようなシナリオの解決策はありますか?

4

1 に答える 1

2

実際、そのようにすると、これら2つのブランチ(マスターと機能)をマージするときに、ファイルを削除したコミットが機能に適用されるため、機能を安全に保とうとしたファイルが削除されます。

さらに、マスターでファイルを削除した後に機能でこれらのファイルを変更すると、マージ中にファイルが削除されてから変更され、競合が発生します。

CONFLICT(変更/削除):test.txtがHEADで削除され、機能が変更されました。test.txtのバージョン機能がツリーに残っています。自動マージに失敗しました。競合を修正してから、結果をコミットします。

ファイルが変更されていない(競合がない)場合は、マージ後に削除コミットを元に戻すことでこれを解決できます。

$ git merge feature # in master
$ git revert SHA-of-the-commit-deleting-your-file

ファイルを失うことなく、機能とマスターブランチのすべてのコミットを取得できます。

ただし、競合がある場合は、これを手動で解決する必要がある場合があります(誰かがこれに最適なgitコマンドを見つけない限り):

$ git merge feature # in master
$ git mergetool # use modified versions of files
$ git commit -m "Merge with deleted files solved"
于 2011-11-15T12:53:21.550 に答える