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

Resetting paths

From
Junio C Hamano <junkio@cox.net>
Date
Feb 10, 2006, 04:40 UTC
Message-ID
<7vlkwjzv0w.fsf@assigned-by-dhcp.cox.net>

While working on "assume unchanged" git series, I found one thing missing from the current set of tools.

While I worked on parts of the system that deals with the cached lstat() information, I needed a way to debug that, so I hacked ls-files -t option to show entries marked as "always matches the index" with lowercase tag letters. This was primarily debugging aid hack.

Then I committed the whole thing with "git commit -a" by mistake. In order to rewind the HEAD to pre-commit state, I can say "git reset --soft HEAD^", but after doing that, now I want to unupdate the index so that ls-files.c matches the pre-commit HEAD.

"git reset --mixed" is a heavy-handed tool for that. It reads the entier index from the HEAD commit without touching the working tree, so I would need to add the modified paths back with "git update-index".

The low-level voodoo to do so for this particular case is this single liner:

	git ls-tree HEAD ls-files.c | git update-index --index-info

Have people found themselves in similar need like this? This could take different forms.

 * you did "git update-index" on a wrong path.  This is my
   example and the above voodoo is a recipe for recovery.
 * you did "git add" on a wrong path and you want to remove it.
   This is easier than the above:
	git update-index --force-remove path
 * you did the above recovery from "git add" on a wrong path,
   and you want to add it again.  The same voodoo would work in
   this case as well.
	git ls-tree HEAD path | git update-index --index-info

We could add "git reset path..." to reduce typing for the above, but I am wondering if it is worth it.

BTW, this shows how "index centric" git is. With other SCM that has only the last commit and the working tree files, you do not have to worry any of these things, so it might appear that index is just a nuisance. But if you do not have any "registry of paths to be committed", you cannot do a partial commit like what I did above ("commit changes to all files other than ls-files.c") without listing all the paths to be committed, or fall back on CVS style "one path at a time", breaking an atomic commit, so there is a drawback for not having an index as well.

Next: Andreas Ericsson
Message 1 of 3 in “Resetting paths”
  1. Junio C HamanoFeb 10, 2006
  2. Andreas EricssonFeb 10, 2006
  3. Junio C HamanoFeb 11, 2006

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.