スカッシュの犯にGit?[重複]
-
11-09-2019 - |
質問
この質問に答えはこちら
と git rebase --interactive <commit>
きスカッシュの犯とします。
ことになるすべての大きいスカッシュする為の初期コミットするこのようないます。
ある方を達成しうるかである。
緩やかに関連:
に関連する質問という理由だとは異なるアプローチをする必要性についてつぶに対する最初のコミットするものであるために、第二のです。
ついて興味のある方はもちろん: git:どのように挿入し、コミットして最初に移行すべてのかもしれません。
解決
更新日2012年git1.7.12+)
またrebaseすべての犯までのルートを選びのコミット Y
敷きに最初に X
.
git rebase -i --root master
pick sha1 X
squash sha1 Y
pick sha1 Z
git rebase [-i] --root $tip
このコマンドが利用できるようになりに書き換えの歴史から"
$tip
"根元す。
見 コミットdf5df20c1308f936ea542c86df1e9c6974168472GitHub から クリス-ウェブ(arachsys
).
独自の答え(2009)
ダウンロードいただけますの異なるレシピので問題"い合の犯のgitリポジトリとは?"
チャールズベイリー の提供が最も 詳細な回答, チであるとコミットは完全ツリーまたは負荷を前ます。)。
このコミットの初期コミットおよびコミットの結果につぶしていない共通の上位.
ということはできません"commit --amend
"初期コミットへの新しrebaseの新しい初期コミットの歴史は、前初期コミットを様々な衝突)
この最後の文章ではなくなり、それ git rebase -i --root <aBranch>
)
な( A
のオリジナルの"初期コミット"、 B
その後のコミットを敷き、初期)
の前回のコミットしたい形式の初期コミットを取り外しのでヘッド):
git checkout <sha1_for_B>
リセットの支店のポインタの初期コミットが残し、インデックスのワーキングツリーそのままに:
git reset --soft <sha1_for_A>
改正当初のツリーをツリーから"B":
git commit --amend
一時的にタグこの新しい初期コミットを使ったりすることは記憶に新しいコミットsha1手動):
git tag tmp
行の支店とマスターはこの例):
git checkout master
再生すべての犯後にBを新たな初期コミット:
git rebase --onto tmp <sha1_for_B>
削除の仮設タグ:
git tag -d tmp
そのように、"rebase --onto
"を導入していない紛争中の合併以来、rebases歴史 後 最後のコミットB
)敷きには、初期の一つでした A
) tmp
(代表に押しつぶ新しい初期コミット):些細なサウンドデザインの研究を進め合併します。
することができます"A-B
"もの"A-...-...-...-B
"(任意の数を犯きをつぶし、初期ひこ)
他のヒント
私は何のために私に尋ねる自動的に全力を尽くすとしないようにVonCのスクリプトを作り直しました。あなたはそれに2を与えるSHA1sをコミットし、それは一つに、それらの間のすべてを押しつぶすだろう「押しつぶされた歴史」という名前のコミットます:
#!/bin/sh
# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout $2
# reset the branch pointer to the initial commit (= $1),
# but leaving the index and working tree intact.
git reset --soft $1
# amend the initial tree using the tree from $2
git commit --amend -m "squashed history"
# remember the new commit sha1
TARGET=`git rev-list HEAD --max-count=1`
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after $2 onto the new initial commit
git rebase --onto $TARGET $2
何が価値がある、私は常に最初のコミット「何-OP」を作成しないことで、この問題を回避するために、リポジトリ内で唯一のものが空.gitignoreである。
https://github.com/DarwinAwardWinner/ git - カスタムコマンド/ブロブ/マスター/ binに/のgit-myinitする
その方法は、最初のコミットを台無しに何らかの理由があることはない。
、ちょうどリポジトリをリセットし、修正最初のコミットます:
git reset hash-of-first-commit
git add -A
git commit --amend
Gitのリセットはそのまま作業ツリーを残しますので、すべてがまだそこにあります。だからコマンドを追加し、最初は、これらの変更をコミット改正のgitを使用してファイルを追加します。あなたががGitのコメントをマージする能力を失う-iリベースに比べてます。
この第二スカッシュする最初の一つにコミットします:
A-B-C-... -> AB-C-...
git filter-branch --commit-filter '
if [ "$GIT_COMMIT" = <sha1ofA> ];
then
skip_commit "$@";
else
git commit-tree "$@";
fi
' HEAD
(私はAから好むが)ABのコミットメッセージがBから取得されます。
ウーヴェ・クライネ・ケーニッヒの答えと同じ効果がありますが、同様に非初期Aで動作します。
第潰し及び第1、第2書き換えられコミットをもたらすコミット。あなたが最初にコミットオフに基づいて一方の分岐が複数ある場合は、その枝を切り落とし思います。
次の例を考えてみます:
a---b---HEAD
\
\
'---d
ほとんどのケースでの gitのマージとのgit-リベースをするので、望ましいことではない二つの異なる木につながる新しいコミット "AB" にaとbを退治二つの分岐間で動作しなくなります。
ab---HEAD
a---d
あなたが本当にこれをしたい場合は、、それは行うことができます。歴史の書き換えのための強力な(と危険)ツールのための gitのフィルタ分岐のを見てます。
あなたはそのためのgitのフィルタ分岐を使用することができます。例えばます。
git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'
これは、コミットログを捨てるAB-Cになる。
あなたは彼らがリモートにプッシュしてきた前の最後の二つのコミットを修正するインタラクティブリベース使用することができます。
git rebase HEAD^^ -i
これを行うための簡単な方法があります。あなたがmaster
ブランチにしていると仮定しましょう。
すべてのコミットの歴史を削除する新しい孤立したブランチを作成します:
$ git checkout --orphan new_branch
あなたのイニシャルがコミットメッセージを追加します。
$ git commit -a
古いマージされていないマスターブランチを取り除くます:
$ git branch -D master
new_branch
ためにあなたの現在のブランチのmaster
の名前を変更します:
$ git branch -m master