web-dev-qa-db-ja.com

Git:masterブランチから変更を移動します

基本的な質問ですが、これはいつも私に起こります:

  • working-branchに変更を加える
  • masterに切り替え
  • git merge working-branch
  • git Push
  • cap deploy(ステージングへ)
  • 新しいお茶を作る

それから私は戻って何か他のことを考えて、いくつかの変更を始めます...それでもマスターのままです。

次のいずれかに簡単な方法は何ですか?

  1. マスターでの直接編集を防ぐ(おそらく警告)
  2. すべての編集をworking-branchに移動してmasterをクリアし、working-branchで編集を続行できるようにします
  3. 編集をまったく新しいブランチnew-working-branchにスピンし、次にworking-branchを破棄しますか?

このページ の「ブランチ」セクションの後半でリスクを取り、推奨を試みましたが、編集内容がすべて消去されました!?!おそらく、git branch dubious-experimentgit checkout masterの後、両方のブランチのgit statusが同一になったためです(マスターでは「クリーン」ではありません)。 git reset --hard <SHA1sum>は両方のすべての変更を一掃しました!?!

  git branch dubious-experiment

  M---N-----O----P---Q ("master" and "dubious-experiment")

  git checkout master

  # Be careful with this next command: make sure "git status" is
  # clean, you're definitely on "master" and the
  # "dubious-experiment" branch has the commits you were working
  # on first...

  git reset --hard <SHA1sum of commit N>
29
Meltemi

あなたの説明から、私はあなたがまだ変更をコミットしていないと思います-それは正しいですか?

はいの場合、ここにあなたの答えがあります:

マスターへの直接編集を防ぐ方法

エディターで設定する必要がありますが、おそらく難しいでしょう。プロンプトとエディターに現在のブランチを表示すると、非常に役立ちます。

変更を新しいブランチnew-working-branchに移動してから破棄する方法working-branch

git checkout -b new-working-branch
git add …
git commit -m "mycommit" 

マスターに何もコミットしていないので、マスターで何も変更する必要はありません。必要に応じて、作業支店を破棄できます。

変更をworking-branchに移動する方法

git checkout -b temp-branch
git add …
git commit -m "mycommit" 
git rebase --onto working-branch master
git checkout working-branch
git reset --hard temp-branch
git branch -d temp-branch

変更がマスターにあるが作業ブランチではない変更と競合しない場合、これははるかに簡単に行うことができます。

git stash
git checkout working-branch
git stash pop
30
Chronial

masterへの変更をすでにコミットしたが、どこにもプッシュしなかった場合...

最後の変更のために新しいブランチを作成する

git checkout -b newfeat master

working-branchブランチの上ですべての変更を再生(コミットを移動)します

git rebase --onto working-branch Origin/master newfeat

masterブランチに変更し、最後のプッシュの状態にリセットします

git checkout master
git reset --hard Origin/master

この時点であなたは持っています:

  • 最後にプッシュされたコミットを指すmasterOrigin/master
  • working-branchは変更されていません
  • すべての新しいコミットを含み、working-branchよりも新しい新しいnewfeatブランチ。
6
KurzedMetal

私は通常、次のGit設定をお勧めします。

git config Push.default nothing

これにより、プッシュするときに少なくともブランチに名前を付ける必要があります。ローカルでマスターにコミットすることを止めることはありませんが、自分が持っていることに気付いたら、他の人に影響を与えることなく、それらのコミットをブランチに移動できます。

0
Rob Starling

私は同様の場合に使用しました:

git branch -f <branch-name>
git checkout <branch-name>

または

git checkout -B <branch-name>

どちらのバリアントもブランチを移動しますbranch-name現在のコミットにリセットせずにツリーをリセットします。

0
Patrick B.