git pushでエラーが起きた1例。

2023/10/24に公開

はじめに

  • ターミナルでpushを行おうとしたところ、うまく行えずそのときに解決した方法をまとめていきます。

対象者

  • プログラミングを学習中の方

目次

タイトル 備考
1 pushしてみる。 失敗
3 またpushをやってみた。 失敗
4 リモートリポジトリから情報を取得する。 成功
5 マージする(1回目)。 失敗
6 statusで確認。 成功
7 pullをする。 失敗
8 マージする(2回目)。 成功
9 statusを確認。 成功
10 addをする。 成功
11 commitする。 成功
12 pushする。 成功
13 これでおしまい。 おしまい
14 参考文献

pushしてみる。

# git push -u origin ブランチ名

To https://github.com/アカウント名/xxx.git
 ! [rejected]        ブランチ名 -> ブランチ名 (fetch first)
error: failed to push some refs to 'https://github.com/アカウント名/xxx.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

ChatGPTに相談。

  • ! [rejected] ブランチ名 -> ブランチ名 (fetch first)
    : リモートリポジトリに存在する<ブランチ名>ブランチに対してローカルの<ブランチ名>ブランチをプッシュしようとしましたが、リモートリポジトリに変更があるため、拒否されたとのこと。
  • Updates were rejected because the remote contains work that you do not have locally.
    : リモートリポジトリには、あなたのローカルリポジトリに存在しない変更が含まれているため、プッシュが拒否された。
  • This is usually caused by another repository pushing to the same ref.
    : 通常、他のリポジトリが同じブランチに変更をプッシュしているために、この問題が発生します。
  • You may want to first integrate the remote changes (e.g., 'git pull ...') before pushing again.
    : プッシュを試みる前に、リモートリポジトリの変更を取り込むために git pull などのコマンドを使用して統合することを検討することが提案されています。

またpushをやってみた。

# git push

To https://github.com/アカウント名/xxx.git
 ! [rejected]        ブランチ名 -> ブランチ名 (fetch first)
error: failed to push some refs to 'https://github.com/アカウント名/xxx.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

ChatGPTに相談。

  • error: failed to push some refs to 'https://github.com/アカウント名/xxx.git'
    : プッシュ操作が失敗したことを示します。指定されたリモートリポジトリ(この場合、GitHubのリモートリポジトリ)に対して変更を送信しようとしましたが、何らかの問題が発生しました。

  • hint: Updates were rejected because the remote contains work that you do not have locally.
    : プッシュが拒否された理由は、リモートリポジトリには、ローカルに存在しない変更(新しいコミットやブランチの進行)が含まれているためです。つまり、他のユーザーまたは別のリポジトリで変更が行われ、それがリモートリポジトリにプッシュされました。

  • You may want to first integrate the remote changes (e.g., 'git pull ...') before pushing again.
    : プッシュ操作を再試行する前に、リモートリポジトリの変更をローカルに統合することを検討することを示唆しています。これを行う一般的な方法は、git pull コマンドを使用してリモート変更をローカルに取り込むことです。

  • See the 'Note about fast-forwards' in 'git push --help' for details.
    : より詳細な情報やヘルプについては、git push コマンドのヘルプメッセージやドキュメンテーションの「Note about fast-forwards」を参照することができます。これにより、git push のオプションや振る舞いに関する詳細な情報が提供されます。

リモートリポジトリから情報を取得する。

# git fetch origin

remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 700 bytes | 175.00 KiB/s, done.
From https://github.com/アカウント名/xxx
   dada9f8..8f08548  ブランチ名     -> origin/ブランチ名
  • 情報の取得ができました。

マージする(1回目)。

# git merge origin ブランチ名

merge: origin - not something we can merge
  • マージ失敗。
  • git merge コマンドが origin という名前のブランチをマージしようとしたが、origin は直接マージできるものではないことを示しています。

git statusで確認。

 # git status
 
On branch ブランチ名
Your branch and 'origin/ブランチ名' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean
  • ローカルのブランチをリモートのブランチに統合するために、git pull コマンドを使用できることを示しています。このコマンドは、ローカルの変更とリモートの変更をマージまたはリベースする方法を指定します。

git pullをする。

# git pull

hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.

ChatGPT

  • このgit pullコマンドの出力は、ローカルとリモートのブランチが異なる変更を持っており、どの方法でそれらを統合するかを明示的に指定する必要があるということです。

  • git config pull.rebase false
    :変更をマージして統合する方法を指定します。この場合、mergeが使用されます。

  • git config pull.rebase true
    :変更をリベースして統合する方法を指定します。この場合、rebaseが使用されます。

  • git config pull.ff only
    :ファストフォワード(早送り)でのみ統合を許可する方法を指定します。これは、リモートブランチの変更がローカルブランチにファストフォワードで統合できる場合にのみ使用されます。

  • また、これらの設定はgit config --globalを使用してグローバルな設定としても設定できます。つまり、すべてのリポジトリでデフォルトの統合方法を指定できます。

  • 最後に、--rebase--no-rebase、または--ff-onlyのようなオプションをgit pullコマンドの実行時に指定することもできます。これらのオプションは、コマンドラインで設定されたデフォルトの設定をオーバーライドします。

  • 具体的な統合方法を選択してから、git pullコマンドを再度実行して、ブランチを統合してください。

マージする(2回目)。

git config pull.rebase false  # merge
  • 成功。

statusを確認。

 #git status

On branch ブランチ名
Your branch and 'origin/ブランチ名' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   ファイル名

no changes added to commit (use "git add" and/or "git commit -a")
  • Your branch and 'origin/ブランチ名' have diverged, and have 1 and 1 different commits each, respectively.
    : これは、現在のローカルブランチとリモートブランチ(origin/ブランチ名)が分岐しており、それぞれ異なる1つのコミットが存在することを示しています。つまり、ローカルブランチとリモートブランチの変更履歴が異なっていることを意味します。

  • ブランチが2つに分かれており、マージがうまく行えていないことが分かります。

  • 指示通りgit addを行います。

addをする。

git add ファイル名
  • 成功。

commitする。

git commit -m '文章' 
  • 成功。

pushする。

git push https://github.com/アカウント名/xxx.git
  • Githubに作成したリポジトリのHTTPにpushする。
  • 成功。

これでおしまい。

  • お疲れ様でした。

参考文献

https://wonderful-tereshkova-38f91d.netlify.app/GitHubへのpushが「fetch first」と表示されてrejectedとなったときの対処/

Discussion