我可以交互式地从另一个git提交中挑选帅哥吗?

时间:2011-05-03 05:31:56

标签: git

我正在寻找与

完全相同的行为
git add -i -p

但是我不是从我的工作目录中编写提交,而是想从提交的(部分)编写我的工作目录。我怎么能这样做?

我的用例是我有几个不同的功能在一个提交中组合在一起,我想逐个测试它们

使用cherry-pick -n并不是很令人满意,因为它让我完成了删除所有不需要的代码的肮脏工作。我真的只想选择我想要测试的所选更改。

4 个答案:

答案 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-pickgit apply不直接支持-p

注意:git checkout / restore -p ... 之类的方法不会始终如一地从特定提交中恢复块,而是从特定文件状态中选择部分 - 可能会丢失其他后续提交中的更改。