基本的な動作は同じです。
コミット履歴を指定した《ID》まで戻しますが、編集した内容は変わりません。
モードの違いは以下です
[soft]・・・変更内容がステージングに残ります
[mixed] ・・変更内容がステージングから消えます(オプション省略可)
つまり[soft]の場合だと、コミットする際に
『git add .』が不要になるだけです。
リモート① リモート② ローカル
| | |
1234567 | |
|
1234567 |
| |
1234567
| | |
| | 2345678 コミット①
| | |
| |
3456789 コミット②
|
3456789 |
| | 4567890 コミット③
例えば上記の様な履歴を持つブランチがあります。
[リモート①]・・・[develop] ⇒ 準本番ブランチ
[リモート②]・・・[dev_PJ1] ⇒ 準本番ブランチから派生させた開発ブランチ
[ローカル]・・・・[dev_PJ1] ⇒ 開発ブランチローカル用
ローカルでは『コミット』を3回実施しています。
また2回目のコミットは、リモートへプッシュされています(ID:3456789)
開発者は『管理者はどうせ[develop]にスカッシュマージなんかしないよなぁ』と思い、
ローカルのコミット履歴を整理したいと考えました。
さてローカルの『dev_PJ1』はどこまで【reset】できるでしょうか?
答えは《コミット②》までです。
何故かというと《ID:2345678》まで履歴を戻すと、リモート側のブランチと整合性が合わなくなるためです。
よって以下コマンドで履歴を整理します。
reset --soft
git reset --soft 3456789
git commit -m "履歴を整理"
git push origin dev_PJ1
リモート① リモート② ローカル
| | |
1234567 | |
|
1234567 |
| |
1234567
| | |
| | 2345678 コミット①
| | |
| |
3456789 コミット②
|
3456789 |
| |
5678901 コミット④(履歴を整理)
|
5678901 |
これで整合性を崩さずにリモート側の[dev_PJ1]と同期がとれました。
しかしよく見るとコミット数は同じです。。
リモートとローカルのブランチ『dev_PJ1』は開発者が自由にできるものです。
整合性を崩してはいけないのは、準本番ブランチである『develop』です。
[develop]の履歴は《ID:1234567》なので、このIDまでなら誰にも迷惑はかけないハズです。
そこで開発者は以下コマンドを叩いてしまいます。
大丈夫?
git reset --soft 1234567
git commit -m "履歴を完全に整理"
これで自身のコミット履歴は完全に綺麗になりました。
リモート① リモート② ローカル
| | |
1234567 | |
|
1234567 |
| |
1234567
| | |
|
3456789 |
| | |
|
5678901 |
| | 6789012
コミット⑤(履歴を完全に整理)
しかし開発者は以下のコマンドを叩いて絶望します。
エラーだよね。。
git push origin dev_PJ1
当然IDが合わないのでエラーとなります。。orz
しかし、ブランチ『dev_PJ1』に関してはリモート共に自分のみ管理するものです。
開発者はここで【強制プッシュ】を実行します。
強制プッシュ!!
git push -f origin dev_PJ1
無事プッシュでき、各ブランチのIDの整合性も保たれています。
リモート① リモート② ローカル
| | |
1234567 | |
|
1234567 |
| |
1234567
| | |
| | 6789012
コミット⑤(履歴を完全に整理)
| 6789012 |
無事《リモート:dev_PJ1》《ローカル:dev_PJ1》の整合性が整いました。