1. ホーム
  2. git

[解決済み] git mergeです。残しておきたいファイルを削除する

2023-08-28 06:32:40

質問

git で 2 つのブランチをマージするにはどうすればよいのでしょうか。 必要な ファイルを残すにはどうしたらよいでしょうか?

2 つのブランチをマージするとき、あるブランチでファイルが削除され、別のブランチでは削除されなかった場合、そのファイルは最終的に削除されます。

たとえば

  • 新しいブランチを作成したときに、masterにファイルが存在する場合
  • そのファイルは(まだ)必要ないので、master から削除します。
  • 機能を追加するためにブランチに変更を加える。 このファイルが存在することに依存している
  • マスターでバグフィックスを行う場合 (破棄できません)
  • ある日マージしたら、ファイルが消えていた

再現する方法

  1. 1つのファイルでgit repoを作成します。

    git init
    echo "test" > test.txt
    git add .
    git commit -m "initial commit"
    
    
  2. ブランチの作成

    git branch branchA
    
    
  3. マスターのファイルを削除する

    git rm test.txt
    git commit -m "removed file from master"
    
    
  4. 削除されたファイルに触れないように、branchAで任意の変更を行います(Conflictを避けるため、変更されていない必要があります)。

    git checkout branchA
    touch something.txt
    git add .
    git commit -m "some branch changes"
    
    

ここから、これら 2 つのブランチをマージするために私が見つけたどのような方法でも、test.txt ファイルは削除されます。 仮に私たちが ファイルに依存していたとすると に対して branchA に依存している場合、これは大きな問題です。


失敗例です。

マージ1

git checkout branchA
git merge master
ls test.txt

マージ2

git checkout master
git merge branchA
ls test.txt

リベース1

git checkout branchA
git rebase master
ls test.txt

どのように解決するのですか?

これは興味深い問題です。というのも、あなたがファイルを削除した後 BranchA が作成された後にファイルを削除し、その後 masterBranchA に変更した場合、Gitがどのように競合に気づくのかがわかりません。

悪いマージの後、アンドゥして再マージすることができますが、ファイルを追加し直してください。

git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit