我正在寻找与
完全相同的行为git add -i -p
但是我不是从我的工作目录中编写提交,而是想从提交的(部分)编写我的工作目录。我怎么能这样做?
我的用例是我有几个不同的功能在一个提交中组合在一起,我想逐个测试它们
使用cherry-pick -n
并不是很令人满意,因为它让我完成了删除所有不需要的代码的肮脏工作。我真的只想选择我想要测试的所选更改。
答案 0 :(得分:30)
使用cherry-pick -n并不是很令人满意,因为它给我留下了肮脏的工作 删除所有不需要的代码。我真的只想选择我想要的选定更改 测试
之前的工作可能很脏,但随着git checkout --patch
的出现,您现在可以选择性地放弃更改,类似于git add -p
进行添加。
答案 1 :(得分:10)
您可以使用git reset --mixed HEAD^1
恢复索引,然后使用git add -i
选择您想要的帅哥。
reset
会将索引回滚到上一次提交(基本上不提交任何HEAD),但它不会触及工作树。你现在可以放置你想要的帅哥,提交它们并用git reset --hard HEAD
扔掉其余部分。
答案 2 :(得分:0)
基于Cameron Skinner的出色答案,我将对此进行扩展,以便包含具有多个提交的分支的情况,也许是合并提交,可能是很多“噪音”和你想樱桃挑选非常具体的帅哥。 (这正是我今天发生的事情)
请按照以下步骤操作:
git checkout source-branch
git checkout -b cherry-pick-branch # Gives you a new branch based on source-branch
git reset --mixed master
这将为您提供一个分支,其中所有更改都在文件系统中,但没有任何提交/暂存。然后使用git add -p
有选择地添加要分阶段的部分,然后提交&正常推动。
答案 3 :(得分:0)
删除所有不需要的代码的肮脏工作
如果这不可接受,
git cherry-pick -n ... # Starting from clean status
git reset # unstage
git add -p / -i [<pathspec>…] # add hunks interactively
git restore . # wipe the rest (at root dir)
,例如,如果您想合并到未提交的更改中或不想破坏时间戳,那么像这样使用 git apply
可能是一个更简洁的选择:
git show <commit> | tee _.patch
edit _.patch # strip unwanted hunks
git apply -3 _.patch
(只要git cherry-pick
和git apply
不直接支持-p
)
注意:git checkout / restore -p ...
之类的方法不会始终如一地从特定提交中恢复块,而是从特定文件状态中选择部分 - 可能会丢失其他后续提交中的更改。