A lot of this depends on what your application does. How to deal with concurrent edits isn't something Git handles. It lives a layer above. In the typical case in the user's merge tool, here you'll either have to push the work to the user or figure out a way inside your application to deal with conflicts.
Check if the content of the file differs from the last commit. If not, do nothing further.
You can run diff between an arbitrary buffer and an object. See git_diff_blob_to_buffer().
Check if any new commits have been made (based on the same parent commit) and try to merge with them. But a conflicting branch is also acceptable.
There's the merge API to perform the merge and detect the merge base (which you can use to tell if there has been any divergence). If the merge doesn't succeed, it's up to you what to do. These require human intervention (or use of a different merge algorithm that knows about the semantics of the contens).
Create a new commit with only the new content of this file.
This is most likely not what you want. A commit in Git is a snapshot, so with this, you'd be deleting every other file. Assuming that what you want is a new commit with a particular file updated, create an empty index and fill it with the base commit's tree, update the entry and write out the index as a tree, which you can use for the new commit. All of this in available in the index API.
There are a few program that deal with different aspects of this, such as Gollum which is a git-backed wiki, SparkleShare which is a git-backed file synchronisation tool and Docurium which writes out documentation directly into a new commit in a branch.