Git使用指北
本文主要介绍Git软件和Github在Windows平台的简单使用方式
安装Git
安装包可以在官网下载,选择对应版本无脑下一步安装
初次设置
安装完成后,邮件菜单即可调用Git命令,点击进入后需要初始化账户名和邮箱
1 | git config --global user.name "Your Name" |
生成SSH Key
1 | ssh-keygen -t rsa -C "youremail@example.com" |
- 一路Enter键后会需要设置自己的账户和密码,注意正确输入
- 然后在
C:\Users\你的用户名\.ssh
路径下可以找到如下3个文件
- 后缀为
pub
的文件,这个是公钥,在后续会用的到,也可以放心的告诉别人 - 后缀为
rsa
的是私钥,不要泄露出去
关于SSHKey
GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
注册GitHub账户
- 到github官网自行注册并登录
- 右键点击右上角头像边的箭头,选择
setting
进入
- 找到左侧的
SSH and GPG keys
,点击NewSSHKey
- 找到之前生成的公钥文件,用记事本打开复制里面全部内容,然后粘贴到如下图
key
内,点击AddSSHKey
完成,
使用Git
创建本地仓库
- 在桌面直接右键进入git
1 | cd E:/ --进入E盘 |
如上述代码所示,完成在E盘新建文件夹然后初始化的过程,其中前三步非每次必须,可以直接手动创建文件夹,然后通过git init
初始化
提交本地文件
1 | vim test.txt --新建文件 |
按键盘Insert
键进入编辑模式,输入hello
,然后按顺序ESC
,:
,wq
退出
上述步骤完成了创建文件,写入退出的过程,到此生成了文件和内容如下图
对,一顿操作猛如虎,回头一想就是Linux那一套☠
- 上述步骤完全可以自行创建和编辑内容,然后我们开始提交
1 | git add test.txt //提交text.txt文件到待提交列表 |
至此我们已经提交到了本地仓库,可以通过命令git log
查询日志找到记录
添加远程仓库
到这一步我们得先创建一个远程仓库,来到我们github,通过Your respositories
>New
创建新的仓库,这里我们创建了名为Test
的仓库
- 找到如下图所示,复制地址信息(推荐使用SSH,使用HTTPS经常需要输入账户)
然后运行git命令
1 | git remote add origin "你的地址" //添加远程仓库地址 |
提交/拉取远程仓库
1 | git add push origin -u master //master为当前分支,默认一般就是master,可以自行修改,下同 |
到这里就提交到了远程仓库,如下图所示
1 | git pull origin master |
从远程仓库拉取master分支的内容
取消关联远程仓库
1 | git remote rm origin |
新建分支
1 | // -b是base的意思,就是以当前分支为基础创建一个新分支 |
Checkout的用法
checkout
有三种用途:切换分支、移除修改、从历史版本中签出,后面会写到
1 | //从远程的origin/level为基础创建本地分支 |
推送本地当前分支到远程分支
1 | // 若远程不存在${new_branch_name}分支则会自动创建 |
合并分支
1 | // 首先需要切换回需要合并到的分支,比如将dev分支合并到master分支 |
取消合并
如果本地与远程分支(或本地分支)有冲突可以取消合并,使本地分支回到合并之前的状态。
1 | git merge --abort |
解决冲突
在使用git协作开发的时候,冲突是经常会遇到的问题,也是对于新手来说非常棘手的问题
- 首先我们要在本地处理好自己的文件
撤销修改
1 | git checkout -- test.txt //撤销对test.txt文件的修改 |
解决拉取冲突
如果在拉取以后发生冲突了,在拉取日志里就有报错,通过git status
命令也可以看到有红色部分,通过下列命令解决
如果我们要保留远程分支的test.txt
可以执行以下命令:
1 | // 保留远程版本的test.txt |
而保留本地分支的文件命令为:
1 | $ git checkout --ours test.txt |
然后再此执行如下命令,注意这会再一次生成提交记录
1 | $ git add test.txt |
此时本地就与远程合并了,并且合并时保持了远程的文件版本。
回退版本
如果想要取消本地的某次提交${123456}
的更改可以使用回退到历史版本,然后使用:
1 | git reset --hard 123455 |
删除分支
1 | // 删除本地分支 |
版本回退
1 | git log --pretty=oneline //查看所有提交记录 |
克隆远程仓库
1 | // clone仓库所有分支 |
切换到远程分支
远程仓库 git clone
下来后,执行 git branch
,只能看到
1 | * master |
并不会看到其他分支,即便远程仓库上有其他分支。
可以使用git branch -va
首先列出本地/远程分支列表:
通过git checkout remotes/origin/master
切换到远程分支
再进行如下操作
1 | git checkout -b dev |
最后得到如下结果
然后在本地修改dev分支的内容就可以提交到远程dev分支(此案例远程没有dev分支)
忽略不想提交的文件
有时我们不想要把所有的东西都提交到仓库中(比如一些编译生成的二进制文件),可以使用.gitignore来排除不需要提交的文件。
在Windows下我们不能够直接创建这个文件,因为是.开头没有文件名,所以需要在GitBash下使用命令创建:
1 | touch .gitignore //创建文件 |
然后用记事本打开编辑里面的内容并保存
1 | //排除当前目录下的public文件夹 |
其中在上述最后3条对于UE4的开发比较常用
关于忽略文件的更多内容,可以查看此文档
比较不同版本的差异
我们继续在test.txt
文件加入一行world
,然后运行
1 | git diff |
得到如下
其他命令
1 | //查看尚未暂存的某个文件更新了哪些 |
两个分支的差异
1 | git diff topic master (1) |
用法1,直接跟两个使用空格分隔的分支名会直接将两个分支上最新的提交做diff,相当于diff了两个commit。
用法2,用两个点号分隔的分支名,作用同用法1(装酷利器)
用法3,用三个点号分隔的分支名会输出自topic与master分别开发以来,master分支上的change。
需要注意的是这里的..和…不能与git rev-list中的..和…混淆。
错误处理
如果使用git
终端时出现以下错误:
1 | git status |
这是由于索引损坏造成的,可以通过下面的方式来处理:
1 | rm -f .git/index |
关闭Git的SSL验证
1 | git config --global http.sslVerify false |
私钥权限过于开放报错
使用git出现如下报错
1 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
这是提示你的Git私钥读写权限过于开放会有安全问题
解决方法:对文件.ssh/id_rsa
点右键属性-安全/高级
,禁用继承,将文件所有者更改为你自己的账户,然后添加你自己的账户和SYSTEM
完整的控制权,保存即可。
Git更新远程分支列表
1 | git remote update origin --prune |
submodule
如果再一个git仓库中又用到其他git仓库的,就可以使用git module
来处理这个包含关系。
如果直接在git仓库A中把另一个仓库B clone下载作为A的子目录,在git add
时会有下列类似的提示:
1 | hint: You've added another git repository inside your current repository. |
目的就是告诉你你包含了另一个git的仓库。
正确的处理办法是,先把之前clone的B删除,然后使用git submodule
来clone B:
1 | $ git submodule add git@github.com:VJien/img.git |
会把B clone下来,然后进到B的目录里面,将版本记录改为你想要的commit,然后再add/commit即可。
1 | git status |
然后再push到远程仓库即可,在远程仓库中,A项目中的B目录就不是直接上传的文件,而是连接到真正的B的源仓库。
初始更新子模块
1 | git submodule update --init --recursive |
后续更新子模块
1 | git submodule foreach git fetch |
删除子模块
删除一个以添加的子模块需要有以下几个步骤:
- 删除子模块的目录
- 删除
.gitmodules
中的关于该子模块的信息 - 删除
.git/config
中关于该子模块的信息 - 删除
.git/modules
下该子模块的目录
执行完上面几步操作之后就可以了,但是如果有报错问题可以删掉缓存:
1 | git rm --cached 子模块名称 |
创建本地空仓库
个命令是创建一个空仓库,可以在其他的项目中将该仓库添加为远程仓库。
1 | git --bare init |
部分内容参考至本人好友查理同学的☛博客☚