2016-12-16 9 views
0

?、私は1つに私のすべてを組み合わせたいgitコミットを結合するにはどうすればいいですか?他のコミットが私の丸太の間に存在する場合、1つのgitのハッシュに私のコミットのすべてを組み合わせる方法

e.g 

asdadf = mine 
sdffdf = other dev 
34234a = another dev 
asdfaf = other dev 
23423a = mine 
a23232 = another dev 
asdfsd = other 
adsf23 = mine 
asdfa= = anotherdev 
23423a = anotherdev 

にのみコミット?他のコミットが私の上に構築されている可能性があるので心配しています。

+3

'git rebase --interactive'を見ると、好きなようにシリーズの並べ替えやスカッシュができます。 – jthill

+0

対話型のリベースやフィルタブランチがなくても、ブランチの履歴を真剣に並べ替えることはできません。おそらく、あなたはなぜこれを行う必要があると思うか教えていただけますか?上記の例では –

+0

ですが、これは既にステージングのログです。今は生産に移る必要があります。他のgitは準備ができていません。そして、私はgitをすべて組み合わせてコミットする必要があります。ハッシュ..どのように? – sasori

答えて

1

あなたはgit rebase --interactiveを使用してそれを行うことができますが、開始する前に、あなたの行動の悪影響に注意してください。

履歴を書き換えようとしています。これは悪いことではありませんそれ自体はですが、同じプロジェクトで作業する他の開発者に影響を与える可能性があります。それを行い、変更をセントラルリポジトリにプッシュすると、ブランチの新しい履歴が作成されます。

レポや中央リポジトリでは、この新しい履歴が質問に記載されている履歴に置き換わります。しかし、他の開発者のリポジトリは、その置き換えについて知らず、あなたのブランチ(新しい歴史を持つ)は、彼らが知っている歴史から分岐したコードのほんの一部であると考えています。他の開発者が変更を取り出そうとすると、マージコミットと競合が発生する可能性があります。

他のすべての開発者があなたのやりたいことを知っていて、操作を完了してからリポジトリを正しく更新してから作業を続けるまで、変更をプッシュしない限り、安全に行うことができます。


警告が表示されたら、どうすればいいのかを見てみましょう。

まず、レポがクリーンな状態であることを確認してください。それについて学ぶにはgit statusを使用してください。クリーンでない場合は、変更をコミットまたは隠してから続行してください。

歴史を修正起動するコマンドは次のとおりです。

git rebase --interactive asdfa 

git rebaseコマンドの引数はハッシュ(または他の識別方法)で、最後のそれはOKで、変更する必要はありませんコミット。私はあなたの説明から他の開発者の最後のコミットのハッシュを選んだ。

あなたは上記のコマンドを実行すると、Gitはあなたがそれのために設定エディタを開きます(同じあなたはgit commitを実行したときに、それが開きます)このようなファイルを持つ:

pick adsf23 commit message #n 
pick sdffdf commit message #2 
... 
pick asdadf commit message #1 


# Rebase asdfa..asdadf onto asdfa (8 commands) 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
... more lines follow here ... 

ファイルには、次の2つのセクションがあります。最初の部分、pickで始まる行には、リベースするコミットのリストと、それらを実行する操作が含まれています。 2番目の部分はコメントであり(各行は#で始まります)、操作に関する指示が含まれています。それらを読んで一人で放しましょう。

コミットは、時系列順にリストされています。最初のものは最も古いものであり、最後のものは最新のものです。

コミットラインを並べ替え、リストの最後に配置します。次に、コミットの最初のものを除いて、picksquashに置き換えます。他のものを変更しないでください。行を削除しないでください。コミット行を削除すると、対応するコミットが履歴から削除されます。おそらくこれは起こりたくないでしょう。

ファイルを保存してエディタを終了します。エディタを終了すると、Gitはあなたがファイルで指定した指示を使ってコミットを再起動します。コマンドラインで提供されているリビジョンに戻ってから、ファイルに記述されているように、変更を1つずつ適用します。最初に他の開発者のコ​​ミットを適用し(squashのため)、すべてのコミットを1つにまとめて適用します。

操作中に、コミットが他の開発者のコ​​ミットと重複する変更を導入する可能性があるため、Gitは競合に遭遇する可能性があります。この状況ではGitは停止し、停止した理由(競合するファイル)と続行方法を画面に表示します。

競合を修正することができれば、続行できます(ただし、後続のコミットで競合が増える可能性があります)。

あなたはあまりにも多くの競合を取得し、それはそれらを解決することはできません場合は、いつでもコマンドを使用してリベースを中止することができます

git rebase --abort 

これは、あなたが始まったときにそれがあった状態でリポジトリを復元します。

リベースは、成功して完了し、実行するために他の開発者に伝え、中央リポジトリにプッシュした場合:自分のリポジトリに

git fetch origin 
git rebase origin/master 

を正しく新しい歴史を得るために。

1

コミットをリモートブランチにまだプッシュしていない場合はリベースとチェリーピッキングの組み合わせを使用することができます。

これを行うには、コミット履歴を書き直す必要があります。

これを行う1つの方法は、履歴の開始から別のブランチを作成することです。

git branch my_branch <first-commit> 

コミット

git cherry-pick <commit-A> <commit-B> ... 

をチェリーピックそして

git rebase -i <after-this-commit> 

最後に、あなたの現在のブランチにブランチを再統合コミットを潰すために、対話型リベースを使用します。

+0

私は、コミットオプションを使用し、対話型のリベースを使用する代わりに、通常のコミットを行います。 – 1615903

+0

@ 1615903あまりにもいいです。チップのためのthx –

+0

あなたはあなたの答えを修正してくださいできますか?私のステップのステップが必要です...私のポストのデータの例からそれをベースにしてください.... noobここに – sasori

関連する問題