既存のコミットされていない作業をGitの新しいブランチに移動する


3126

私は新しい機能のいくつかの作業を開始し、少しコーディングした後、私はこの機能が独自のブランチにあるべきだと決めました。

既存のコミットされていない変更を新しいブランチに移動し、現在のブランチをリセットするにはどうすればよいですか?

新しい機能に関する既存の作業を維持しながら、現在のブランチをリセットしたい。


同じ興味深い件名stackoverflow.com/q/556923/269514
ジルベルト

回答:


3642

以下を使用します。

git checkout -b <new-branch>

これにより、現在のブランチがそのまま残り、新しいブランチを作成してチェックアウトし、すべての変更を保持します。次に、ファイルの変更をステージングして、コミットします。

git add <files>

そしてあなたの新しいブランチにコミットします:

git commit -m "<Brief description of this commit>"

作業ディレクトリの変更とインデックスにステージングされた変更は、まだどのブランチにも属していません。これにより、変更が終了するブランチが変更されます。

元のブランチはリセットせず、そのままです。最後のコミット<old-branch>は同じままです。したがって、あなたはcheckout -bそれからコミットします。


アップデート2020 / Git 2.23

Git 2.23は、(ブランチの切り替え、ファイルの復元、HEADのデタッチなど)switchの過負荷使用による混乱を解消するために、新しいサブコマンドを追加していcheckoutます。

このバージョンのGit以降、上記のコマンドを次のように置き換えます。

git switch -c <new-branch>

動作は同じで、変更されません。


15
念のため、元のブランチをリセットする前に、未完成の機能をコミットする必要がありますか?または、コミットされていなくても、コミットされていないファイルは保持されますか?
デーン・オコナー、

192
参考:作業ディレクトリの変更とインデックスにステージングされた変更はブランチに属しません。git checkout -b <new branch>これらの変更が終了する変更
JakubNarębski

152
すでにブランチがあり、変更を既存のブランチに移動する場合は、stackoverflow.com
questions / 556923 /…を

14
:あなたは、リモートリポジトリに新しいブランチをプッシュしたい場合stackoverflow.com/questions/2765421/...
ドウェイン

10
@JDSmith:コミットされていない変更どのブランチにも属していません。それらは作業ディレクトリにのみ存在し、git checkout ./ git reset --hard回復不能にそれらを削除します
knittl 2015年

330

または:

  1. 現在の変更を一時的な隠し場所に保存します。

    $ git stash

  2. このスタッシュに基づいて新しいブランチを作成し、新しいブランチに切り替えます。

    $ git stash branch <new-branch> stash@{0}

ヒント:スタッシュ名の入力を減らすには、タブキーを使用します。


51
他のブランチがすでに存在する場合は、チェックアウトしてに切り替えるだけで済みますgit stash apply
Archonicの

6
「ヒント:スタッシュ名の入力を減らすためにタブキーを使用する」というヒントがわかりません。「stash @ {0}」は名前ではありませんか?正常に実行できません。
ハーバート

7
なぜこれは受け入れられた回答よりも優れているstackoverflow.com/a/1394804/754997
クリスページ

10
なぜこれがgit checkout -b <new branch name>
Noitidartの

6
git add -A隠しておく前に必要はありません。
vichle 2018

48

コーディング中にメインブランチでコミット行っていたが、それらのコミットを別のブランチに移動したい場合、これは簡単な方法です。

  1. 現在の履歴を新しいブランチにコピーし、コミットされていない変更もすべて持ち込みます。

    git checkout -b <new-feature-branch>
    
  2. ここで、元の「乱雑な」ブランチを強制的にロールバックします((それに切り替えずに)。

    git branch -f <previous-branch> <earlier-commit-id>
    

    例えば:

    git branch -f master origin/master
    

    または、4つのコミットを行った場合:

    git branch -f master HEAD~4
    

警告: git branch -f master origin/masterはそのブランチの追跡情報リセットします。したがって、masterブランチをそれ以外の場所にプッシュするorigin/masterように構成した場合、その構成は失われます。

警告:ここ説明されているように、分岐後にリベースする場合にも危険があります。これを回避する唯一の方法は、チェリーピックを使用して新しい履歴を作成することです。そのリンクは、最も安全で簡単な方法を説明しています。コミットされていない変更がある場合はgit stash、最初とgit stash pop最後に変更することをお勧めします。


6
これは、オペレーションが尋ねたものとは少し異なる質問に答えます。私がこの答えをここに置くことに決めたのは、これが私が答えを探していたときにGoogleが私をもたらした場所だからです。この状況に対処する実際の質問はここにあります
joeytwiddle 16

26

一般的なシナリオは次のとおりです。新しい機能の新しいブランチを作成するのを忘れて、すべての作業を古い機能のブランチで行っていました。私はすべての「古い」作業をマスターブランチにコミットしました。新しいブランチを「マスター」から成長させたいと思います。私は新しい仕事を1回もコミットしていません。これがブランチ構造です: "master"-> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

コミットする場合は、単一のコミットIDを選択することもできます。masterで作業を開始し、自分のorigin /にプッシュアップする前にローカルブランチを作成するときに、これを頻繁に行います。

git cherry-pick <commitID>

ここで説明するように、チェリーピックでできることはたくさんありますが、これはユースケースになる可能性があります。


2
部分的な変更を新しいブランチに移動するためのより良い解決策...今のところ必要なものをコミットし、他のすべての変更を隠し、ブランチするブランチをチェックアウトし、コミットを新しいブランチにチェリーピックして、戻る元のブランチに戻り、コミットをハードリセットしてから、スタッシュポップを実行し、追加、コミット、ハレルヤを歌います。
メレディス

1
@メレディス、ハハ、そうだね。これはすばらしいことです。事前に変更を計画しない限り、そして誰がそうするのかは
ます

1

これは、GITのツールを使用するすべてのユーザーに役立つ場合があります

コマンド

ブランチを切り替える-変更を新しいブランチに移動します。その後、変更をコミットできます。

 $ git checkout -b <new-branch>

TortoiseGIT

リポジトリを右クリックして、TortoiseGit-> Switch / Checkoutを使用します

ここに画像の説明を入力してください ここに画像の説明を入力してください

SourceTree

「チェックアウト」ボタンを使用してブランチを切り替えます。ブランチをクリックすると、上部に「チェックアウト」ボタンが表示されます。現在のブランチからの変更は自動的に適用されます。その後、それらをコミットできます。

ここに画像の説明を入力してください


0

私は@Robinの回答を使用し、自分がしたことをすべてリストしました

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

リポジトリに複数のスタッシュがある場合は、新しいブランチに適用するスタッシュを確認します。

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

個々の隠し場所を調べます

git stash show stash@{1}

または、すべてのスタッシュを一度に検査します。

git stash list -p

0

GitHubデスクトップでこれを行うには本当に簡単な方法がありますが、今までの機能とは思えません。

GitHubデスクトップで新しいブランチに切り替えるだけで、現在のブランチに変更を残しておくか(隠しておく)、新しいブランチに変更を持ち込むように求められます。2番目のオプションを選択するだけで、変更が新しいブランチに反映されます。その後、通常どおりコミットできます。

GitHubデスクトップ

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