2

Masterブランチには次のようなコミットがありました: A -> B -> C(HEAD). HEADでしたC

私がしたこと :

私はチェックアウトしB、その上にコミットしました。

ツリーは次のようになります。

    A -> B -> C(マスター)(オリジン/マスター)
         | |
         | | -> B1 -> B2(頭)

git statusプロジェクトディレクトリで次のメッセージが表示されます:

# 現在、どのブランチにもありません。
コミットするものは何もありません (作業ディレクトリのクリーン)`

したがって、プッシュできないことB1を意味します。B2これらのコミットはどのブランチにも存在しないため、これが起こっていることを知りました。ブランチを master に戻すと、これらのコミットは失われますか? B3, B4 ... BNこれらの名前のないブランチでさらにいくつかの commit( ) が行われることを期待してCいます。本質的に、私はmasterこのようにブランチを見たいと思っています:

    A -> B -> B1 -> B2 -> B3 -------> BN -> C(マスター)(オリジン/マスター)

または少なくともこの方法:

    A -> B ----------------------> C(マスター)(オリジン/マスター) -> D
         | | ^
         | | | |
         | | -> B1 -> B2 -> -> ...->BN--------------------------

これを達成するために必要なオプションは何ですか? にコミットを保存できるようにしたいorigin

提案/指示をいただければ幸いです。

4

4 に答える 4

3

あなたの望む結果

A -> B -> B1 -> B2 -> B3 -------> BN -> C(master)(origin/master)

リモートリポジトリでCを書き換えることができない限り、これは不可能です。これを行うと、 Cに基づいて作業を行った他のすべての人に問題が発生します。

2番目の好み

A -> B ---------------------> C(master)(origin/master) -> D
     |                                                    ^
     |                                                    |
     | -> B1 -> B2 -> -> ...->BN--------------------------

簡単です: Magnus が言うように、 B2 (またはシーケンス内の現在の最新のコミット) にブランチ名を付けると、人生がずっと楽になります: これは、ハッシュよりも覚えやすく、入力しやすく、ガベージコレクションされないことを確認してください。

git checkout -b bbranch

A -> B -> C(master)(origin/master)
     |                                                    
     |                                                    
     | -> B1 -> B2 (bbranch)

なんらかの理由でB1B2をオリジンにプッシュしたい場合は、通常どおりマージしてプッシュできます。

git checkout master
git pull
git merge bbranch

A -> B ------> C -> D (master)
     |             /
     |            /
     | -> B1 -> B2 (bbranch)

git push

bbranchの作業を続けて、完了したら再びマージできます

A -> B ------> C -> D -> E -> ... -> En -> F (master)
     |             /                      /
     |            /                      /
     | -> B1 -> B2 -> B3  ->  ...  -> Bn  (bbranch)

注:なんらかの理由でコミットをオリジンにプッシュしたいが、 masterにはプッシュしたくない場合は、単純にbbranchをプッシュするだけでコミットが取得されます。次に、誰もbbranchに触れないようにするか、ローカル コピーをリモート トラッキング ブランチにする必要があります。

この場合、マージ ステップB2 -> Dをに置き換えます。git push origin bbranch

于 2012-02-23T16:57:59.620 に答える
1

コミット用に新しいブランチを作成しない理由がわかりません。これが私がすることです:

git checkout B
git checkout -b fix
.. do some stuff
git commit -am 'did some stuff to B'
git checkout master
git merge fix

最初の答え:

git checkout master
git merge B2

コミットへの参照を(git gcなどで)クリーンアップしない限り、コミットが失われることはありません。変更をコミットしている限り、安全です。

于 2012-02-23T16:08:05.240 に答える
1

あなたが求めているのは、私の理解が正しければ、ブランチの一部ではないコミットを外部リポジトリで可視化する方法です。

コミット B1 と B2 は、SHA1 ハッシュでアクセスできますが、名前付き参照ではアクセスできません。したがって、git の観点からは、それらは「ゴミ」であり、最終的にはgit gc(設定で定義された十分な時間が経過した後) によってクリーンアップされます。

を実行するgit pushと、リポジトリの「一部」である変更がプッシュされます。これには、名前付き ref からアクセスできるすべての変更セットが含まれます。「ガベージ」コミットは行きません。

したがって、変更を他のブランチの一部にしたくないが、それでもプッシュしたい場合は、それらを独自のブランチにする必要があります。これにより、それらをプッシュできるようになり、それらにアクセスするためのハンドルが与えられ、(望ましくない) ガベージ コレクションが行われなくなります。

一方、ゆるいコミットをブランチの一部にする準備ができている場合は、 (それらを現在の の上に置く) または(現在の正確な履歴を保持しながら master と統合する) 必要があります。「最初の」例としてコミットを含めるようにブランチを書き直すこともできますが、これはお勧めしません (特に、既に別の状態でプッシュしている場合)。mastergit rebasemastergit mergemastermaster

HEAD「に戻すと、それらのコミットは失われますか?」という質問に明確に答えるにmasterは、答えは「最終的にはイエスですが、すぐにはノーです」です。コミットの明示的な SHA1 ID のチェックアウトを実行できます (およびgit reflog、またはHEAD@{1}構文を使用してそれらを見つけます)。しかし、それらに名前付き参照を添付しないと、やがてそれらはなくなります。

于 2012-02-23T16:13:36.733 に答える
0

--interactive オプションで git rebase を確認してください。

于 2012-02-23T16:12:40.520 に答える