path: root/Documentation/howto/rebase-and-edit.txt
diff options
authorRyan Anderson <>2005-08-15 08:25:53 (GMT)
committerJunio C Hamano <>2005-08-15 10:00:21 (GMT)
commit365a00a3f280f8697e4735e1ac5b42a1c50f7887 (patch)
tree3ce890c43c4f6323a4c393383b1b8c093c0654e5 /Documentation/howto/rebase-and-edit.txt
parentc65a9470fbaa57b9b815addde51ad22648f6d353 (diff)
[PATCH] Add some simple howtos, culled from the mailing list.
I think these are useful, and I think putting them in a new "howto" directory might help some users until we get to the point of splitting up the tutorial to be easier to read. Given the authorship, I think it's safe to put these in the repository. Signed-off-by: Ryan Anderson <>
Diffstat (limited to 'Documentation/howto/rebase-and-edit.txt')
1 files changed, 78 insertions, 0 deletions
diff --git a/Documentation/howto/rebase-and-edit.txt b/Documentation/howto/rebase-and-edit.txt
new file mode 100644
index 0000000..8299ca5
--- /dev/null
+++ b/Documentation/howto/rebase-and-edit.txt
@@ -0,0 +1,78 @@
+Date: Sat, 13 Aug 2005 22:16:02 -0700 (PDT)
+From: Linus Torvalds <>
+To: Steve French <>
+Subject: Re: sending changesets from the middle of a git tree
+On Sat, 13 Aug 2005, Linus Torvalds wrote:
+> That's correct. Same things apply: you can move a patch over, and create a
+> new one with a modified comment, but basically the _old_ commit will be
+> immutable.
+Let me clarify.
+You can entirely _drop_ old branches, so commits may be immutable, but
+nothing forces you to keep them. Of course, when you drop a commit, you'll
+always end up dropping all the commits that depended on it, and if you
+actually got somebody else to pull that commit you can't drop it from
+_their_ repository, but undoing things is not impossible.
+For example, let's say that you've made a mess of things: you've committed
+three commits "old->a->b->c", and you notice that "a" was broken, but you
+want to save "b" and "c". What you can do is
+ # Create a branch "broken" that is the current code
+ # for reference
+ git branch broken
+ # Reset the main branch to three parents back: this
+ # effectively undoes the three top commits
+ git reset HEAD^^^
+ git checkout -f
+ # Check the result visually to make sure you know what's
+ # going on
+ gitk --all
+ # Re-apply the two top ones from "broken"
+ #
+ # First "parent of broken" (aka b):
+ git-diff-tree -p broken^ | git-apply --index
+ git commit --reedit=broken^
+ # Then "top of broken" (aka c):
+ git-diff-tree -p broken | git-apply --index
+ git commit --reedit=broken
+and you've now re-applied (and possibly edited the comments) the two
+commits b/c, and commit "a" is basically gone (it still exists in the
+"broken" branch, of course).
+Finally, check out the end result again:
+ # Look at the new commit history
+ gitk --all
+to see that everything looks sensible.
+And then, you can just remove the broken branch if you decide you really
+don't want it:
+ # remove 'broken' branch
+ rm .git/refs/heads/broken
+ # Prune old objects if you're really really sure
+ git prune
+And yeah, I'm sure there are other ways of doing this. And as usual, the
+above is totally untested, and I just wrote it down in this email, so if
+I've done something wrong, you'll have to figure it out on your own ;)
+ Linus
+To unsubscribe from this list: send the line "unsubscribe git" in
+the body of a message to
+More majordomo info at