git ls-tree -r --name-only <commit> (where instead of <commit> there can be <branch>). You might want to use also -t option which lists subdirectories before descending into them
git diff <branchA>:<fileA> <branchB>:<fileB>, or if you want to compare the same file git diff <branchA> <branchB> -- <file>
For listing, you may use git ls-files to list all files recursively in the current index/working directory. You may refer to Git-SCM Docs / git-ls-files or type man git-ls-files if you have installed Git and have man pages available.
It has nice options to show files in different ways like cached, staged, deleted, modified, ignored or others for the untracked. It also supports matching patterns. Having also a --debug arg, you can easily list creation time, modification time, inode id, staged0, staged1 and staged2 for files.
For the diff of two branch, simply use git diff <branch> <other branch> as stated in other answers.