質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

2回答

1607閲覧

gitでのチーム開発で、リモートブランチとローカルブランチで差分が出てしまった

gomes_2222

総合スコア97

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

0グッド

0クリップ

投稿2023/09/19 06:51

前提

git-flowで開発しています。
メインとなるdevelopブランチからfeature/sampleブランチを切って、開発を始めました。
プッシュ前に以下のコマンドを適用しました。

・developブランチの変更を直接feature/sampleにマージ。(確か以下のコマンドだったはず。)

git checkout feature/sample git pull origin develop

そしてリモートリポジトリにプッシュした後、以下の操作を行いました。

・コミットログを変更するコマンドを開き、vimを開き、何も保存せずq!コマンドで終了する。

git checkout feature/sample git rebase -i コミットid

発生している問題・エラーメッセージ

現在、feature/sampleブランチでgit statusすると下記のようなメッセージが出てきます。

git status On branch feature/sample Your branch and 'originfeature/sample' have diverged, and have 4 and 8 different commits each, respectively. (use "git pull" if you want to integrate the remote branch with yours)

実現したいこと

現状、自分が作成してプッシュしたブランチについて、リモートブランチとローカルブランチで差分が出てしまいました。原因と対処法を教えて欲しいです。

現在のリモートリポジトリのfeature/sampleブランチが正しい状態です。

・ローカルの差分4については、git rebase -i コマンドを三回ほど実行したために発生してるという理解でよろしいですか?
q!コマンドで保存せず終了したつもりが、コミット履歴は残るのですね。
このコミット履歴は全て不要なので、消したいです。

・リモートの差分8については、developブランチを直接マージしたのが原因でしょうか?
本来ならdevelopブランチの変更はローカルのdevelopブランチにpullし、現在の開発ブランチとmergeするのが正しいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2023/09/19 08:00

> ・コミットログを変更するコマンドを開き、vimを開き、何も保存せずq!コマンドで終了する。 > git checkout feature/sample > git rebase -i コミットid 特に何も保存していないのでコミット履歴が削除されたりもしないと思いますが、何も変化させない操作をあえて実施する意図は何でしょうか。
bsdfan

2023/09/19 10:00

git rebase -i コミットid のコミットidはどこを指していたのでしょう? git rebase はマージコミットから、マージしたという履歴を消してしまうので、この処理が原因であるような気がします。
ikedas

2023/09/19 13:03

@bsdfanさん Divergedなので、リモートとローカルで別々のコミットが延びていっているだけだと思います。rebaseなりno-ff mergeなりすればいいだけだと思うのですが、いまひとつ質問の意図がわからない。
bsdfan

2023/09/19 14:55

git rebaseで履歴を書き換えたことでdivergedになった可能性があると思ったのでコメントしています。
ikedas

2023/09/19 21:13

「何も保存せずq!コマンドで終了」ではなく、実際にはなんらかの変更をして保存したということですかね。
bsdfan

2023/09/19 23:15

@ikedasさん そうですね。どこからrebaseしたかよりも、実際はキャンセルできておらずrebaseしてしまっているのではないか、ということを先に確認した方がよかったです。
guest

回答2

0

原因?

ローカルの差分4については、git rebase -i コマンドを三回ほど実行したために発生してるという理解でよろしいですか?
q!コマンドで保存せず終了したつもりが、コミット履歴は残るのですね。

普通は保存せずに終了したのなら何の影響もないはずですが、結果的に差分が生まれているのであれば

  1. 変更破棄したつもりが操作ミス等で、古い4コミットくらいを破棄したりまとめたりするようなrebaseしていた
  2. rebaseと全然関係ないところで、把握しないままreset等していてremoteとは別の分岐にいた
  3. 他の人がorigin/feature/sampleにpushしており、自環境にはmergeせずfetchだけしており差分が見えていた

など可能性は色々挙げられます。確認してみないことには分かりません

ログ

リモートの差分8については、developブランチを直接マージしたのが原因でしょうか?

正確に把握したいのであれば、ちゃんとlogコマンドなどで確認すべきです。

guiコマンドが入っているなら gitk --all とか
コマンドラインで頑張るなら git log --graph --oneline -20 feature/sample origin/feature/sample などで
ログを見比べて、どう分岐しているか把握できます。(リモートはgithubで表示してローカルと見比べるとかでも良いです)

また、差分は git diff feature/sample..origin/feature/sample
ファイル名だけなら git diff feature/sample..origin/feature/sample --stat で把握できます。

コミット間に内容の差がなければ、diff では何の出力もありません。(明確に差分のあるコミット間でやってみれば違いが分かります)

差分があるなら、だれのコミットで変更が生まれているか等さらに確認を進めれば原因が明らかになるでしょう。

差分がないにも関わらず分岐しているのであれば、rebaseでsquashとかdropとか並び替えとかして保存した可能性はあります。
各コミットのauthor dateとcommit dateを見比べていけば、原因の推測もしやすいでしょう。
ちゃんと日付とか見比べるためのログ出力例→ git log --graph --pretty=format:"%h %an (ad=%ad) (cd=%cd) %s" --date=format-local:'%m/%d %H:%M:%S' -20 feature/sample origin/feature/sample

戻し方

特にローカルの編集が不要ならば、 reset --hardしてしまえばよいです。

投稿2023/09/19 18:03

pecmm

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

git status On branch feature/sample Your branch and 'originfeature/sample' have diverged, and have 4 and 8 different commits each, respectively. (use "git pull" if you want to integrate the remote branch with yours)

Divergeつまりコミット履歴が分岐していると言ってますね。それぞれ4つと8つの異なるコミットがあるということです。
絵を描いてみました (4つと8つは多くてごちゃごちゃするので、2つと4つにしてます)。
イメージ説明

コミットOまでは共通で、そこからoriginfeature/sampleブランチではABのコミットが、ローカルの同ブランチではCFのコミットが伸びている状態です。git log でoriginとローカルの履歴を確認してみてください (上述の通り、実際のコミットの数は4と8です)。

原因

質問者さんが実際にどんな操作をしたのか不明なので、こうなった本当の原因はわからないです。

・ローカルの差分4については、git rebase -i コマンドを三回ほど実行したために発生してるという理解でよろしいですか?
q!コマンドで保存せず終了したつもりが、コミット履歴は残るのですね。

そんなことはないです。git rebase -iコマンドを実行したが実際になにも変更しなかったのなら、コミット履歴は変更されません。というか、実行しても何も変更されないと思っているコマンドをわざわざ実行する理由がわからないです。

ともかく、考えられる原因は次のようなものです。

(ア) originからローカルへpullしたあとで、コミット履歴からABを削除し、その後CFのコミットを実施した。

(イ) originがOまでの履歴しかもっていなかった時点でローカルへpullしたあとで、CFのコミットを実施した。その後originをfetchしてみたら、新たにABの履歴が (おそらくほかの作業者によって) 追加されていた。

(ウ) その他。

対処

・リモートの差分8については、developブランチを直接マージしたのが原因でしょうか?
本来ならdevelopブランチの変更はローカルのdevelopブランチにpullし、現在の開発ブランチとmergeするのが正しいのでしょうか?

developブランチを直接マージしたい事情があるのならしてもいいと思います。問題はそこではなく、feature/sampleブランチがoriginとローカルとで分岐していることだと考えます。このままではローカルからoriginにpushできません。

(A) ローカルでのコミットも残す

ところで、gitはなにか問題が起きているとき、どういうコマンドを実行するべきかの選択肢を示してくれます。上のエラーメッセージを見ると、次のように書いてありますよね。

(use "git pull" if you want to integrate the remote branch with yours)

通常だったら、ローカルで追加したコミットCからFを残したいはずですから、「git pullを使ってリモートブランチとあなたのブランチを統合しなさい」と言ってくれているのですね。

このとおりにすると、マージコミットMが作成されてoriginがローカルにmergeされます。
イメージ説明

あるいは、git pullに--rebaseオプションをつけて実行すれば、ローカルにoriginがrebaseされ、コミットCFは新たにC'~F'として再配置されます。
イメージ説明

上記のいずれかの状態ならローカルからoriginへpushできますから、分岐状態は解消されます。

(B) ローカルでのコミットは捨てる

これは簡単です。分岐している点 (最初の図のO) よりあとのコミット (CF) をresetしてしまえばいいです。

git reset --hard コミットOのハッシュ

イメージ説明
分岐のローカル側が削除されたので分岐は解消されます。このあとgit pullを実行すれば、originとローカルの履歴が一致します。

ただ、上記のようにresetしたコミットは、当たり前ですが消えてしまいます。本当にresetしてよいのか、git logなどでよく確かめてから実施したほうがいいですね。

投稿2023/09/20 04:04

編集2023/09/21 00:23
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2023/09/20 10:20

他の回答と同じこと書いてますね。
gomes_2222

2023/10/16 05:50

丁寧な回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問