git 本地和 remotes 及其他小知识

初学git的时候总是会有这么2个问题:

  1. origin是什么?fetch 和 pull, push 和 commit 到底什么区别?
  2. push reject?
  3. 合并分支怎么回事?冲突了怎么办?

本文就是基于我的git使用经验来聊聊这2个问题

问题1:origin是什么?fetch 和 pull, push 和 commit 到底什么区别?

先附上图片一张
img
由图中可以看到本地其实有2个类似仓库的概念的东西
你每一次fetch,其实只是把远程服务器上的内容拉到你本地remotes下

再说origin:

origin是本地对远程仓库的默认别名
我们执行git remote -v查看设置

1
2
3
4
git remote -v
# 输出:
# origin git@github.com:your_name/your_repertory.git (fetch)
# origin git@github.com:your_name/your_repertory.git (push)

这个配置就能说明,我们执行git fetch origin的时候就会去git@github.com:your_name/your_repertory.git获取最新的远程代码。
同理push也就是把代码推到git@github.com:your_name/your_repertory.git

我们可以使用git remote rename origin rpo添加多个远程仓库
这个时候输出就会如下

1
2
3
4
git remote -v
# 输出:
# rpo git@github.com:your_name/your_repertory.git (fetch)
# rpo git@github.com:your_name/your_repertory.git (push)

由此可以看到origin只是你clone时,git添加的默认远程分支,你可以改它名字为任何名字,并不会是很多刚接触时,认为必须origin不可的概念。

push 和 commit

很多刚开始使用git的同学,都不太明白commit后为什么还要push
其实看上图可知commit只是修改了你本地的一个仓库内容,最后push才是完成推送到远程的一个动作(同时也会更新你本地的remotes)
所以,大家其实可以情景的在本地commit或其他操作,只要不使用push,完全不用担心远程仓库被搞坏。

fetch 和 pull

记住一个概念 pull = fetch + merge,相信你就不会有问题

问题2: push rejected??push 失败

1
2
3
4
5
6
7
8
$ git push origin master
To git@github.com:your_name/your_repertory.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:your_name/your_repertory.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.

其实只是一个很常见的问题,当你们多人在同一个分支上合作开发的时候,你想要push到远程,然而在你之前另一位同学A,push了一个新的上去,此时你的remotes里的就不是最新的了,git不知道你的是对的,还是A同学的是对的,所以他就把后面的提交拒绝了,你也就收到了这个报错。
此时,我们只需要按提示的进行git pull(或者,推荐 git fetch 最新的在手动使用 rebase/merge 等操作),把A的更新到你的本地分支上,就可以成功的push了

问题3:冲突了怎么办?

其实这个教程非常的多,只是要切记冲突处理完前,请不要做切换分支等操作,正常的处理好冲突,如果无法处理时,使用abort取消才是正确的方式

未完待续,如果有需要补充或者疑问可以通过 git 的 issues 或者直接联系我,我会再补充