GitHubからgitリポジトリを複製し、いくつかの変更といくつかのコミットを行いました。私はかなりたくさん作りましたが、すべてがかなり汚れているので、プルリクエストには適していません。ブランチcleanchanges
をOrigin/master
から作成したので、きれいになりました。そこで、1つのコミットとしてNice commitコメントを付けて変更をコミットしたいと思います。
ローカルマスターを使用しているときに、ファイルを変更せずにcleanchanges
に切り替えたい。そして、私はコミットすることができます。
ファイルを変更せずにブランチを切り替えるにはどうすればよいですか?
明確にしたい:すべての変更をローカルmaster
でコミットしています。コミットされていない変更はありません。
編集:既にいくつかのコミットを作成していると言ったことに気づきました。その場合、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/master
とcleanchanges
で異なる場合のみです。ブランチを作成したばかりであれば、問題ありません。
いつものように、仕事を失うことを心配している場合は、最初にバックアップコピーを作成してください。 Gitは、最初に確認せずに作業を破棄しないように設計されています。
Git。別のブランチへの切り替え
git checkout branch_name
最善の策は stash 変更とブランチの切り替えです。ブランチを切り替えるには、クリーンな状態が必要です。それらを隠して、新しいブランチをチェックアウトし、新しいブランチに変更を適用してコミットします
別の方法、マージを実行する代わりに新しいコミットを作成する場合:
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つのコミットに結合したいようです。
もしそうなら、あなたは rebase コミットをしたい、それらを単一のコミットに潰します。
私はあなたが何を望んでいるかを完全に確信していないので、スクリプトであなたを誘惑するつもりはありません。しかし、git rebase
と「スカッシュ」のオプションを読んで、いくつか試してみることをお勧めします。
なぜ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>
を実行する必要があります。
最も簡単な方法は次のとおりです。
git fetch && git checkout <branch_name>