From 49f2356dda291fa2566136ad247cbceab30a3ba0 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 2 Nov 2007 13:50:25 -0400 Subject: [PATCH] web commit by http://roktas.myopenid.com/: thoughts on using git-stash --- doc/rcs/details.mdwn | 111 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/doc/rcs/details.mdwn b/doc/rcs/details.mdwn index e09fcf758..b20abd389 100644 --- a/doc/rcs/details.mdwn +++ b/doc/rcs/details.mdwn @@ -137,6 +137,117 @@ for more details), so I had to invent an ugly hack just for the purpose. > it seems to me you could just git-stash them now that git-stash exists. > I think it didn't when you first added the git support.. --[[Joey]] + +>> Yes, git-stash had not existed before. What about sth like below? It +>> seems to work (I haven't given much thought on the specific implementation +details). --[[roktas]] + +>> # create test files +>> cd /tmp +>> seq 6 >page +>> cat page +>> 1 +>> 2 +>> 3 +>> 4 +>> 5 +>> 6 +>> sed -e 's/2/2ME/' page >page.me # my changes +>> cat page +>> 1 +>> 2ME +>> 3 +>> 4 +>> 5 +>> 6 +>> sed -e 's/5/5SOMEONE/' page >page.someone # someone's changes +>> cat page +>> 1 +>> 2 +>> 3 +>> 4 +>> 5SOMEONE +>> 6 +>> +>> # create a test repository +>> mkdir t +>> cd t +>> cp ../page . +>> git init +>> git add . +>> git commit -m init +>> +>> # save the current HEAD +>> ME=$(git rev-list HEAD -- page) +>> $EDITOR page # assume that I'm starting to edit page via web +>> +>> # simulates someone's concurrent commit +>> cp ../page.someone page +>> git commit -m someone -- page +>> +>> # My editing session ended, the resulting content is in page.me +>> cp ../page.me page +>> cat page +>> 1 +>> 2ME +>> 3 +>> 4 +>> 5 +>> 6 +>> +>> # let's start to save my uncommitted changes +>> git stash clear +>> git stash save "changes by me" +>> # we've reached a clean state +>> cat page +>> 1 +>> 2 +>> 3 +>> 4 +>> 5SOMEONE +>> 6 +>> +>> # roll-back to the $ME state +>> git reset --soft $ME +>> # now, the file is marked as modified +>> git stash save "changes by someone" +>> +>> # now, we're at the $ME state +>> cat page +>> 1 +>> 2 +>> 3 +>> 4 +>> 5 +>> 6 +>> git stash list +>> stash@{0}: On master: changes by someone +>> stash@{1}: On master: changes by me +>> +>> # first apply my changes +>> git stash apply stash@{1} +>> cat page +>> 1 +>> 2ME +>> 3 +>> 4 +>> 5 +>> 6 +>> # ... and commit +>> git commit -m me -- page +>> +>> # apply someone's changes +>> git stash apply stash@{0} +>> cat page +>> 1 +>> 2ME +>> 3 +>> 4 +>> 5SOMEONE +>> 6 +>> # ... and commit +>> git commit -m me+someone -- page + By design, Git backend uses a "master-clone" repository pair approach in contrast to the single repository approach (here, _clone_ may be considered as the working copy of a fictious web user). Even though a single repository implementation is -- 2.26.2