我在尝试合并或拉动分支时遇到错误。
错误(来自拉取请求的此示例)如下:
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
我肯定输入了提交消息。
git commit -am "saving my work"
这个错误并没有给我任何选择来解决它甚至ctrl + c out。我基本上必须关闭终端窗口并重新打开它。
事情是,一旦我重新打开终端,合并或拉取请求似乎总是成功,但是没有提交。我只是承诺我的改变和罚款。它主要是讨厌(对于更重要的合并有点神经紧张)。
有谁知道这可能是什么以及如何预防?
答案 0 :(得分:1)
这不是错误消息。 git pull
需要进行合并,并且要求您解释原因......对用户提出的问题有点不诚实,但这对您来说是Git。
git pull origin test_branch
真的是git fetch origin
加上git merge origin/test_branch
。除非你告诉它,否则Git不会与远程存储库通信,所以它必须获得遥控器上更改内容的全新快照。它执行fetch
以获取远程存储库状态的更新。它将此存储在origin/test_branch
等远程跟踪分支中,test_branch
分支在origin
存储库中。
在获取之前,您的回购可能看起来像这样。
A - B - C - D [origin/test_branch]
\
E - F [test_branch]
这意味着您最后一次从origin
获取,其test_branch
位于D.然后您做了一些本地提交。
获取后,它可能看起来像这样。
A - B - C - D - G - H [origin/test_branch]
\
E - F [test_branch]
其他人推了一些更改,因此您的test_branch
已与origin
的{{1}}分支不同。这必须合并,因此test_branch
执行git pull
。这导致合并提交,并且像任何合并一样,它要求您解释它发生的原因。
git merge origin/test_branch
您可以告诉它类似于"与遥控器同步"。
这样就足够了,你会得到许多合并,而这些合并实际上只是簿记。
A - B - C - D - G - H [origin/test_branch]
\ \
E - F - I [test_branch]
I,O和Q都没有意义。每个人都这样做,存储库可能会变得很乱。我画得很整齐,但是Git并不总是如此。
有更好的方法。 A - B - C - D - G - H - J - K - L - M [origin/test_branch]
\ \ \ \
E - F - I - N - O - P - Q [test_branch]
。这是一个fetch + rebase,而不是fetch + merge。所以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
的其他用法不同,这始终是安全的,因为它只影响您未与其他人共享的提交。您可以放心地设置它,以便git pull
中的~/.gitconfig
始终会变基。
[pull]
rebase = true
现在git pull origin test_branch
将使用rebase而非合并,并且您将拥有更清晰的历史记录,并且记账更少。