5

線形ブランチを押しつぶしたり修正したりしようとしたときに、手動でマージする必要があるのはどうしてですか?リポジトリはSubversionから変換されました。すべての競合は、「自動チェリーピックに失敗しました」または「空のコミットメッセージのためにコミットを中止します」のいずれかです。後者は理解できましたが、--fixup-emptyまたは何かが役立つでしょう。

典型的な出力:

user@machine:/path (master|REBASE-i)$ git add * && git rebase --continue 
[detached HEAD c536940] fixup!
 Author: John Doe <John.doe@example.com>
 2 files changed, 57 insertions(+), 4 deletions(-)
Automatic cherry-pick failed.  After resolving the conflicts,
mark the corrected paths with 'git add <paths>', and
run 'git rebase --continue'
Could not apply 8854a54... >6d5f180 foo
user@machine:/path (master|REBASE-i)$ git st
# Not currently on any branch.
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      filename.ics
#
no changes added to commit (use "git add" and/or "git commit -a")
4

3 に答える 3

2

ある種の--fixup-empty機能を持つというあなたのアイデアを実現するための私の提案は次のとおりです。

git filter-branch --msg-filter "sed 's/^$/Unknown/'"

これは空のコミットメッセージを「不明」に置き換えます。空のコミットメッセージがあったSubversionリポジトリを変換した後にリベースを実行したいgit-svnが、「空のコミットメッセージによるコミットの中止」で失敗したためにリベースできない場合に特に便利です。 。

于 2011-05-03T20:37:10.450 に答える
2

これらの作品:

git mergetool
git rebase --continue
于 2011-10-19T09:20:32.067 に答える
0

私はこれと同じ不可解な質問に出くわしました。一連のシーケンシャルコミットからの変更を1つのコミットに変換したかったのですが、一連のスカッシュでインタラクティブなリベースを使用すると、マージの競合が発生し、イライラしていました。少し前のことで、今は最小限の例で再現することができませんでした。いずれにせよ、私はそれを解決する方法を知っているので、ここに行きます:

投稿で求められたことを実行する2つの異なる方法を紹介します。1つは、実行していることを正確に明確にするため、不格好ですが「怖くない」方法です。もう1つは、エレガントでgitコマンドのみを使用するが、gitもう少しあなたの理解を信頼するために。

設定

idA初期状態としてコミットIDがidBあり、最終状態としてコミットIDがあり、その間に他のコミットがたくさんあるとします。中間のコミットをすべて潰したいという事実は、初期状態から最終状態にどのように移行したかを気にしないことを意味します。つまり、ポイントからポイントに移動するコミットが必要なだけidAですidB

idBそれが現在に対応していると仮定してHEAD、それがあなたのmasterブランチでもあるとしましょう。squashedと同じ作業ツリーの内容をmaster持つが、コミットIDの後にコミットが1つしかない、という新しいブランチを作成しますidA

解決策1

  1. git checkout master(すでにオンになっている可能性がありますmaster
  2. bashまたはファイルエクスプローラーを使用して、作業ツリー全体を別の場所にコピーします。ディレクトリを省略してください.git。これは、ほとんどのオペレーティングシステムのデフォルトの動作です。したがって、明確にするために、リポジトリフォルダを開き、すべてを選択し、コピーして、デスクトップまたは任意の場所にある新しいフォルダに貼り付けます。
  3. git checkout -b squashed idAsquashed最新のコミットとしてで呼び出される新しいブランチを作成idAし、それを現在のブランチにします。
  4. (ステップ2で別の場所に置いた)内容をリポジトリフォルダーに貼り付けmasterます。ファイルエクスプローラーから要求された場合は、変更されたすべてのファイルを置き換えるように指示します。
  5. リポジトリのトップレベルで、git add .次にgit commit。新しいコミットには、からidAに移行するすべての変更が含まれますidB

解決策2

git branch squashed idA # make a new branch called `squash` with `idA` as its latest commit 
git checkout master # master is "idB" in this case.
git symbolic-ref HEAD refs/heads/squashed
git commit

そして、voilà。symbolic-refHEADをブランチの先端に移動するために使用するsquashと、作業ツリーの状態と新しいHEADの場所との間の一連の差分が計算されてステージングされます。

gitこれは「危険な」「低レベル」のハッキングであるとの懸念に応えたいと思います。それがどのように機能するかについて、あなたが安心できるように十分に説明しようと思います。あなたの.gitフォルダは、バージョン管理されたすべてのファイルの内容が存在する場所です。その中の2つのフォルダーは、、objectsおよびrefsです。このrefsフォルダーには、ブランチの名前とそれに対応するコミットをgitに通知するファイルが含まれています。.git/refs/heads/masterしたがって、たとえばを開くと、への最新のコミットのコミットIDが表示されmasterます。このobjectsフォルダーには、2文字の16進名を持つサブフォルダーにある一連のファイルが含まれています。オブジェクトは、パッチ、コミット、ファイル全体など、いくつかの異なるものにすることができます。.gitまた、フォルダの最上位にはindexファイルがあります。これは、インデックスファイルの内容に関するすばらしい投稿です。現在の議論で知っておく必要があるのは、インデックスファイルがobjects、現在のブランチとコミットの各ファイルの最新のコミットされたバージョンに対応するオブジェクト(フォルダー内)を示していることです。

そのような背景に対して、ソリューションの機能は次のとおりです。symbolic-refコマンドは、作業ツリーに触れることなく、ブランチではなくブランチにgitいることを「突然」通知します。つまり、あなたのファイルはすべてあなたが知っていて愛している状態に対応していますが、これはコミットされていない変更の束と同じように見えます(つまり、ファイルはすべてのファイルの現在チェックアウトされたバージョンがのバージョンであることを指定します、そしてこれは作業ツリーの変更が測定される基準です)。実際、あなたを状態に導く正確な変化。これはまさにソリューション1が行うことです。この場合、方法のためsquashmastermastergitidAindexidAidBsymbolic-refが実装されている場合、前述の変更はすべてすでにステージングされている(つまりgit add、-ed)ので、実行する必要があるのはですgit commit。これについては「危険」なことは何もありません。なぜなら、それは変化しないか、追跡しているmasterもののいずれかだからです。というフォルダに新しいファイルを作成し、その新しい結合されたコミットに対応するフォルダに1つの新しいファイルを作成しました。あなたはあなたがそれを残したところにすぐそこにいます、あなたは同じ内容でより短いコミット履歴で呼び出された新しいブランチを持っています。何が起こっているのかわからない場合は、できるので安心してください。そのままにしておくとすぐに表示されます。objectsgitrefssquashedobjectsmastersquashedgit checkout master

squashedあなたがあなたの新しいものとして採用したいならmaster、あなたは先に進んでそして

git branch -m master old-master
git branch -m squashed master

そして、すべての不要なコミットがとして保存された古いブランチが作成されold-master、必要masterなものになります。

お役に立てれば!

于 2016-08-14T00:44:07.927 に答える