我已经回顾了几个有关压缩最近提交和压缩根提交的相关问题,但它们都不能帮助我压缩不在根目录下的非最近提交。
这是我的起始场景:
D---E---F---G---H---I---J master
和我想要的结果:
D---E---Z---I---J master
其中,和,Z
的 squash可以是任意长的非分支提交序列。F---G---H
F---G---H
D---E
I---J
第一种方法:
[lucas]/home/blah/$ git rebase -i D
rebase in progress; onto D
You are currently editing a commit while rebasing branch 'master' on 'D'.
No changes
You asked to amend the most recent commit, but doing so would make
it empty. You can repeat your command with --allow-empty, or you can
remove the commit entirely with "git reset HEAD^".
Could not apply F... "Comments from commit F"
[1]+ Done gitk
[lucas]/home/blah/$
我选择提交F---G---H
的位置squash
,同时将最旧的提交(rebase 交互中的第一行)保留为pick
. 为什么这不起作用?
更新:在命令结束时,D
作为E
HEAD 提交正在进行 rebase。可以肯定的是,开始时没有正在进行的变基,并且git rebase --abort
在再次运行时调用具有相同的结果。根据上面的链接,当我在根目录或 HEAD 执行此操作时,一切正常。
第二种方法:
我再次尝试[通过合并一个新分支(论坛上的最后一篇文章)][ http://git.661346.n2.nabble.com/Non-interactive-squash-a-range-td5251049.html)使用git checkout -b <clean-branch> <start-id> and
git合并 --squash `,但我得到以下信息:
[lucas-ThinkPad-W520]/home/.../.Solstice_WS/7K_FGHF$ git checkout -b clean-branch D
Switched to branch 'clean-branch'
[lucas-ThinkPad-W520]/home/.../.Solstice_WS/7K_FGHF$ git merge --squash I
Updating D..I
Fast-forward
Squash commit -- not updating HEAD
.../GraphUtilities/impl/DAG.java | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
[lucas]/home/blah/$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
asdf/GraphUtilities//DAG.java
Please, commit your changes or stash them before you can switch branches.
Aborting
这似乎有这个结果:
------------------- <clean-branch> with non-committed changes
/
D---E---F---G---H---I---J <master>
我有点难过,所以我怎样才能压缩这些提交?
最终,我计划在 中实现这个JGit
,所以JGit
实现也是可以接受的。
笔记
这里可能有重复,但没有答案,我认为这个问题有点不清楚。
更新
这是对@ryenus在下面的回答的回应:
樱桃挑选在提交时失败,在I2
哪里。当它失败时,我的分支的状态一直是 ,直到樱桃挑选,然后是未提交的更改。调用会清除这些未提交的更改,并且我验证了提交是正确的,即. 提交之后,然后进行樱桃采摘,为什么樱桃采摘失败?I2
I---I2---J
work
D---E---Z
git cherry-pick --abort
Z
F---G---H
Z
F
似乎git cherry-pick I...J
正在尝试樱桃挑选I2
,这会产生合并冲突并失败。有什么建议么?
这是我的输出:
[lucas]/home$ git checkout -b work H
Switched to a new branch 'work'
[lucas]/home$ git reset E
Unstaged changes after reset:
M adf/GraphUtilities//graph/impl/DAG.java
[lucas]/home$ git commit -am "squashed commit here!"
[work Z] squashed commit here!
1 file changed, 2 insertions(+), 5 deletions(-)
[lucas]/home$ git cherry-pick I...J
error: could not apply I2... <Comments from commit I2>
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
[lucas]/home/$ git status
On branch work
You are currently cherry-picking commit I2.
(fix conflicts and run "git cherry-pick --continue")
(use "git cherry-pick --abort" to cancel the cherry-pick operation)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: 3b6863741967406c1888701eb139178187d429487b99787096441d67bed56/Gra
phUtilities/src/edu/washington/cs/utils/graph/impl/DAG.java
no changes added to commit (use "git add" and/or "git commit -a")
[lucas]/home$