这是自己曾经遇到过的问题,分享给大家,也方便自己下次查找

问题描述

在github上创建项目,在本地运行:

1
2
3
4
git init
git add.
git commit -m "init"
git push -u origin master

而忘记git pull -f --all导致github上的版本里有readme文件和本地版本冲突,git弹出以下错误:

1
2
3
4
5
6
7
8
9
Username for 'https://github.com': XXXX
Password for 'https://XXXX@github.com':
To https://github.com/XXXX/test.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/XXXX/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决方法

参考了xwdreamer以及他文章中提及的文章(详见参考文献2、3),其实最简单的解决方法就是一句话:

1
git push -u origin master -f

意思是:使用本地的文件强制覆盖已有的分支,因此可能会造成git上文件的修改丢失。使用强制覆盖前记得检查本地和git上文件的修改进度和情况。

终极解决方法

删除项目内的.git文件夹,一切重新来过。哈哈。注意,GitHub上的版本记录可能会全部丢失。

以下内容也适合第一次提交到GitHub

准备工作

  1. 你要有个GitHub账号和仓库(废话)
  2. 电脑安装了Git或类似的软件(也算是废话):Git for Windows or 其它
  3. 进入你的本地仓库(就是需要上传的项目文件夹内)

开始工作

1
2
git init
ssh-keygen -t rsa -C "你的GitHub注册邮箱" # 已经生成添加过了就不用了

仓库有两种操作方式,一种是使用https,另一种是SSH,这里仅介绍SSH的方式。
两者的区别主要有:

(1)使用Https可以克隆任意GitHub上的项目;而用SSH的话,必须是项目的拥有者或管理员,或使用SSH Key,否则会无法克隆。

(2)Https每次push都需要输入用户名和密码,而使用SSH则可以不需要,使用密匙匹配,直接git push

(3)SSH传输的数据是经过压缩的,可以加快传输的速度,安全性与速度都更优。

添加SSH Key操作

上述第二步执行后,默认会在C:\Users\用户名\.ssh中的文件中生成SSK Key(如果没有输入,一路回车的话,生成的文件是id_rsa.pub ,以及默认无密码)

完成后会提示已经生成成功了。

img

上传Key到Github

  1. 打开 id_rsa.pub 文件,复制文件中的 key,粘贴到 GitHub 网站 Account Settings 中的 SSH keys,Add SSH key 中。如图:

git img

  1. 验证配置是否成功,在git中输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ssh -T git@github.com

    #以下是返回的信息

    #成功的情况
    The authenticity of host 'github.com (IP ADDRESS)' can't be established.
    RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
    Are you sure you want to continue connecting (yes/no)?
    #键入yes
    yes
    #配置成功
    Hi username! You've successfully authenticated, but GitHub does not
    provide shell access.

    #失败的情况
    The authenticity of host 'github.com (IP ADDRESS)' can't be established.
    RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
    Are you sure you want to continue connecting (yes/no)?
    #这种情况需回去检查密匙是否复制错了,不匹配,或检查GitHub上是否成功上传。重新操作一遍试试
  2. 设置用户名和email

    1
    2
    git config --global user.name "your username"
    git config --global user.email "your email@youremail.com"
  3. 添加项目

    1
    2
    3
    git remote add origin git@github.com:XXX/XXX.git #可以直接复制项目页面“Clone or download”中的地址
    git config branch.master.remote origin #设置分支为origin
    git config branch.master.merge refs/heads/master
  4. 提交文件

    1
    2
    git add -A #添加文件夹内所有文件
    git commit -m "填写注释"

其他git命令备忘

  1. 新建目录,将其初始化成Git代码库

    1
    git init "newfolder"
  2. 下载某个项目及其历史

    1
    git clone url
  3. 分支操作

    1
    2
    3
    4
    5
    6
    git branch
    git branch -r
    git branch new_branch # 创建本地分支,注意新分支创建后不会自动切换为当前分支
    git checkout new_branch # 切换分支
    git checkout new_branch # 创建新分支并立即切换到新分支
    git push origin master:newmaster # origin是远程主机,master是当前分支,newmaster是新分支
  4. 修改配置

    1
    2
    3
    4
    git config --list
    git config -e --global
    git config --global user.name "username"
    git config --global user.email "email address"
  5. 删除文件

    1
    2
    git rm file1 # 删除file1,并将删除记录放入暂存区
    git rm --cached file1 # 停止追踪file1,该文件会保留在工作区

参考文献

  1. github中non-fast-forward错误的解决
  2. Git错误non-fast-forward后的冲突解决
  3. Git 版本控制系統(2)
  4. Connecting to GitHub with SSH
  5. git 常用命令详解