-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This introduces a --patch mode for git-reset. The basic case is git reset --patch -- [files...] which acts as the opposite of 'git add --patch -- [files...]': it offers hunks for *un*staging. Advanced usage is git reset --patch <revision> -- [files...] which offers hunks from the diff between the index and <revision> for forward application to the index. (That is, the basic case is just <revision> = HEAD.) Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Thomas Rast
authored and
Junio C Hamano
committed
Aug 15, 2009
1 parent
46b5139
commit d002ef4
Showing
4 changed files
with
154 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
#!/bin/sh | ||
|
||
test_description='git reset --patch' | ||
. ./lib-patch-mode.sh | ||
|
||
test_expect_success 'setup' ' | ||
mkdir dir && | ||
echo parent > dir/foo && | ||
echo dummy > bar && | ||
git add dir && | ||
git commit -m initial && | ||
test_tick && | ||
test_commit second dir/foo head && | ||
set_and_save_state bar bar_work bar_index && | ||
save_head | ||
' | ||
|
||
# note: bar sorts before foo, so the first 'n' is always to skip 'bar' | ||
|
||
test_expect_success 'saying "n" does nothing' ' | ||
set_and_save_state dir/foo work work | ||
(echo n; echo n) | git reset -p && | ||
verify_saved_state dir/foo && | ||
verify_saved_state bar | ||
' | ||
|
||
test_expect_success 'git reset -p' ' | ||
(echo n; echo y) | git reset -p && | ||
verify_state dir/foo work head && | ||
verify_saved_state bar | ||
' | ||
|
||
test_expect_success 'git reset -p HEAD^' ' | ||
(echo n; echo y) | git reset -p HEAD^ && | ||
verify_state dir/foo work parent && | ||
verify_saved_state bar | ||
' | ||
|
||
# The idea in the rest is that bar sorts first, so we always say 'y' | ||
# first and if the path limiter fails it'll apply to bar instead of | ||
# dir/foo. There's always an extra 'n' to reject edits to dir/foo in | ||
# the failure case (and thus get out of the loop). | ||
|
||
test_expect_success 'git reset -p dir' ' | ||
set_state dir/foo work work | ||
(echo y; echo n) | git reset -p dir && | ||
verify_state dir/foo work head && | ||
verify_saved_state bar | ||
' | ||
|
||
test_expect_success 'git reset -p -- foo (inside dir)' ' | ||
set_state dir/foo work work | ||
(echo y; echo n) | (cd dir && git reset -p -- foo) && | ||
verify_state dir/foo work head && | ||
verify_saved_state bar | ||
' | ||
|
||
test_expect_success 'git reset -p HEAD^ -- dir' ' | ||
(echo y; echo n) | git reset -p HEAD^ -- dir && | ||
verify_state dir/foo work parent && | ||
verify_saved_state bar | ||
' | ||
|
||
test_expect_success 'none of this moved HEAD' ' | ||
verify_saved_head | ||
' | ||
|
||
|
||
test_done |