現在の変更でGitブランチを作成する


850

私は私のマスターに取り組み始めました私の仕事は簡単だと思いブランチで。しばらくすると、さらに多くの作業が必要になることに気づき、すべての作業を新しいブランチで実行したいと考えています。

どうすれば新しいブランチを作成し、マスターをダーティにすることなくこれらすべての変更を行うことができますか?




4
はい、これらは重複した質問ですが、表現が非常に異なるので、これを維持するのに役立ちます。ここのキーワードに注意してください:branch current changesvs existing uncommited branch。英語を話す人なら誰でも同じであることがすぐにわかりますが、検索エンジンではおそらく違います。この質問を保管してください。
Scott Biggs

回答:


691

まだコミットしていない場合は、(1:ブランチ)と(3:チェックアウト)で十分です。
または、1つのコマンドで:git checkout -b newBranch

git resetmanページで述べたように:

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. あなたはいくつかのコミットを行いましたが、それらが「master "ブランチ。あなたはトピックブランチでそれらを磨き続けたいのでtopic/wip、現在から「」ブランチを作成しますHEAD
  2. masterブランチを巻き戻して、これらの3つのコミットを削除します。
  3. topic/wip」ブランチに切り替えて作業を続けます。

注:git reset --hardコマンドの「破壊的」効果のため(インデックスと作業ツリーはリセットされます。作業ツリー内の追跡ファイルへの変更<commit>は破棄されるため)、次のようにします。

$ git reset --soft HEAD~3  # (2)

これにより、プライベートファイルが失われないようになります(インデックスに追加されません)。
この--softオプションは、インデックスファイルにも作業ツリーにもまったく触れません(ただし、ヘッドを<commit>、すべてのモードと同様ににます)。


Gitの2.23+新しいコマンドがgit switch(同じ種類で1行にブランチを作成しますreset --hardので、その効果には注意してください):

git switch -f -c topic/wip HEAD~3

6
また、トピックの素材を他の人が取得したリポジトリのマスターブランチにコミットした場合、これは良いアイデアではないことにも注意してください。または、少なくとも、リセットを行う必要がある場合は、そのことをユーザーに伝える必要があります。そのため、次のプルからの警告はそれほどショックではありません。
Andrew Walker

39
将来の読者への注意:下から上に読んでください(または全体を必ず読んでください)。git reset --hardあなたの変更を核にし、それらがまだコミットされていない場合、それらは回復不可能です!必要なだけかもしれませんgit checkout -b …
コンラッドマイヤー2012年

3
@ConradMeyer良い点。私は答えを編集してgit checkout -b最初に入れました。
VonC、2012年

5
なぜトピック/ブランチ?? なぜブランチ名だけではなく、この命名に特別な理由があるのですか?ただ疑問に思います。
Sam Stoelinga

1
@名前空間の命名規則にすぎません(階層的なブランチ名を使用して名前空間を定義し、ブランチを簡単に分類する方法):stackoverflow.com/a/2527436/6309。たとえば、問題の場合:randyfay.com/content/…。ブランチに名前を付けるときに、階層を使用する必要はありません。topic_wipも動作します;)
VonC '29

269

この質問で述べたように:Git:マスターでタグなし/コミットされていない変更からブランチを作成します:stashは必要ありません。

ただ使用する:

git checkout -b topic/newbranch

コミットされていない作業はすべて新しいブランチに送られます。

プッシュしようとすると、次のメッセージが表示されます

fatal:現在のブランチ機能/ NEWBRANCHには上流ブランチがありません。現在のブランチをプッシュし、リモートをアップストリームとして設定するには、次を使用します

git push --set-upstream origin feature/feature/NEWBRANCH

リモートでブランチを作成するために提案されたようにしてください:

git push --set-upstream origin feature/feature/NEWBRANCH


3
新しい作業をコミットするときではなく、新しいブランチをプッシュした場合にのみ、「上流のブランチがない」エラーが発生します。
sam

2
@sam私はそれに応じて答えを修正しました
Nick Kennedy

73

次の手順を実行します:

  1. 新しいブランチを作成します。

    git branch newfeature
    
  2. 新しいブランチをチェックアウト:(これは作業をリセットしません。)

    git checkout newfeature
    
  3. 次に、この新しいブランチで作業をコミットします。

    git commit -s
    

上記の手順を使用すると、元のブランチがクリーンに保たれ、「git reset --hard」を実行する必要はありません。


3
ステップ3で「-s」は何をしますか?
Scott Biggs

12
@ScottBiggs必要ではありませんが、一部の人々が従う慣習です。これは「--signoff」の省略形であり、ログを確認する将来の人々がこのコミットを容認したことを知るために、コミットにユーザー名を追加します。
フランクブライス

5
ニースの答えは、しかしが不要-s手順3で
モハメド・アリ

コメントから新しいことを学びました。ありがとう@FrankBryce
Kasparov92

30

まだコミットを行っていないので、すべての変更をstashに保存し、作成して新しいブランチに切り替え、それらの変更を作業ツリーに戻すことができます。

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list

9
または、VonCが「git checkout -b newbranch」を指摘し、隠し場所をスキップする
willcodejavaforfood

@will:新しいブランチを作成すると、コミットされていない変更が上書きされると思っていましたが、そうでない場合は、スタッシュをスキップできます。
Ether

1
私はそれを試してみましたが、うまくいきました、gitは非常に思慮深く、ローカルの変更を上書きしません
willcodejavaforfood

2
私はそれがタイプミスだったと思いますが、それはgit stash pushコマンドではありません。おそらく、git stashまたはを使用しますgit stash save。追跡されていないファイルをスタッシュに含める場合は、--include-untrackedオプションを使用します。同様に、追跡されていないファイルと無視されたファイルの両方をスタッシュに含める場合は、--add代わりにオプションを使用します。
6

すでにブランチを作成している場合は、これが役立ちます。
確かに2016年

13

新しいブランチに新しい変更を追加してリモートにプッシュするには:

git branch branch/name
git checkout branch/name
git push origin branch/name

多くの場合、プッシュするためにオリジンパーツを追加するのを忘れて、ビットバケットに新しいブランチ/コミットが表示されない理由を混乱させます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.