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

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

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

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

GitHub

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

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

Q&A

1回答

4696閲覧

gitのリベースで歴史を一本化できない

keys

総合スコア215

Git

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

GitHub

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

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

0グッド

1クリップ

投稿2017/06/08 04:50

編集2017/06/08 04:54

上記の画像は、developブランチにいる状態でmasterブランチをリベースした直後の画像です。

リベースというのは、歴史を一本化してくれるコマンドらしく、developブランチとmasterブランチを統合しようとしています。

mergeコマンドとの違いは、mergeの場合は、基準とするブランチにチェックアウト(masterの後に続いてdevelopを適応させたければmasterブランチに移動して marge developのようにする)しますが

リベースの場合は、もしmasterの後にdevelopの歴史を一本化したければ、まずはdevelopに移動して、git rebase developのようにしますよね。そこでコンフリクトが発生するので、コンフリクトを治す。

そしたら、git rebase --continueする。ここから少しわからないんですが、この後僕はどうすれば良いんでしょうか。下記の参照urlによればコンテニューした後は、masterにチェックアウトして git marge developのようにしれ見れば、歴史が一本に繋がると書いてあります。

しかし、git rebase --continueした後にmasterにチェックアウトしようとすると、下記のようにエラーが発生してしまいます。

git

1new.txt: needs merge 2error: you need to resolve your current index first

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

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

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

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

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

guest

回答1

0

ちょっと言葉の定義が怪しいようですので,整理しましょう.

チェックアウト: 指定したコミットへ HEAD を移動すること.そこにブランチがあり,チェックアウトでブランチを指定していると ブランチをチェックアウトした 状態になる.実際のファイル群は(ステージされていない変更等一部を除いて)チェックアウトしたコミットの状態になる

mergeの場合は、基準とするブランチにチェックアウトしますが

mergeの場合は,基準とするブランチ(チェックアウトしているブランチの意?)に対象のブランチを取り込む(マージする)が正しい表現です.

下の図は,ブランチB をチェックアウトしている状態でブランチAをマージ git merge A した時の図です.

イメージ説明

リベースの場合は、もしmasterの後にdevelopの歴史を一本化したければ、まずはdevelopに移動して、git rebase developのようにしますよね。

リベースも,どちらのブランチを基準にするかで結果が変わっていきますが, まずはdevelopに移動して、git rebase develop のように同じブランチをrebaseすることはありません.
masterに移動して git rebase develop か developに移動して git rebase master です.

そして本題ですが,

そしたら、git rebase --continueする。ここから少しわからないんですが、この後僕はどうすれば良いんでしょうか。

SourceTreeのコミットグラフを見るに,コンフリクトを解消した後にコミットされていないようにみえます.

  1. git rebase master を実行する
  2. コンフリクトが起きたら修正
  3. コンフリクトの修正をコミット
  4. git rebase --continue
  5. 3-4はコンフリクトが全て解消するまで繰り返す

の手順で(特に3が)抜けているものはないでしょうか?
なお,rebaseがうまく行かずにキャンセルする場合は git rebase --abort する必要があります.

投稿2017/06/08 05:24

tetsukay

総合スコア232

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

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

keys

2017/06/08 05:40

回答ありがとうございます。ご指摘の通り「コンフリクトの修正をコミット」が抜けておりました。リベースはコミットではなくコンテニューと覚えていたのでコミットするんだということが抜けていました。しかし、コミットできたは良いんですが、その後下記のようにaddしてリベースコンテニューしてもうまくいきませぬ git add new.txt locus-inc-no-MacBook-Pro:ブランチチベース ryosukehujisawa$ git rebase --continueApplying: develop No changes - did you forget to use 'git add'? If there is nothing left to stage, chances are that something else already introduced the same changes; you might want to skip this patch. When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
tetsukay

2017/06/08 05:47

> did you forget to use 'git add'? とあるとおり, add できていないようです. `git status` で ファイルの状態を確認してみてください. 変更されたファイルがあれば modified: と表示されるはずです. また,addされていなければ modified: new.txt は赤で,addに成功していれば緑で表示されます. ```bash user@localhost:~/workspace/git$ git status On branch develop Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: new.txt no changes added to commit (use "git add" and/or "git commit -a") ```
keys

2017/06/08 05:48

下記の手順が正しいかアドバイスください ①developが、developとmasterを比べた時の最新のcommit、developにいる状態で下記のコマンド実行 $ git rebase master ②下記のコンフリクトの修正 First, rewinding head to replay your work on top of it... Applying: develop Using index info to reconstruct a base tree... M new.txt Falling back to patching base and 3-way merge... Auto-merging new.txt CONFLICT (content): Merge conflict in new.txt error: Failed to merge in the changes. Patch failed at 0001 develop The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort". vi new.txt git add new.txt git commit -m "コンフリクト修正" [detached HEAD f265f37] コンフリクト修正 1 file changed, 1 insertion(+), 1 deletion(-) ④この状態で、すでに二つのブランチは統合されたのでdevelopブランチを削除
tetsukay

2017/06/08 05:56 編集

コンフリクト解消のコミットの後,developブランチを削除する前に `git rebase --continue` が抜けていませんか?
keys

2017/06/08 07:10

git add new.txt をした後に git rebase --continue したら Applying: 分岐するぜめ〜んdevelop と出て そしたら歴史が一本道になりました。 まだ仕組みが理解できていません さっきはできなかったような...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問