CodeIQ MAGAZINECodeIQ MAGAZINE

マンガでわかるGit 11話「強制プッシュするとどうなるの?プッシュできないときはどうすべき?」

2018.02.09 Category:【連載】マンガでわかるGit Tag: ,

  • 50
  • このエントリーをはてなブックマークに追加

強制プッシュしようとして、魔王教授に止められたわかばちゃん。
「むやみに強制プッシュするのはダメ」ということはわかったけれど、やると具体的にどんなことが起きるのでしょう?
そして、pushできない状態に陥った瞬間、本来ならわかばちゃんはどうすべきだったのでしょう?
by 湊川あい

強制プッシュするとどうなるの?プッシュできないときはどうすべき?

☆ 前回のお話はこちら:「masterブランチを守れ!~危険な強制プッシュ~


さっきの状態を再現してみたわ。


この状態では何も問題ないわね。


ここでわかばちゃんは、masterブランチの内容を修正しようとして、プッシュ済みのコミットDをコミットXに書き換えてしまった。


そうそう。さっきそれをやっちゃったんだよね。
そしたら、なぜかプッシュできなくなった。
なんで?


その理由は、図で表すとこうよ

◎ 正常にpushできる状態

EはDの子孫

* リモートリポジトリのmasterと、ローカルリポジトリのmasterがきれいな
  親子関係になっている
* = 正常にpushできる

× 普通の方法ではpushできない状態

YはDの子孫じゃない

* リモートリポジトリのmasterの最終コミットと、ローカルリポジトリの
  masterの最終コミットが親子関係になっていない
* = エラーになりpushできない
  (このまま強引にpushするとDが履歴から消滅してしまう)

強制プッシュはなぜダメか

チームで共有しているブランチで、強制プッシュ(push -f)してしまうと、自分はよくても、自分以外のメンバーがプッシュできなくなってしまいます。

2~3人のチームならすぐさま連絡すればどうにかできますが、チームの規模が大きくなればなるほど、被害が増えてしまいます。

強制プッシュが許されるのは、原則「自分しか利用していないリモートブランチだけ」です。

共有しているブランチで修正したくなったら?


もし、他の人と共有しているブランチの内容を修正したくなったらどうすればいいの?


過去のコミットを書きかえずに、新しいコミットを上に積むだけにしておいて。


そっか。そうすれば親子関係は書きかわらないし、他のメンバーはその新しいコミットだけ後からマージすればいいんだもんね。

「pushできなくなった!」そんなときはどうすべき?


「pushできないな」と気付いた瞬間に、本来やるべきことってなんなんだろう? もちろん強制プッシュじゃなくて。



次のように対処するといいわ。そのときの状況やチームの方針もあるから、メンバーにひと声かけてから実行したほうが安心ね。

自分の作業履歴をバックアップした上で、リモートからローカルへmasterを上書きする

① まず、今作業してるブランチからtmpというブランチを切ります。

$ git branch tmp

(元の作業ブランチはいじらずに温存しておきます)

②masterブランチにチェックアウトします。

$ git checkout master

③リモート追跡ブランチを最新にして

$ git fetch

④ローカルブランチのmasterを、リモート追跡ブランチのmasterに強制的に上書きします。

$ git reset --hard origin/master

ここからは

  • A: プルリクエストを作りたい場合
  • B: masterブランチにコミットを積みたい場合

で手順が異なります。

A: プルリクエストを作りたい場合

$ git checkout tmp
$ git rebase master    //または git merge master
$ git push origin tmp

最後にGitHub上でtmpブランチからプルリクを作って完了です。

B: masterブランチにコミットを積みたい場合

$ git merge tmp
$ git push origin master

プルリクはせずに、masterブランチに単にコミットを積みたい場合はこれで完了です。

まとめ

強制プッシュが危険な理由

  • 自分はよくても、自分以外のメンバーがプッシュできなくなってしまい、作業に支障が出るため

過去のコミットを書き換えてしまって、プッシュできなくなったらどうすればいい?

  • まず、自分の作業履歴を新規ブランチに一時退避し、リモートからローカルへmasterを上書きする
  • その後、リベースしてプルリクエストを出すか、マージしてプッシュする

次回予告 ~フォークしたリポジトリを本家リポジトリに追従させよう~


次回は、フォークしたリポジトリを本家リポジトリに追従させる方法について学んでいこう。



たしかに、そのやり方がわからないっていう質問、多いのよね。


あ!それ、私も知りたい!「フォークしたはいいけど、本家のリポジトリのコミットが進んじゃって、自分のリポジトリは古いまま」っていう悲しい状態になってるんだよね。

次回のマンガでわかるGitは、「本家リポジトリの追従」をやります!

マージ・リベース・プルリク。Gitの必須知識の解説は書籍版で!

マンガでわかるGitが書籍化いたしました!

わかばちゃんと学ぶ Git使い方入門
著者:湊川あい/監修:DQNEO
出版社:C&R研究所

  • CHAPTER 1 Gitって何?
  • CHAPTER 2 個人でGitを使ってみよう
  • CHAPTER 3 複数人でGitを使ってみよう
  • CHAPTER 4 実用Git 〜 こんなときはどうすればいい?
  • CHAPTER 5 Gitで広がる世界

CHAPTER 1・2は、Web連載の1〜9話をベースに、さらに詳しい解説・新しい図解を追加しました。

CHAPTER 3・4・5は書籍限定の内容となっています。

  • ステージングエリアやブランチの概念
  • マージ
  • リベース
  • コンフリクト解決
  • プルリク

といった基本の使い方はもちろん、CHAPTER4では、「Gitを使っていて、よくぶつかる状況」と「解決策」をまとめた逆引きTips集を収録しています。

Amazon試し読みはこちらから

ほかにもある!わかばちゃんシリーズ

わかばちゃんと学ぶ Webサイト制作の基本

わかばちゃんが登場するWeb連載マンガ

登場人物紹介

Gitに関するクイズ出題中!

Gitコマンドの選択式クイズが出題中です。正解すると、このマンガのおまけの1コマが見られます。ぜひチャレンジしてみてくださいね。

マンガ・解説文:湊川あい
絵を描くWebデザイナー。高等学校教諭免許状 “情報科” 取得済。マンガと図解の力で、物事をわかりやすく伝えることが好き。2014年より「マンガでわかるWebデザイン」をインターネット上に公開していたところ、出版社より声がかかる。初の著書「わかばちゃんと学ぶ Webサイト制作の基本」が発売中

Twitter: @llminatoll
Webサイト: マンガでわかるWebデザイン

監修:DQNEO
株式会社メルカリではたらくソフトウェアエンジニア。
アメリカ版メルカリのサーバサイドを開発している。
GitとPHPが大好き。Goも好き。

Twitter: @DQNEO
Github: @DQNEO

※この記事は2018年1月1日時点における実施内容です。時期・環境・バージョンによって、操作が異なることがあります。

【PR】最高提示年収1000万超!先端企業があなたを求めています「moffers」

登録した詳細な経験・スキル情報に基づき、企業が「年収」を明示した形でスカウトを行う、ITエンジニアのための転職サービス「moffers」の第2回が開催中です。

第1回開催時の平均オファー年収額は600万円。最高提示額1000万を超えました。あなたの本当の評価がわかる「moffers」に登録してみませんか?

【moffers参加企業】
アイシン精機、オリンパス、セイコーエプソ、ソニー、日産自動車、富士フイルム、三菱電機、サイバーエージェント、リクルートテクノロジーズ、ほか

WebからIoT、自動運転、AIまで幅広い業種・職種がラインナップしています。この機会にぜひご登録ください!

  • 50
  • このエントリーをはてなブックマークに追加

■関連記事

マンガでわかるGit 10話「masterブランチを守れ!〜危険な強制プッシュ〜」... masterブランチを守れ! 〜危険な強制プッシュ〜 そ、それはだな……ごにょごにょ わかばちゃん、私がリモートリポジトリのmasterブランチをプロテクトしておいたわ。これで、たとえ強制プッシュしてしまってもエラーで失敗するだけよ。 思う存分Gitしてね。 あ、ありがとうござい...
マンガでわかるGit 9話「pullの正体はfetch+mergeだった?」... pullの正体はfetch+mergeだった? ※前回のお話:マンガでわかるGit 第8話「GitHubを使ってみよう push・pull編」 今までは、わかばちゃんは単純にこういうイメージでpush・pullをしていましたが… ↓ 実はこういう構造! リモートブランチ リモー...
マンガでわかるGit 第8話「GitHubを使ってみよう push・pull編」... GitHubを使ってみよう push・pull編 この記事は マンガでわかるGit 第7話「GitHubを使ってみよう」の続きです。 前回の状態 マンガでわかるGit 第7話「GitHubを使ってみよう」 の演習を終えたら、このような状態になっていると思います。 SourceTree...
マンガでわかるGit 第7話「GitHubを使ってみよう」... GitHubを使ってみよう そもそもソーシャルコーディングとは ソーシャルコーディングっていうのは、「ソースコードをクラウド上で共有して、他のユーザーとコラボレーションしながら開発をしていく」ということよ。 複数人で開発できる仕組みについては マンガでわかるGit 6話 「集中型...
マンガでわかるGit 第6話「集中型と分散型、何がどう違うの?」... 集中型と分散型って、何がどう違うの? バージョン管理システムは大きく分けて2種類 集中型バージョン管理システム CVS・Subversionなど 分散型バージョン管理システム Git・Mercurialなど 集中型は「ひとつのリポジトリに接続してみんなで使う」タイプ。 分散...
マンガでわかるGit 第5話「過去の状態に戻してみよう」... 過去の状態に戻してみよう このお話は「マンガでわかるGit 4話 コミットしてみよう」の続きです。 ファイルを特定の時点に戻す方法はいろいろあるけど 、今回はチェックアウトを使ってみましょう。 チェックアウト? チェックアウトをすると、作業ディレク...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ