web-dev-qa-db-ja.com

Gitマージ:エラー:古い<ファイル>のリンクを解除できません:そのようなファイルまたはディレクトリはありません

ブランチをマージするためにmasterにプルしています。

私が実行しているコマンドは(masterをチェックアウトしている間):git pull Origin feature/some_branch

残念ながら、私の同僚はそこでいくつかの(私が良性だと思う)ファイル削除を実行したようで、今ではgitがerror: unable to unlink old 'somefile': No such file or directoryを吐き出します。

私はオンラインで調べようとしましたが、このエラーに関する参照のほとんどは権限に関するものであり、ここではそうではありません。

問題のファイルは、マージ前にマスターにnot存在しますが、新しいブランチには存在します。

問題は、masterが長い間更新されなかったため、影響を受ける変更やファイルが多すぎて、コードを理解し始めることができないことです。

新しいブランチからのすべての変更を含めるには、masterが必要です。 masterに直接コミットすることは決してなく、常にマージを通じて行われます。

私がこれまでに試したこと:

  • --forceパラメータを使用して、同じ問題
  • git reset Origin/master --hardpullを再度実行すると、同じ問題が発生します

このような問題を気にせずに、履歴を保持しながら、masterを別のより新しいブランチで更新するにはどうすればよいですか?

6
Skwiggs

新しいブランチからのすべての変更を含めるためにマスターが必要です。

次に、そのブランチfeature/some_branchの内容を反映するために、強制的にマージできます。

ただし、merge --ours masterを使用する代わりに、 同様のアイデア を使用できます。これにより、最初の親の履歴が保持されます。

git checkout master

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours feature/some_branch    

# make temporary branch to merged commit
git branch tmp         

# get contents of working tree and index to the one of feature/some_branch
git reset --hard feature/some_branch

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft tmp

# change the contents of the merged commit
# with the contents of feature/some_branch
git commit --amend

# get rid off our temporary branch
git branch -D tmp

# verify that the merge commit contains only contents of feature/some_branch
git diff HEAD feature/some_branch
3
VonC

masterブランチをOrigin/masterのバージョンに置き換えるには、ブランチを削除して再作成してみてください。これを行うときにmasterをチェックアウトする必要がないため、作業ディレクトリの変更に関連するエラーを回避できる場合があります。

まず、チェックアウトできる別のブランチをチェックアウトします。

git checkout feature/some-branch

次に、ローカルのmasterブランチを削除し、追跡情報を含めて再度作成します。

git branch --delete master
git branch master Origin/master
git branch --set-upstream-to=Origin/master master

最後に、新しいmasterに切り替えてみてください。

git branch checkout master
0
Rory O'Kane