2017-03-10 12 views
1

リポジトリのローカルクローンにいくつかの変更を加え、それらをローカルブランチでコミットしました。これらの変更を「コミットA」としましょう。私はコミットAの上で作業を続けたいが、私がメインブランチにマージする準備ができたら、コミットAをマージしたくない。Gitのローカルリポジトリとリモートリポジトリのファイルの違いをどうやって維持できますか?

私はgit rebase -iを使用してコミットAを削除できると思っていますが、そのコミットを維持する方法があるので、将来の作業をその上で行うことができますか?そして、再び、コミットせずにメインブランチにマージされました。

私がやっていることは少しスケッチですが、コミットAで変更された行は、 。この変更は、サードパーティライブラリの異なるバージョンを参照する必要があるため、マシン間の違い(生産とテスト)に関連しています。

答えて

1

私はgit rebase -iを使用してコミットAを削除できると思っていますが、そのコミットを維持する方法はありますか?そのため、今後の作業はその上で行うことができますか?そして、再度、コミットせずにメインブランチにマージされました。

タグを付けることができます。ブランチから削除されたコミットは削除されません。その後、必要なときにタグをチェリーピックすることができます。うーん

git tag somename SHA1 
... 
git rebase -i OLDREV 
... 
git cherry-pick somename 
1

、多分これ:それはある

は、二つのブランチ、テストのための変更で製品版1のための変更で1を作成します。そうすれば、あなたのワークフローは次のようになります。

1) Pull updates 
2) Create a local working/topic branch 
3) Merge from Test branch 
4) Do your work, test, etc. 
5) When ready to push back, first merge from Prod branch 
6) Merge back into your main/develop/master branch 
7) Push 

それは機能しますか?

1

私がその状況で行ったことは、コミットA(コミットしていない)の変更を隠していることです。そうすれば、私はそれらの変更に取り組むためにいつでも、隠しを適用します(下記参照)。しかし、私がそれらをコミットしない限り、私は彼らがリモートで終わることを心配する必要はありません。これは、Aで変更されたファイルが、作業中のファイルと同じでない場合に最も簡単です。

これを今設定するには、ブランチ上の最後のコミットをAとします。

git reset --soft HEAD~1 
git stash 

以降:

git stash list 
git stash apply [email protected]{n} 

git stash listは、私は私の答えに到達する前にn

+1

これはうまくいきますが、私が個人的に好きではない理由が2つあります。 (1)偶発的に変更をコミットしないように注意する必要があります。これにより、ワークフローの任意の場所で余分な作業が発生する可能性があります。 (2)私はちょうど長寿命のひだが好きではありません。短期間の休憩を使わないのであれば気にしないだろうと思っていますが、私は長期的な休みを自分のやり方で得ることができます。しかし、ymmv –

1

を見つけることです:私は、根本的な問題(別のマシン上で異なるコードを必要とする)内に近づい推薦します私はこれが最終的にあなたの問題を引き起こすと思われるので、より正式な方法。言語やツールに応じて、それは簡単ではないかもしれません(もちろん、言語やツールなどを知らなくても一般的なソリューションを提供することはできませんが、価値があるかもしれません)。

でもねえ、ここにあなたがそれを固執作ると思います方法です、あなたの現在のアプローチは、あなたのために正常に動作するために起こっていると仮定すると:変更フォームをプッシュする

あなたはこのような状況で

X --- X <--(origin/master) 
     \ 
     A --- B --- C <--(master) 

を開始BおよびCであるが、Aではない。さらに、AB、およびCのすべての変更に基づいてローカルで作業を続けたいとします。物事はのようにスムーズに彼らができるように実行するようにするに

あなたはドン(あなたがDを持って、それをプッシュしたいとき)以降のように、あなたはまた、」、GitはBCからの変更はの世話をしていることを実現したいと思います無意味な紛争解決の束をやってしまう。

まず、対話型のリベースを行います。 Aを削除する代わりに、TODOリストの最後に移動します。この操作の後、あなたは持っている必要があり

X --- X <--(origin/master) 
     \ 
     B' --- C' --- A' <--(master) 

(技術的にはA、B、およびCは、まだうろついていると、あなたがする必要がある場合は、それらに戻って得ることができる。しかし、すべてがうまくいけば、あなたがする必要はありません。

今度は、masterをコミットしてプッシュしてから、に戻ってmasterをプルします。

X --- X --- B' --- C' <--(origin/master) 
        \ 
         A' <--(master) 

を得

git reset --hard HEAD^ 
git push 
git reset --hard [email protected]{1} 

、必要に応じて繰り返して、続けていく

1

使用git rebase --ontorebase documentationは一致--ontoを使用しての良い例がありますA.に(は含まない)までのすべてをリベースしますあなたが説明しているシナリオ。基本的に、あなたはどうなる:

git rebase --onto master A 

を(あなたが後でそれに取り組んで維持したいので)あなたは現在のブランチをリベースしたくない場合は、単に最初の新しい一時的なブランチをチェックアウト:

git checkout -b new-temporary-branch 
git rebase --onto master A 

次に、マスタにマージすることによって、新しいブランチにマスターを早送りします。

関連する問題