Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
738 views
in Technique[技术] by (71.8m points)

git - What are those 'WIP' and 'index' commits that appear after stashing?

When I run git lg on my local development branch, the latest commit is shown as below:

* 7d21213 - (1 hours ago) update business rules - developer1 (HEAD, origin/develop, origin/HEAD, develop)

However, if I stash local changes by running git stash and then run git lg, I get the following:

*  at12334 - (13 seconds ago) WIP on develop: 7d21213 update business rules - developer1 (refs/stash)
|
| * ef9a11b - (14 seconds ago) index on develop: 7d21213 update business rules - developer1
|/
* 7d21213 - (1 hours ago) update business rules - developer1 (HEAD, origin/develop, origin/HEAD, develop)

What does this mean? It seems that two new commits (labelled index and WIP) are created after stashing. Is that the case, and, if so, what is the logic behind such commits?


Note

git lg

is an alias already defined in the test environment as

git log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)' --all
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

"WIP" is an acronym for Work-In-Progress. It is meant to suggest that you are temporarily saving the current state of your work even though you aren't at a natural stopping point.

Stashing saves your work in the repository using familiar commit/merge mechanisms. In particular, it is possible to view all currently stashed items in context by running gitk --reflog, although only the most recent stash will be labeled with stash. An important difference between a regular commit and a stash is that when stashes are removed (for example via git stash clear), they are no longer visible in the reflog and will therefore be more difficult to recover.

A stash is normally performed in two parts:

  1. An "index" commit is performed for anything that has been "add"ed since the last commit.
  2. The "WIP" commit is performed as a merge between the working state and the index commit.

If you haven't performed any add operations since the last commit, the index commit will be empty. However, even if the index is empty, it is still committed. The subsequent implicit merge can complicate things if you, for example, wanted to cherry-pick from a stash in order to avoid certain complications associated with git stash pop.


Git's stash mechanism is clever, powerful, and useful, but it is also complicated, error prone, and dangerous. My practice lately has been to avoid the use of git stash in favor of getting similar results with something like git commit -a -m "stash" to save my work and git reset HEAD~1 (after checking out the "stash" commit) to restore it.

This leaves the most useful application of git stash as just being a quick way to get rid of all local changes if you know that you no longer need them.

By the way, you can remove the "WIP" and "index" commits from your logs by running git stash clear -- but don't do that if you have valuable work saved only on the stash.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...