最新のコミットのスカッシュとルートでのコミットのスカッシュに関するいくつかの関連する質問を確認しましたが、どちらもルートにない最近のコミットをスカッシュするのに役立ちません。
これが私の開始シナリオです:
D---E---F---G---H---I---J master
そして私の望ましい結果:
D---E---Z---I---J master
どこは 、 、 、Z
のスカッシュであり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
pick
更新: コマンドの最後で、リベースがHEAD コミットD
で進行中です。E
確かに、開始時に進行中のリベースはなく、git rebase --abort
再度実行中に呼び出すと同じ結果になります。上記のリンクに従って、ルートまたは HEAD でこれを行うと、すべて正常に動作します。
2 番目のアプローチ:
[新しいブランチをマージすることにより (フォーラムの最後の投稿)][ http://git.661346.n2.nabble.com/Non-interactive-squash-a-range-td5251049.htmlgit checkout -b <clean-branch> <start-id> and
) gitを使用する別の試みを行いましたmerge --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 の回答に対する回答です。
チェリーピックは commit で失敗しI2
ます。失敗すると、私のブランチの状態はチェリーピックまで意図したとおりになり、その後にコミットされていない変更が続きます。を呼び出すと、これらのコミットされていない変更がクリアされ、commitが正しいことを確認しました。これは. をコミットしてからチェリー ピッキングを行った後、チェリー ピックが で失敗するのはなぜですか?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$