Hi, Forwarding a report from https://github.com/newren/git-filter-repo/issues/229, with a few more details... log, diff, etc. seem to all support replace objects nicely: git init -b main whatever cd whatever/ >empty git add empty git commit -m initial git replace -f deadbeefdeadbeefdeadbeefdeadbeefdeadbeef $(git rev-parse main) echo stuff >>empty Now, If I try to use this replace object: $ git diff --stat deadbeefdeadbeefdeadbeefdeadbeefdeadbeef empty | 1 + 1 file changed, 1 insertion(+) $ git log --oneline deadbeefdeadbeefdeadbeefdeadbeefdeadbeef deadbee (replaced) initial it all works well. BUT, if I try to use it with branch it doesn't work: $ git branch --contains deadbeefdeadbeefdeadbeefdeadbeefdeadbeef $ and possibly worse, if I create a new branch based on it and use it: $ git branch foobar deadbeefdeadbeefdeadbeefdeadbeefdeadbeef $ git checkout foobar $ echo stuff >empty $ git add empty $ git commit -m more then it's clear that branch created foobar pointing to the replaced object rather than the replacement object -- despite the fact that the replaced object doesn't even exist within this repo: $ git cat-file -p HEAD tree 18108bae26dc91af2055bc66cc9fea278012dbd3 parent deadbeefdeadbeefdeadbeefdeadbeefdeadbeef author Elijah Newren <newren@xxxxxxxxx> 1617083739 -0700 committer Elijah Newren <newren@xxxxxxxxx> 1617083739 -0700 more I poked around in the code a little but it is not at all clear to me why some parts of the code (log, diff) translate replace refs correctly, while others (branch) don't. It is clear from the output that log is aware that the refs are replaced, which makes me wonder if every caller needs to be aware of replace refs for them to work correctly everywhere, because I couldn't find a missing environment setup for "branch".