[Git] git push が non-fast-forward で reject された場合の対処
分からない点も含め memo.
Contents
non-fast-forward の状況と対処
図解がわかりやすいこちらで勉強させていただきました。
以下、一般的な状況と対処法になると思われる。
- トピックブランチで開発を進める。
- その間に master に更新が加わっていた。
master に更新分を持ってくる
本家リポジトリの更新を ローカルの master に反映する。
% git checkout master
A Casks/omnioutliner-professional3.rb
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
% git fetch upstream
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 2), reused 2 (delta 0)
Unpacking objects: 100% (4/4), done.
From github.com:caskroom/homebrew-versions
a2f1856..d9e546d master -> upstream/master
% git merge upstream/master
Updating a2f1856..d9e546d
Fast-forward
Casks/omnigraffle-professional5.rb | 7 +++++++
Casks/omniplan1.rb | 7 +++++++
2 files changed, 14 insertions(+)
create mode 100644 Casks/omnigraffle-professional5.rb
create mode 100644 Casks/omniplan1.rb
同期した内容を Fork したリモートへ push する。
% git push origin master
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 648 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To git@github.com:DriftwoodJP/homebrew-versions.git
a2f1856..d9e546d master -> master
この状態で non-fast-forward となっている。
diff をみると更新分の差分が表示される。
% git diff master add_omnioutliner-Professional3
diff --git a/Casks/omnigraffle-professional5.rb b/Casks/omnigraffle-professional
deleted file mode 100644
index e9a123d..0000000
--- a/Casks/omnigraffle-professional5.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class OmnigraffleProfessional5 < Cask
- url 'http://www.omnigroup.com/ftp/pub/software/MacOSX/10.6/OmniGrafflePro-5.4
- homepage 'http://www.omnigroup.com/products/omnigraffle'
- version '5.4.4'
- sha256 '396a4adaadb82d651ea6ec8b141c9e5f5b0b5f53c6edee5e7806a896783892c9'
- link 'OmniGraffle Professional 5.app'
-end
diff --git a/Casks/omnioutliner-professional3.rb b/Casks/omnioutliner-profession
new file mode 100644
index 0000000..68136e2
--- /dev/null
+++ b/Casks/omnioutliner-professional3.rb
@@ -0,0 +1,7 @@
+class OmnioutlinerProfessional3 < Cask
+ url 'http://www.omnigroup.com/ftp/pub/software/MacOSX/10.4/OmniOutlinerPro-3.
+ homepage 'http://www.omnigroup.com/omnioutliner/'
+ version '3.10.6'
リベースを行い non-fast-forward 状態を解消する
add_omnioutliner-Professional3
に移動。
% git rebase -i master
Successfully rebased and updated refs/heads/add_omnioutliner-Professional3.
diff で変更箇所を確認。
% git diff master add_omnioutliner-Professional3
diff --git a/Casks/omnioutliner-professional3.rb b/Casks/omnioutliner-profession
new file mode 100644
index 0000000..68136e2
--- /dev/null
+++ b/Casks/omnioutliner-professional3.rb
@@ -0,0 +1,7 @@
+class OmnioutlinerProfessional3 < Cask
+ url 'http://www.omnigroup.com/ftp/pub/software/MacOSX/10.4/OmniOutlinerPro-3.
+ homepage 'http://www.omnigroup.com/omnioutliner/'
+ version '3.10.6'
+ sha256 'ec8ee1ec00870a1cc5920d2e899cd255eef6564c8e9944eadfdf5297f1cb348e'
+ link 'OmniOutliner Professional.app'
+end
push が無事受け付けられた。
% git push origin add_omnioutliner-Professional3
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 573 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To git@github.com:DriftwoodJP/homebrew-versions.git
* [new branch] add_omnioutliner-Professional3 -> add_omnioutliner-Professional3
use “git branch –unset-upstream” to fixup といわれるケース
git branch --unset-upstream
後、上記と同じ手順で問題なくなる。
% git checkout add_omnigraffle-pro5_spike
Switched to branch 'add_omnigraffle-pro5_spike'
Your branch is based on 'origin/add_omnigraffle-pro5_spike', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
% git branch --unset-upstream
git push -u
の振る舞いがよく理解できていない。
pull request したブランチをさらに更新するケース
修正を求められたので変更後、コミットをまとめ直すケース 。
% git rebase -i master
[detached HEAD 0be59a7] added omnioutliner-professional3
1 file changed, 7 insertions(+)
create mode 100644 Casks/omnioutliner-professional3.rb
Successfully rebased and updated refs/heads/add_omnioutliner-Professional3.
すると non-fast-forward な状況が生まれる。
リモートに push できない。
% git push origin add_omnioutliner-Professional3
To git@github.com:DriftwoodJP/homebrew-versions.git
! [rejected] add_omnioutliner-Professional3 -> add_omnioutliner-Professional3 (non-fast-forward)
error: failed to push some refs to 'git@github.com:DriftwoodJP/homebrew-versions.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
git diff
で問題がないことを確認して、force push し直した。
以下、ログを取り忘れたので曖昧な記憶。
% git rebase -i add_omnioutliner-Professional3
Successfully rebased and updated refs/heads/add_omnioutliner-Professional3.
noop
と表示されたのでそのまま終了したような記憶。
no operation ということか。
% git push -f origin add_omnioutliner-Professional3
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 368 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
To git@github.com:DriftwoodJP/homebrew-versions.git
+ 7a0e4fd...51919d9 add_omnioutliner-Professional3 -> add_omnioutliner-Professional3 (forced update)
どういったときに force push してはいけないかなど判断するための理解が不足している。