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

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

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

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

Q&A

解決済

3回答

1631閲覧

【Git】ローカルのmainブランチのコミットログがpullする度に汚れてしまう対応について

rarara0806

総合スコア1

Git

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

3グッド

2クリップ

投稿2023/04/03 18:01

編集2023/04/04 01:33

ゴール

意図としてはコミットログが綺麗なPRを作成したいです。

解決したい課題・現状

誤ってローカルのmainブランチで2つコミットを作成してしまい、その後いくつかのPRを作成して開発してしまいました。
その影響なのか、mainブランチから開発ブランチを新規作成するたびに、誤ってコミットしたログとgit pullしたログも、開発用ブランチに入ってしまうようになってしましました。
(以前は、mainブランチでgit pullしても、開発用ブランチにはmainブランチのログは引き継がれていなかった気がします。。)

下記はmainブランチから開発用ブランチを切って、PRを作った際のコミット履歴になります。
本来だと開発してできたコミットのみPRに含めたいです。。

shell

1誤ってコミットしたコミット1 2誤ってコミットしたコミット2 3git pull したコミット1 4git pull したコミット2 5git pull したコミット3 6git pull したコミット4 7git pull したコミット5 8git pull したコミット6 9git pull したコミット7 10開発してできたコミット1 11開発してできたコミット2

上記の状況は何が原因で、どのように解決したらよいでしょうか?
お手数お掛けしますが、ご教授いただけますと幸いです。

  • 具体性が欠けていたので、4/4 (火) 10:30 に修正しました。
shinoharat, logres_Fan👍を押しています
int32_tを押しています

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

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

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

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

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

y_waiwai

2023/04/03 21:20

具体的になにがどうなるんでしょうか。 はなしがさっぱりわかりません
int32_t

2023/04/03 21:43

状況がまったくわからないので、pull 前に main にどういうコミットがあって、pull 後に main がどういうコミットを持っていて、どのコミットが不要なのか、具体的に書いてください。
rarara0806

2023/04/04 01:37

コメントありがとうございます! 申し訳ありません、概要が具体性に欠けていたため、本文を修正いたしました。
guest

回答3

0

ベストアンサー

本文の編集ありがとうございます。

手っ取り早いのは、今のローカルの main ブランチを捨てて、新しくリモートからキレイな main を持ってくることだと思います。

// ローカルの main ブランチをリネーム git branch -m main old_main // リモートから改めて main を取得 git fetch origin main:main

投稿2023/04/04 01:48

shinoharat

総合スコア1676

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

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

winterboum

2023/04/04 02:54

リモートのmainが「汚れている」のでは? pullしたmainが「汚れてる」のですから
rarara0806

2023/04/04 03:16

ありがとうございます!解決しました!! ベストアンサーとさせていただきます!!
guest

0

まずありがちな例の対処法から
単純に貴方がmainブランチから派生させた機能ブランチで作業している間に
へんてこなコミットを作成してしまったというなら

git commit --amendgit rebaseをうまく使いながら潰してください。
git resetでローカルのファイルを維持したままmainブランチのタイミングまで戻っても良いでしょう。

また、自分が開発しているのに
mainブランチがどんどん積み上がって結果を受け取らなきゃいけない!
こういう時はローカルでmergeをしないで、rebaseを使って下に滑り込ませた方が良いです。

bash

1$ git branch 2* main 3 4$ git checkout -b feature/a 5$ git add [file-name] 6$ git commit -m "Aコミット" 7 8# 「mainが更新されたから受け取ってねー」 9# 一度コミットして退避 10$ git add [file-name] 11$ git commit -m "tmp" 12 13$ git checkout main 14$ git pull origin main 15$ git fetch 16 17$ git checkout feature/a 18$ git rebase master 19 20$ git log 21# "Aコミット"のIDをコピペ 22$ git reset [AコミットのID]

こんな感じで最新のmainを下に滑り込ませて、貴方のコミット常に最後に乗せる運用にすると良いです。


後は1PR1コミットを維持する場合のテクニックですが、
git commit --amendを使いましょう。
これはgit logで出てくる一番最後のコミットに対して混ぜ込むコマンドとして機能します。

bash

1$ git branch 2* main 3 4$ git checkout -b feature/a 5 6$ git add [適当なファイル] 7$ git commit -m "tmp" 8 9# 一旦保存しておきたい 10$ git add [ファイルパス] 11$ git commit --amend 12 13# できた! 14$ git add [ファイルパス] 15$ git commit --amend -m "ちゃんとしたコミットメッセージ" 16$ git push origin feature/a

以下は質問文の思想的な所への回答です

誤ってローカルのmainブランチで2つコミットを作成してしまい、
その後いくつかのPRを作成して開発してしまいました。

PRは1コミットではならないと誰が決めたのですか?
確かにIssue(仕事)を1コミットで終わるくらい美しい分割が出来ている事は一つの理想です。

しかしAという前提があってこそのBが出来て、AとBの合体で1Issueが解決できる場合、
コミットは2個であるほうが自然では無いでしょうか?

だからPRは複数のコミットを許容するものですし、
一度PRを出してレビューを受けた後に作り直す場合、
コミットを潰すより複数残ったままの方がレビュワーの負担面でも楽です。

ですので、どこまでいっても所詮プロジェクト内のローカルルールです。
teratailでそれを聞くなら前提としてローカルルールがこうなっているという話をすべきあって、さも当然のように聞き始めるのはおかしいです。
まず先輩・上長にブランチの運用方法を相談してください。

その影響なのか、mainブランチから開発ブランチを新規作成するたびに、
誤ってコミットしたログとgit pullしたログも、開発用ブランチに入ってしまうようになってしましました。

誰も気にしてなくね?
もし私がそんなに潔癖なブランチ運用するプロジェクトメンバーであり
質問者さんの先輩の立場だったら

なんでこんなゴミが紛れ込んでるんだ?
一回みんな作業止めてー!
rebaseで潰して履歴を綺麗にするから。

こんな風に周知してgit rebase機能を使ってコミット履歴を一度壊して作り直すでしょう。

やってないですよね?
質問者さんが潔癖過ぎるだけです。それでも気になるなら先輩に相談してみてください。

下記はmainブランチから開発用ブランチを切って、PRを作った際のコミット履歴になります。
本来だと開発してできたコミットのみPRに含めたいです。。

何にせよmainブランチに紛れ込んでしまった後はもう変更はしないほうが良いです。
そこまで潔癖な運用してるなら、なんでそんなコミットを取り込んだんだ?バカじゃね?
レビュワー「が」責任を負うべきです。

つか、貴方達の仕事はコミット履歴を美しくすることではなく、
mainブランチをIssueが全て片付いている最新・最強・完全な状態に仕上げることなんじゃないんですか?って話
コミット履歴を過剰に綺麗にするより、キリの良いところでgit tag機能でタグでも打ちながら運用した方が良いと思います。

その中でゴミコミットは極力減らしたいから
都度git rebaseを上手く使いながら違和感が出ないようにしたいよねという努力目標です。

投稿2023/04/04 03:57

編集2023/04/04 04:10
miyabi-sun

総合スコア21158

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

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

rarara0806

2023/04/05 04:41

1PR1コミットのルールは想定していないですし、書いてもいませんよ。。
guest

0

main ブランチというのはその名前からして 本番 に使うもの、でしょう。
でしたらそこに不要なコミットが入るはずがありません。本番のbug fix や機能修正のためにコミットされたものです。
もし不要なコミット入るとしたらそこをまず治す必要があります。

main に不要なコミットが入らないのなら、pullするたびに追加されるコミットは 汚れ ではないです。
開発用ブランチを新規作成したときに入り込むそれらのコミットは、 そのコミットがある前提で開発を行うべきものです。

追記
修正された質問でも状況がさっぱりわかりません。
どこで行ったのか 開発環境かリポジトリか
何に行ったのか main か 開発ブランチか
コミット1、2が3つあるがそれは同じコミットなのか(それどうやって同じのをコミットした?)
pullしかないがPUSHはしていないのか

開発環境の main に pull しても、そこにpullされたコミットは
すでに作成された 開発ブランチには反映しません。
しかし、新たにつくる開発ブランチには入ってます。どのブランチを元に作るのか、というオプションがない場合は「カレントのブランチを元にブランチを作る」のですから。

投稿2023/04/03 22:53

編集2023/04/04 02:53
winterboum

総合スコア23347

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

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

rarara0806

2023/04/04 01:37

コメントありがとうございます! 申し訳ありません、概要が具体性に欠けていたため、修正いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問