2017-02-10 28 views
0

ブランチをマージまたはプルしようとしたときにエラーが発生しました。次のようにmerge/pullでGitエラーが発生する

エラー(プル要求から、この例では)である:

MacBook-Pro-2:boilerplate Gene$ git pull origin test_branch 
From https://github.com/me/boilerplate 
* branch   test_branch  -> FETCH_HEAD 

Merge branch 'test_branch' of https://github.com/me/boilerplate into test_branch 

# Please enter a commit message to explain why this merge is necessary, 
# especially if it merges an updated upstream into a topic branch. 
# 
# Lines starting with '#' will be ignored, and an empty message aborts 
# the commit. 
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
"~/Sites/boilerplate/.git/MERGE_MSG" 7L, 302C 

シングはI は間違いコミットメッセージを入力します。

git commit -am "saving my work"

そして、このエラーは私にすべてのそれを解決するためのオプション、あるいはCtrl + Cアウトを与えるdoesntの。私は基本的にターミナルウィンドウを閉じてそれを再び開く必要があります。

ターミナルを再オープンすると、マージまたはプル要求は常に成功したように見えますが、コミットされません。私はちょうど私の変更とその罰金をコミットします。そのほとんどはちょうど迷惑な(そして、より重要な合併のために少し神経を砕く)。

これが何であるか、どのように防止するかは誰にも分かりますか?

+1

'vi'の使い方を知っていますか? – PetSerAl

+0

[gitのマージコミットメッセージをカスタマイズするにはどうすればいいですか?](http://stackoverflow.com/questions/3148863/how-can-i-customize-gits-merge-commit-message) – chwarr

+0

私は分かりません'vi' – yevg

答えて

1

これはエラーメッセージではありません。 git pullはマージを行う必要があります。なぜそれを説明する必要があるのですか。これはユーザーに尋ねるのがちょっと分かりませんが、それはあなたのためのGitです。

git pull origin test_branchは、実際にはgit fetch origingit merge origin/test_branchです。 Gitはリモートリポジトリと話をしない限り、リモートのリポジトリと話しませんので、リモートで変更されたものの最新のスナップショットを取得する必要があります。 fetchは、リモートリポジトリの状態の更新を取得します。これはorigin/test_branchのようなリモートトラッキングブランチにこれを格納します。test_branchブランチはoriginリポジトリにあります。

フェッチする前に、レポが次のように表示されることがあります。そのtest_branchoriginからあなたフェッチされた最後の時間を意味

A - B - C - D [origin/test_branch] 
      \ 
       E - F [test_branch] 

は、あなたはいくつかのローカルのコミットをした後D.にありました。

フェッチした後は、次のようになります。

A - B - C - D - G - H [origin/test_branch] 
      \ 
       E - F [test_branch] 

あなたtest_branchorigin年代test_branch枝から分岐しているので、他の誰かが、いくつかの変更をプッシュ。これはマージする必要がありますので、git pullgit merge origin/test_branchになります。これにより、マージコミットが行われ、マージのように、なぜそれが起こったのかを説明するよう求められます。

A - B - C - D - G - H [origin/test_branch] 
      \  \ 
       E - F - I [test_branch] 

"リモートとの同期"のようなことが分かります。


これで十分ですし、本当に単なる簿記なのです。

A - B - C - D - G - H - J - K - L - M [origin/test_branch] 
      \  \  \  \ 
       E - F - I - N - O - P - Q [test_branch] 

I、OおよびQはすべて意味がない。誰もがこれをやっていると、リポジトリは大きな混乱になる可能性があります。私はそれをきちんと描きましたが、Gitは必ずしもそうとは限りません。

良い方法があります。 git pull --rebase。フェッチ+マージの代わりに、これはフェッチ+リベースです。だからfetchの後にこれがあります。

A - B - C - D - G - H [origin/test_branch] 
      \ 
       E - F [test_branch] 

代わりのgit merge origin/test_branchをやって、それはgit rebase origin/test_branchを行います。 EとFをHの上にあるかのように書き換え、新しいコミットIDを与えます。

A - B - C - D - G - H [origin/test_branch] 
      \  \ 
       E - F E1 - F1 [test_branch] 

EとFは最終的にガベージコレクションされますが、何かがひどく間違っている場合は、このプロセスを逆にすることができます。

物事を混乱させるような簿記のマージはありません。歴史は素晴らしく線形です。まるで最新のコードを作業しているかのようです。

rebaseの他の用途とは異なり、これは他の誰とも共有していないコミットにのみ影響するため、常に安全です。 ~/.gitconfigには常にgit pullがリベースされるように、安全に設定することができます。今

[pull] 
     rebase = true 

git pull origin test_branchではなく、マージのリベースを使用します、そして、あなたはより少ない簿記とクリーンな歴史を持っています。

+0

あなたの徹底的な対応に感謝します。私はこの例がプル要求を参照していることを知っていますが、このメッセージはマージの場合どのような意味ですか? – yevg

+0

@yevg 'git pull'はプルリクエストではありません。プルリクエストは、Gitubではなく、Githubのものです。あなたが持っているのは*マージされたメッセージです。 'git pull'は' git fetch' + 'git merge'です。 – Schwern

関連する問題