Git 用法

下载Git

git-x.x.x-64-bit.exe

下载地址:https://git-scm.com/downloads

一路默认安装

linux下安装:sudo apt-get install git

启动

在项目目录中打开 Git Bash

用命令行进行管理

身份

  • git config --global user.email "you@example.com"
  • git config --global user.name "Your Name"

上传Git

  1. git init
  2. git add . (空格和 . )将文件夹全部内容添加到 git(新文件+修改,不包括删除)
    git add -A 包括上传删除的文件
  3. git commit -m “提交信息”
  4. git remote add origin GitHub项目https地址 连接仓库
    如果报错(一般是由于在其他设备使用),先使用 git remote rm origin 来清空,再重试
  5. git push -u origin master 上传项目。会弹出窗口输入GitHub账号密码。
    如果要上传到已存在的仓库,要先使用git pull origin master来同步到本地

更新Git

从上面第2点开始,最后一步可以直接 git push

SSH连接

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

三下回车,出现图案结果。

复制文件C:/Users/Administrator/.ssh/id_rsa.pub内容,把key添加到:github > settings > SSH and GPG keys > New SSH key > 粘贴保存。

Linux在:/home/用户名/.ssh/id_rsa.pub,可用命令行打开

Mac在:/Users/用户名/.ssh/id_rsa.pub

撤销提交

git reset --soft HEAD^ 仅撤销提交,写的代码仍然保留

代码回滚

  • git log # 得到你需要回退一次提交的commit id
  • git reset --hard <commit_id>
  • git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除

创建分支

  • git checkout -b dev 创建并切换本地分支dev
  • git checkout dev 切换分支
  • git remote add upstream [主仓库地址] 关联上游分支
  • git fetch upstream 分仓库获取主仓库最新状态
  • git push --set-upstream origin line64 首次上传(创建云端分支)
  • git checkout master, git merge dev 合并分支

修改commit

修改上一次的提交:git commit --amend

修改之前的注释:

  1. git rebase -i HEAD~2 数字2表示倒数第几次
  2. 想修改哪条注释 就把哪条注释前面的pick换成edit
  3. git commit --amend
  4. git rebase --continue

比较差异

  • git diff <commit_id1> <commit_id2> 比较两个版本的差异
  • git diff --cached 比较没有 commit 的差异
  • git diff HEAD 比较没有 add 和 commit 的改动

添加子模块

1
2
3
git submodule add git@github.com:iwxyi/NeveMusic.git order_player
git submodule init
git submodule uodate

order_player文件夹中,导入 NeveMusic 仓库,代码会自动下载

克隆子模块

一些仓库带有子模块,在 clone 时并不会一起下载,而是只有一个空的文件夹。

通过 submodule 的 init 和 update,一起克隆子模块。

1
2
3
git clone xxx
git submodule init
git submodule update

其他操作

多人协作

http://www.imooc.com/article/279280

记住密码

git config credential.helper store

1
2
3
4
5
$ git config credential.helper store
$ git push https://github.com/owner/repo.git
# 然后输入用户名和密码
Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

在其他项目,只要使用:

1
git config --global credential.helper store

会自动调用全局的设置

更改 commit 信息

1
git commit --amend -m "新提交信息"

漏提交

1
2
git add 遗漏文件
git commit --amend --no-edit // 表示提交消息不会更改,仅为一次提交

重新提交

1
git reset // 回退到上一个commit版本

回滚

1
2
3
4
5
6
7
git reset HEAD 文件名  // 取消暂存区的修改

git reset --hard 提交ID // 全部回退到指定版本

git reset --hard HEAD~1 // 回退一个版本

git reset --soft HEAD~1 // 版本库回退一个版本,该版本之后的所有变更进入暂存区

撤销

revert 和 reset 的区别:revert 也会作为一次操作进入版本库,reset 直接删除指定 commit

1
git revert  // 使用新的 commit 来回滚到之前的 commit

删除Repository

点开项目–Settings–Delete this repository,会要求输入项目名字来确认删除

强推

出了问题,不管三七二十一,强行push

1
git push origin master -f

强制下载

1
2
3
git fetch --all 
git reset --hard origin/master
git pull

Git目录下新增文件

在项目根目录直接添加新文件夹好像不会上传

需要手动添加到Git的上传列表里

1
2
3
git add 文件夹名
git commit -m ""
git push

删除某个文件

1
git rm -r --cached xxx

再commit和push

其中目录需要强制-r

切换分支导致代码丢失

1
git reflog

可以看到按时间排列的所有提交

取消合并

1
git merge --abort

问题

remote origin already exists

1
2
$ git remote add origin 项目地址
fatal: remote origin already exists.

解决方法

1
git remote rm origin

再重新git remote add origin 项目地址

其实不用管它也没事的……

多设备提交冲突

1
2
3
4
5
6
7
8
9
$ git push -u origin master
To https://github.com/MRXY001/yunj.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/MRXY001/yunj.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

让你fetch first
就是先git pull 一下

1
2
git fetch
git merge

等同于

1
git pull

还是不行的解决办法

远程分支上存在本地分支中不存在的提交,往往是多人协作开发过程中遇到的问题,可以先fetchmerge,也就是pull,把远程分支上的提交合并到本地分支之后再push

如果你确定远程分支上那些提交都不需要了,那么直接git push origin master -f,强行让本地分支覆盖远程分支。。。(不建议,会覆盖掉以前的所有 commits)

SSH问题

1
2
3
4
5
6
7
8
9
10
$ git push -u origin master
The authenticity of host 'github.com (13.229.188.59)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.229.188.59' (RSA) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

解决办法

需要重新创建SSH

1
ssh-keygen -t rsa -C "wxy19980615@gmail.com"

/c/Users/Administrator/.ssh/id_rsa.pub 文件的内容放到 GitHub/Settings/SSH keys 里面
然后再重新执行 git push -u origin master

failed to push some refs to ‘origin’

意思是本地和远程的文件应该合并后才能上传本地的新文件

1
2
git pull origin master
git push -u origin master

不匹配

1
2
error: src refspec master does not match any.
error: failed to push some refs to

git commit -m "xxx" 重新上传一遍

拒绝合并不相关的历史

1
fatal: refusing to merge unrelated histories

出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库。假如我之前是直接clone的方式在本地建立起远程github仓库的克隆本地仓库就不会有这问题了。

可以在pull命令后紧接着使用--allow-unrelated-history选项来解决问题(该选项可以合并两个独立启动仓库的历史)

1
git pull origin master --allow-unrelated-histories

(合并的文件很可能会有问题,需要手动调整)

直接push的话会继续报错:Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes

然后add和commit,最后重新push一遍

Changes not staged for commit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git commit -m "更新文件结构"
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
modified: ../README.md
deleted: ../picture/result.png
deleted: ../qidian_collections.py
deleted: ../train.py

Untracked files:
../name_collections.py
../name_train.py

no changes added to commit

解决方法:使用git add -A 进行添加line

You are not currently on a branch

  1. git status 查看所有变化的文件, 把有改动的先删除(或者提交)
    注意, 注意, 注意, 最好额外备份一份
  2. git checkout master 回到主分支
    就是回退到 master 主分支上,这次修改的内容会消失
  3. git pull 保证一下本地是最新代码
  4. 然后将备份的内容 paste 就好了

fatal: your current branch appears to be broken

现象:

打开git git log

fatal: your current branch appears to be broken

文件全部是new状态

解决办法:

.git\refs\heads\ 下有各个分支命名的HEAD的纪录文件,纪录当前分支指向哪个commit,

用notepad打开有一串NUL,去.git\logs\refs\heads这个目录下,找到当前分支对应的文件,打开找到最后一次commit的hashcode

把这个code,复制到.git\refs\heads\ 下对应的分支文件中,就可以了

error: You have not concluded your merge

原因可能是在以前pull下来的代码自动合并失败

解决办法一:保留本地的更改,中止合并->重新合并->重新拉取

1
2
3
git merge --abort
git reset --merge
git pull

解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)

1
2
3
git fetch --all
git reset --hard origin/master
git fetch