web-dev-qa-db-ja.com

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

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

既存のコミットされていない変更を新しいブランチに移動して現在のブランチをリセットする方法を教えてください。

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

2793
Dane O'Connor

以下を使用してください。

git checkout -b <new-branch>

これはあなたの現在のブランチをそのままにして、新しいブランチを作成してチェックアウトし、あなたのすべての変更を保存します。あなたはそれからコミットすることができます:

git add <files>

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

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

作業ディレクトリー内の変更および索引にステージングされた変更は、まだどのブランチにも属していません。これらの変更が終わるところでこれは変わります。

あなたは reset あなたの元のブランチをしません、それはそのままです。 <old-branch>に対する最後のコミットはまだ同じです。したがってあなたはcheckout -bしてからコミットします。

3265
knittl

あるいは

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

    $ git stash

  2. この隠し場所に基づいて新しいブランチを作成し、新しいブランチに切り替えます。

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

ヒント:隠し場所の名前の入力を減らすには、Tabキーを使用します。

287
Robin Qiu

コーディングしている間にメインブランチでコミットしていた場合は だが、ここでそれらのコミットを別のブランチに移動したいと思う。

  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以外の場所にプッシュするように設定した場合、その設定は失われます。

このリセット手法を使うこともできます 。しかし、それらの指示はあなたが持っているコミットされていない変更を破棄します。それらを保持したい場合は、最初にそれらを隠し、最後にそれらを隠します。

40
joeytwiddle

コミットする場合は、単一のコミットIDを選ぶこともできます。私はmasterで作業を始めるときによくこれを行います。そしてOrigin /にプッシュする前にローカルブランチを作成したいと思います。

git cherry-pick <commitID>

ここ で説明されているように、チェリーピックでできることはたくさんありますが、これはあなたにとってのユースケースかもしれません。

16
password

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

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply
11
Alex Burov

@ 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
NBhat

GitHub Desktopでこれを行う簡単な方法が実際にはありますが、これは以前は機能ではなかったと思います。

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

GitHub Desktop

0
Kristofer Doman