20200909のGitに関する記事は6件です。

git pull実行時にNot possible to fast-forwardエラーが発生した場合の対応

Contents

git pullを実行したときにNot possible to fast-forward, aborting.と表示され、ローカルをリモートリポジトリと同期できなくなった場合の対応方法です。

原因

リモートリポジトリの更新後、git pull(= git fetch; git merge)の前にローカルリポジトリを編集してcommitした場合などに発生するようです。

  • Continuous integration (CI) toolを使った自動コミットが含まれる場合は要注意!
  • pull requestをmergeした直後は要注意!

解決方法

落ち着いて、次の通りgit fetchgit rebaseを実行すれば副作用を抑えて解決できます1

master branchの場合:

git pull origin master --rebase

Output:

From (remote repositoryのURL)
 * branch            master     -> FETCH_HEAD
Successfully rebased and updated refs/heads/master.

コマンドのイメージ

リモートの変更内容をdiff-A, ローカルの変更内容をdiff-Bとしたとき23

ローカル側:
1. diff-Bをローカルから取り除く
2. diff-Aをローカルに反映させる
3. diff-Bをローカルに反映させる

リモート側:
1. diff-Bをリモートに反映させる

ローカル側もリモート側もdiff-A, diff-Bの順にcommitが設定されます。

あとがき

「一時退避」などでがんばる方法もあると思いますが、履歴が複雑になります(経験談)。履歴を振り返りにくくなるのでrebaseすることをおすすめします。

またリモートとローカルで同じ場所を編集した場合はconflictが発生しますので、そちらも落ち着いて解決しましょう。

お疲れさまでした!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルで git を管理する方法

概要

ターミナルを利用して、git で作業ディレクトリ(ローカルディレクトリ/リモートディレクトリ)を管理する方法についてまとめる。

成果物

作業管理しているローカルディレクトリを github に公開する

ローカルディレクトリの管理

git init //フォルダをバージョン管理の対象にする

ターミナル
git init

実行後、フォルダに「.git」という隠しファイルが生成される。
cf. git 管理をやめる

git add //記録対象の指定

ターミナル
//バージョン管理するアイテムが一つの場合
git add sample.txt

//バージョン管理するアイテムが複数の場合
git add . 

これは、以降で説明する git commit を実行するまえに毎回行う必要がある。

git commit // 変更点の記録

ターミナル
git commit -m “first commit”

必ず -m "更新内容" とセットで記載する。
入れ忘れると、Vim が立ち上がるので INSERTモード(iをタイプする)でコミットメッセージを入力する。ここでは、「write commit message」と入力する。
スクリーンショット 2020-09-09 23.13.24.png
INSERT モードは [esc] キーで終了し、「:wq」で閉じる。

リモートディレクトリ(github) の管理

github でリポジトリを作成

[Your profile] → [Repositories] → [New] をクリック
スクリーンショット 2020-09-10 17.05.16.png

[Create a new repository] ページが表示されるので、[Repository name] を入力する。ここでは、ローカルディレクトリとあわせて「hellogit」とする。
スクリーンショット 2020-09-10 17.07.47.png

設定が完了したら、[Create Repository] をクリックする
スクリーンショット 2020-09-10 17.29.57.png

画面に表示された [HTTPS] か [SSH] をコピーする
※https 通信の場合 git remote add するたびに PW を聞かれる

ローカルディレクトリを github のリモートディレクトリに紐づける

ターミナル
git remote add origin https://github.com/ub0t0/myfirstgithub.git

commit 済みのディレクトリを github に更新

git addgit commit した後に以下のコマンドを実行

ターミナル
git push -u origin master

html の公開

github pages を利用すると、 .html を静的ファイルとして公開することができる
スクリーンショット 2020-09-10 17.48.56.png

[setting] → [GitHub Pages] → [Branch:master] → [Save] で index.html が公開され、リンクが表示される。

https://github.com/ub0t0/hellogit
index.html が読み込まれるが、index.html 以外を開きたい場合は、/ファイル名で開くことが可能
https://github.com/ub0t0/hellogit/a.html

github でファイルの中身を変更した場合

github 上で Read me ファイルの作成やファイルの中身を変更した場合は pull コマンドを利用して、ローカルリポジトリも更新する

ターミナル
git pull

覚えておきたい確認用コマンド

git status //ステータスの表示

commit する前に、git status を実行した場合

ターミナル
git status

// 返されたメッセージ
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

前回 commit した時から変更点がない場合

ターミナル
git status

// 返されたメッセージ
nothing to commit, working tree clean 

前回 commit した時から変更点がある場合
(例)「a.text」というファイルを新規で作成した場合のメッセージ

ターミナル
git status

// 返されたメッセージ
On branch master
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:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")

git log // ログの表示

いつだれが更新したかを確認することができる。

ターミナル
git log

// 返されるメッセージ
commit 一意のID
Author: 
Date:   
     commit したときの文字列

参考

【初心者】Gitコマンドの使い方を体系的に覚える【一覧あり】
【読むだけ】 Gitとは?仕組みを初心者にもわかりやすく解説【図解】
サル先生のGit入門
マンガでわかるGit

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルで git/github を管理する方法

概要

ターミナルを利用して、git で作業ディレクトリ(ローカルディレクトリ/リモートディレクトリ)を管理する方法についてまとめる。

ゴール

作業管理しているローカルディレクトリをリモートリポジトリ(github) に紐づける

ローカルディレクトリの管理

git init //フォルダをバージョン管理の対象にする

ターミナル
git init

実行後、フォルダに「.git」という隠しファイルが生成される。
cf. git 管理をやめる

git add //記録対象の指定

ターミナル
//バージョン管理するアイテムが一つの場合
git add sample.txt

//バージョン管理するアイテムが複数の場合
git add . 

これは、以降で説明する git commit を実行するまえに毎回行う必要がある。

git commit // 変更点の記録

ターミナル
git commit -m “first commit”

必ず -m "更新内容" とセットで記載する。
入れ忘れると、Vim が立ち上がるので INSERTモード(iをタイプする)でコミットメッセージを入力する。ここでは、「write commit message」と入力する。
スクリーンショット 2020-09-09 23.13.24.png
INSERT モードは [esc] キーで終了し、「:wq」で閉じる。

リモートディレクトリ(github) の管理

github でリポジトリを作成

[Your profile] → [Repositories] → [New] をクリック
スクリーンショット 2020-09-10 17.05.16.png

[Create a new repository] ページが表示されるので、[Repository name] を入力する。ここでは、ローカルディレクトリとあわせて「hellogit」とする。
スクリーンショット 2020-09-10 17.07.47.png

設定が完了したら、[Create Repository] をクリックする
スクリーンショット 2020-09-10 17.29.57.png

画面に表示された [HTTPS] か [SSH] をコピーする
※https 通信の場合 git remote add するたびに PW を聞かれる

ローカルディレクトリを github のリモートディレクトリに紐づける

ターミナル
git remote add origin https://github.com/ub0t0/myfirstgithub.git

commit 済みのディレクトリを github に更新

git addgit commit した後に以下のコマンドを実行

ターミナル
git push -u origin master

html の公開

github pages を利用すると、 .html を静的ファイルとして公開することができる
スクリーンショット 2020-09-10 17.48.56.png

[setting] → [GitHub Pages] → [Branch:master] → [Save] で index.html が公開され、リンクが表示される。

https://github.com/ub0t0/hellogit
index.html が読み込まれるが、index.html 以外を開きたい場合は、/ファイル名で開くことが可能
https://github.com/ub0t0/hellogit/a.html

github でファイルの中身を変更した場合

github 上で Read me ファイルの作成やファイルの中身を変更した場合は pull コマンドを利用して、ローカルリポジトリも更新する

ターミナル
git pull

覚えておきたい確認用コマンド

git status //ステータスの表示

commit する前に、git status を実行した場合

ターミナル
git status

// 返されたメッセージ
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

前回 commit した時から変更点がない場合

ターミナル
git status

// 返されたメッセージ
nothing to commit, working tree clean 

前回 commit した時から変更点がある場合
(例)「a.text」というファイルを新規で作成した場合のメッセージ

ターミナル
git status

// 返されたメッセージ
On branch master
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:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")

git log // ログの表示

いつだれが更新したかを確認することができる。

ターミナル
git log

// 返されるメッセージ
commit 一意のID
Author: 
Date:   
     commit したときの文字列

参考

【初心者】Gitコマンドの使い方を体系的に覚える【一覧あり】
【読むだけ】 Gitとは?仕組みを初心者にもわかりやすく解説【図解】
サル先生のGit入門
マンガでわかるGit

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルで git を管理する時のコマンド

概要

ターミナルを利用して、git で作業ディレクトリを管理する方法についてまとめる。

基本コマンド

git init //フォルダをバージョン管理の対象にする

ターミナル
git init

実行後、フォルダに「.git」という隠しファイルが生成される。
cf. git 管理をやめる

git status //ステータスの表示

commit する前に、git status を実行した場合

ターミナル
git status

// 返されたメッセージ
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

前回 commit した時から変更点がない場合

ターミナル
git status

// 返されたメッセージ
nothing to commit, working tree clean 

前回 commit した時から変更点がある場合
(例)「a.text」というファイルを新規で作成した場合のメッセージ

ターミナル
git status

// 返されたメッセージ
On branch master
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:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")

git add //記録対象の指定

ターミナル
//バージョン管理するアイテムが一つの場合
git add sample.txt

//バージョン管理するアイテムが複数の場合
git add . 

これは、以降で説明する git commit を実行するまえに毎回行う必要がある。

git commit // 変更点の記録

ターミナル
git commit -m “first commit”

必ず -m "更新内容" とセットで記載する。
入れ忘れると、Vim が立ち上がるので INSERTモード(iをタイプする)でコミットメッセージを入力する。ここでは、「write commit message」と入力する。
スクリーンショット 2020-09-09 23.13.24.png
INSERT モードは [esc] キーで終了し、「:wq」で閉じる。

git log // ログの表示

いつだれが更新したかを確認することができる。

ターミナル
git log

// 返されるメッセージ
commit 一意のID
Author: 
Date:   
     commit したときの文字列

参考

【初心者】Gitコマンドの使い方を体系的に覚える【一覧あり】
【読むだけ】 Gitとは?仕組みを初心者にもわかりやすく解説【図解】
サル先生のGit入門
マンガでわかるGit

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rebase時のコンフリクトでリベース先の変更だけ適用する方法

Rebase対応にて、コンフリクトした場合、リベース先の変更を全て取り入れる場合

いろいろあって、リベース先の変更を全て入れないといけなかったのでメモ

TL;DR

git checkout --ours <ファイルパス>
git add <ファイルパス>
# コンフリクト全て対象で良いなら、<ファイルパス>部分を . 指定でOK

検証してみる

まずmasterブランチで何もないファイルを作成してcommit

devブランチを切る

$ git checkout -b dev

devブランチでsample.txtを以下の内容で保存

sample.txt
aaa

masterブランチに移動してsample.txtを以下の内容で保存

sample.txt
bbb

これでコンフリクトする。

devブランチに移動してrebase

$ git rebase master

バッチリコンフリクトした

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: change sample.txt on dev
Using index info to reconstruct a base tree...
M       sample.txt
Falling back to patching base and 3-way merge...
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
error: Failed to merge in the changes.
Patch failed at 0001 change sample.txt on dev
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

リベース先の変更を入れる

今回の場合はmasterブランチの内容を入れる

$ git checkout --ours sample.txt
$ git add sample.txt

これでOK!

ちなみに...

rebase元(今回で言うとdevブランチ)の内容を反映する場合は、

$ git checkout --theirs sample.txt
$ git add sample.txt

で良い。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitをアップデートする for Windows

コマンドラインからGitをアップデートする。
2.13以前は非対応。

$ git update-git-for-windows
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む