git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: How to fork a file (git cp ?)

From
Øyvind A. Holm <sunny@sunbase.org>
Date
May 4, 2011, 20:36 UTC
Message-ID
<BANLkTinEb5BmR_Ls8YtGxyqGSVVBcnG32A@mail.gmail.com>
In-Reply-To
<4DC1A64C.4090508@aldan.algebra.com>
On 4 May 2011 21:17, Mikhail T. <mi+thun@aldan.algebra.com> wrote:
Show 9 quoted lines
> On 04.05.2011 14:22, Johannes Sixt wrote:
> >
> > You just cp the file and git add it. But you will not be able to
> > follow a history of the file.
>
> Thank you for the information...
>
> So, is this something worth adding to the wishlist, or was it omitted
> on purpose (and which purpose was that, then)?

Oh yes, that was intentional. This is easily one of the most debated "features" of Git, especially in the early days of Git when almost all SCM systems did it "the CVS way", by tracking the history of single files. Instead, Git tracks snapshots of the whole tree and focuses on the whole content instead of single files. Renames are tracked by detecting removal/adding of files, which can be detected later, for example using "git log --follow". The reason for this is mostly speed issues, and most of the time the history of a single file is not interesting in a project, but changes in the file tree as a whole.

From the FAQ at <https://git.wiki.kernel.org/index.php/GitFaq>:
  Git has to interoperate with a lot of different workflows, for example
  some changes can come from patches, where rename information may not
  be available. Relying on explicit rename tracking makes it impossible
  to merge two trees that have done exactly the same thing, except one
  did it as a patch (create/delete) and one did it using some other
  heuristic.
  On a second note, tracking renames is really just a special case of
  tracking how content moves in the tree. In some cases, you may instead
  be interested in querying when a function was added or moved to a
  different file. By only relying on the ability to recreate this
  information when needed, Git aims to provide a more flexible way to
  track how your tree is changing.
  However, this does not mean that Git has no support for renames. The
  diff machinery in Git has support for automatically detecting renames,
  this is turned on by the '-M' switch to the git-diff-* family of
  commands. The rename detection machinery is used by git-log(1) and
  git-whatchanged(1), so for example, 'git log -M' will give the commit
  history with rename information. Git also supports a limited form of
  merging across renames. The two tools for assigning blame,
  git-blame(1) and git-annotate(1) both use the automatic rename
  detection code to track renames.
  As a very special case, 'git log' version 1.5.3 and later has
  '--follow' option that allows you to follow renames when given a
  single path.
  Git has a rename command git mv, but that is just for convenience. The
  effect is indistinguishable from removing the file and adding another
  with different name and the same content.

This mail from Linus explains the issue in more detail and colour: <http://permalink.gmane.org/gmane.comp.version-control.git/217>.

Regards, Øyvind

Previous: Mikhail T.Next: Junio C Hamano
Message 6 of 19 in “How to fork a file (git cp ?)”
  1. Mikhail T.May 4, 2011
  2. Johannes SixtMay 4, 2011
  3. Johannes SixtMay 4, 2011
  4. Stephen BashMay 4, 2011
  5. Mikhail T.May 4, 2011
  6. Øyvind A. HolmMay 4, 2011
  7. Junio C HamanoMay 4, 2011
  8. Mikhail T.May 5, 2011
  9. Junio C HamanoMay 5, 2011
  10. Piotr KrukowieckiMay 5, 2011
  11. Junio C HamanoMay 5, 2011
  12. Piotr KrukowieckiMay 5, 2011
  13. Mikhail T.May 5, 2011
  14. Jeff KingMay 5, 2011
  15. Piotr KrukowieckiMay 5, 2011
  16. Piotr KrukowieckiMay 5, 2011
  17. Jeff KingMay 5, 2011
  18. Pete HarlanMay 8, 2011
  19. Junio C HamanoMay 8, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.