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
- git init
- git add .(空格和 . )将文件夹全部内容添加到 git(新文件+修改,不包括删除)- git add -A包括上传删除的文件
- git commit -m “提交信息”
- git remote add origin GitHub项目https地址连接仓库
 如果报错(一般是由于在其他设备使用),先使用- git remote rm origin来清空,再重试
- 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
修改之前的注释:
- git rebase -i HEAD~2数字- 2表示倒数第几次
- 想修改哪条注释 就把哪条注释前面的pick换成edit
- git commit --amend
- git rebase --continue
比较差异
- git diff <commit_id1> <commit_id2>比较两个版本的差异
- git diff --cached比较没有 commit 的差异
- git diff HEAD比较没有 add 和 commit 的改动
添加子模块
| 1 | git submodule add git@github.com:iwxyi/NeveMusic.git order_player | 
在order_player文件夹中,导入 NeveMusic 仓库,代码会自动下载
克隆子模块
一些仓库带有子模块,在 clone 时并不会一起下载,而是只有一个空的文件夹。
通过 submodule 的 init 和 update,一起克隆子模块。
| 1 | git clone xxx | 
其他操作
多人协作
http://www.imooc.com/article/279280
记住密码
git config credential.helper store
| 1 | $ git config credential.helper store | 
在其他项目,只要使用:
| 1 | git config --global credential.helper store | 
会自动调用全局的设置
更改 commit 信息
| 1 | git commit --amend -m "新提交信息" | 
漏提交
| 1 | git add 遗漏文件 | 
重新提交
| 1 | git reset // 回退到上一个commit版本 | 
回滚
| 1 | git reset HEAD 文件名 // 取消暂存区的修改 | 
撤销
revert 和 reset 的区别:revert 也会作为一次操作进入版本库,reset 直接删除指定 commit
| 1 | git revert // 使用新的 commit 来回滚到之前的 commit | 
删除Repository
点开项目–Settings–Delete this repository,会要求输入项目名字来确认删除
强推
出了问题,不管三七二十一,强行push
| 1 | git push origin master -f | 
强制下载
| 1 | git fetch --all | 
Git目录下新增文件
在项目根目录直接添加新文件夹好像不会上传
需要手动添加到Git的上传列表里
| 1 | git add 文件夹名 | 
删除某个文件
| 1 | git rm -r --cached xxx | 
再commit和push
其中目录需要强制-r
切换分支导致代码丢失
| 1 | git reflog | 
可以看到按时间排列的所有提交
取消合并
| 1 | git merge --abort | 
问题
remote origin already exists
| 1 | $ git remote add origin 项目地址 | 
解决方法:
| 1 | git remote rm origin | 
再重新git remote add origin 项目地址
其实不用管它也没事的……
多设备提交冲突
| 1 | $ git push -u origin master | 
让你fetch first
就是先git pull 一下
| 1 | git fetch | 
等同于
| 1 | git pull | 
还是不行的解决办法:
远程分支上存在本地分支中不存在的提交,往往是多人协作开发过程中遇到的问题,可以先fetch再merge,也就是pull,把远程分支上的提交合并到本地分支之后再push。
如果你确定远程分支上那些提交都不需要了,那么直接git push origin master -f,强行让本地分支覆盖远程分支。。。(不建议,会覆盖掉以前的所有 commits)
SSH问题
| 1 | $ git push -u origin master | 
解决办法:
需要重新创建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 | git pull origin master | 
不匹配
| 1 | error: src refspec master does not match any. | 
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 | git commit -m "更新文件结构" | 
解决方法:使用git add -A 进行添加line
You are not currently on a branch
- git status查看所有变化的文件, 把有改动的先删除(或者提交)
 注意, 注意, 注意, 最好额外备份一份
- git checkout master回到主分支
 就是回退到- master主分支上,这次修改的内容会消失
- git pull保证一下本地是最新代码
- 然后将备份的内容 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 | git merge --abort | 
解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)
| 1 | git fetch --all |