同时git add -p和git checkout -p

时间:2012-07-18 09:48:39

标签: git

我正在手动审查一些消息目录中搜索和替换脚本所做的大量更改(在1000年代)。目前我正在做git add -p,但我一直在休息检查其他文件或调整脚本,所以我将其与git checkout -p交替放弃我不想要的更改。有没有办法将两者结合起来?即对于每个大块,我想要选择暂存它,或者丢弃它。

5 个答案:

答案 0 :(得分:4)

如果您使用的是Windows或Mac OS,则可以使用免费的SourceTree GUI应用程序,该应用程序允许您在差异视图中暂存或丢弃每个块(甚至从每个块中选择行)。

Stage/Discard hunk

答案 1 :(得分:0)

如何为你不想登台的帅哥打字j - leave this hunk undecided, see next undecided hunk, 在所有这些之后,运行git checkout --,那些被选中的人将被上演,其他人将被丢弃。

当您使用git add -p时,输入?会显示帮助

Stage this hunk [y,n,q,a,d,/,e,?]?
y - stage this hunk
n - do not stage this hunk
q - quit, do not stage this hunk nor any of the remaining ones
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

答案 2 :(得分:0)

您是否看过 git gui 。它是一个与git捆绑在一起的实用程序,并且试图使复杂的操作变得容易,这些操作混合了分段和结帐。你可以阅读它here

您可以选择暂存一个大块并放弃其余的更改。通过执行ctrl + jcmd + j,您可以签出所选文件。

我知道从shell使用git要快得多,但在像这样的复杂情况下,在不同命令之间切换会成为开销。

答案 3 :(得分:0)

与Git 2.28(2020年第三季度)更加接近!
以前,“ git checkout -p”根本不处理新添加的路径。

请参见commit 2c8bd84Johannes Schindelin (dscho)(2020年5月27日)。
(由Junio C Hamano -- gitster --commit 2bdf00e中合并,2020年6月9日)

checkout -p:正确处理新文件

报告人:梅林·比格
帮助人:杰夫·金
签名人:Johannes Schindelin

原始补丁选择代码是为git add -p编写的,其工作的基本单位是块。

我们解决了该问题,以处理24ab81ae4d中的删除(“ add-interactive:处理空文件的删除”,2009-10-27,Git v1.6.6-rc0-{{3} })。
但是git add -p永远不会看到新文件,因为我们只考虑索引中的跟踪文件集。

但是,由于git checkout -p和朋友使用了相同的机制,因此我们可以看到新文件。

专门处理这种情况,为其添加一个新的提示,该提示模仿deleted file情况。

这还解决了无法通过_empty暂存已添加的git checkout -p _个文件的问题。

所以git checkout -p的提示现在包括:

Discard mode change from worktree [y,n,q,a,d%s,?]?
Discard deletion from worktree [y,n,q,a,d%s,?]?
Discard addition from worktree [y,n,q,a,d%s,?]?     <===
Discard this hunk from worktree [y,n,q,a,d%s,?]?

如果丢弃不需要的内容并提交所需的内容,则merge将添加新的剩余文件。

答案 4 :(得分:-1)

暂存您需要的所有内容,提交然后重置或藏匿以清除工作目录以摆脱您不需要的内容。