web-dev-qa-db-ja.com

ワークスペースファイルを変更せずに別のブランチに切り替える

GitHubからgitリポジトリを複製し、いくつかの変更といくつかのコミットを行いました。私はかなりたくさん作りましたが、すべてがかなり汚れているので、プルリクエストには適していません。ブランチcleanchangesOrigin/masterから作成したので、きれいになりました。そこで、1つのコミットとしてNice commitコメントを付けて変更をコミットしたいと思います。

ローカルマスターを使用しているときに、ファイルを変更せずにcleanchangesに切り替えたい。そして、私はコミットすることができます。

ファイルを変更せずにブランチを切り替えるにはどうすればよいですか?

明確にしたい:すべての変更をローカルmasterでコミットしています。コミットされていない変更はありません。

61
amorfis

編集:既にいくつかのコミットを作成していると言ったことに気づきました。その場合、git merge --squashを使用して単一のコミットを行います。

git checkout cleanchanges
git merge --squash master
git commit -m "Nice commit comment for all my changes"

編集:次の回答は、uncommitted変更がある場合に適用されます。)

git checkout cleanchangesでブランチを切り替えるだけです。ブランチが同じrefを参照する場合、切り替えたときに、コミットされていない変更はすべて作業ディレクトリに保存されます。

競合が発生するのは、リポジトリ内のファイルがOrigin/mastercleanchangesで異なる場合のみです。ブランチを作成したばかりであれば、問題ありません。

いつものように、仕事を失うことを心配している場合は、最初にバックアップコピーを作成してください。 Gitは、最初に確認せずに作業を破棄しないように設計されています。

55
Greg Hewgill

Git。別のブランチへの切り替え

git checkout branch_name
40

最善の策は stash 変更とブランチの切り替えです。ブランチを切り替えるには、クリーンな状態が必要です。それらを隠して、新しいブランチをチェックアウトし、新しいブランチに変更を適用してコミットします

9
vivek85

別の方法、マージを実行する代わりに新しいコミットを作成する場合:

git checkout cleanchanges
git reset --hard master
git reset cleanchanges

git status
git add .
git commit

最初の(ハード)リセットは、作業ツリーをmasterの最後のコミットと同じに設定します。

2番目のリセットは、HEADを元の場所に戻し、cleanchangesブランチの先端を指しますが、ファイルを変更しません。これで、追加してコミットできます。


その後、masterから作成したダーティコミットを削除する場合(まだプッシュしていないと仮定)、次のことができます。

git checkout master
git reset --hard Origin/master

これにより、すべての新しいコミットが破棄され、ローカルmasterブランチがリポジトリ内のコミットと同じコミットに戻ります。

1
joeytwiddle

変更を加え、途中でマスターするようにコミットし、それらを1つのコミットに結合したいようです。

もしそうなら、あなたは rebase コミットをしたい、それらを単一のコミットに潰します。

私はあなたが何を望んでいるかを完全に確信していないので、スクリプトであなたを誘惑するつもりはありません。しかし、git rebaseと「スカッシュ」のオプションを読んで、いくつか試してみることをお勧めします。

1
timdev

なぜgit reset --soft <branch_name>だけではないのですか?

デモンストレーション:

mkdir myrepo; cd myrepo; git init
touch poem; git add poem; git commit -m 'add poem'  # first commit
git branch original
echo bananas > poem; git commit -am 'change poem'  # second commit
echo are tasty >> poem  # unstaged change
git reset --soft original

結果:

$ git diff --cached
diff --git a/poem b/poem
index e69de29..9baf85e 100644
--- a/poem
+++ b/poem
@@ -0,0 +1 @@
+bananas
$ git diff
diff --git a/poem b/poem
index 9baf85e..ac01489 100644
--- a/poem
+++ b/poem
@@ -1 +1,2 @@
 bananas
+are tasty

ただし、注意すべき点の1つは、現在のブランチがoriginalに変更されることです。処理後も前のブランチに残りますが、git checkout originalは同じ状態なので簡単にできます。以前のHEADを失いたくない場合は、コミット参照を書き留めてからgit branch -f <previous_branch> <commit>を実行する必要があります。

0
Yushin Washio

最も簡単な方法は次のとおりです。

git fetch && git checkout <branch_name>
0
Mandeep Singh