The both broadly aim to solve similar problems, but use different mechanisms to achieve it. Both allow you to store the content of a file separately from the git repository, so that you don’t need to download every version of every such file that ever existed in your repository when you clone it. git-annex is much more flexible about where those files are downloaded from, however.