git 学习笔记(基础)

1 安装Git

Windows

可以从官网下载,若速度太慢,从百度网盘中下载。
下载与系统相对应的版本,按默认配置安装即可。

2 安装后配置

2.1 打开git安装目录下的git-bash.exe,使用命令配置全局的用户名与邮箱。

1
2
$ git config --global user.name "YourName"
$ git config --global user.email "YourEmail"

2.2 通过ssh获取私有的远程仓库。

生成rsa加密用的私钥与公钥,按默认配置生成即可,windows下生成的文件在 C:\Users\{{ 你的用户名 }}\.ssh  目录下,id_rsa为私钥,不可泄露,id_rsa.pub为对外公开的公钥

1
$ ssh-keygen -t rsa -C "YourEmail"

查看公钥的内容,复制,添加到远程仓库的ssh配置中。例如git@osc的Key配置页面。
添加完成后进行测试:

1
$ ssh -T git@git.oschina.net

若提示:

1
Welcome to Git@OSC, Astian!

说明ssh配置成功。
复制需要克隆到本地的项目的ssh链接,用以下命令即可进行克隆:

1
$ git clone git@git.oschina.net:hsinan/FZBike.git

3 commit的步骤

对代码进行修改测试完毕后要及时commit到仓库中,具体流程如下:

3.1 查询状态,可以看出哪些文件发生变化

1
$ git status

3.2 若对变化有疑问,可用diff命令对比文件具体的变化

1
$ git diff index.html

3.3 确认无误后,先用add命令添加文件,再commit实现提交

1
2
3
4
#可以添加多个文件,也可以用git add . 来添加所有的变化,如果对自己所做的修改都可以确认的话
$ git add index.html
$ git commit -m "修改主页的提示" #提交修改,并写入日志,建议每次都写日志
$ git push #推送到远程仓库

4 时光机穿梭

4.1 版本回退与切换

1
2
#commit_id为版本号,用git log(可加参数--pretty=oneline缩略显示)命令可查询每个版本的详细信息,用git reflog可查询最近变更的简短信息。可用HEAD表示上一版本,HEAD^表示上上版本,HEAD~100表示前一百个版本。
$ git reset --hard commit_id

4.2 撤销修改

1
2
$ git checkout -- file #丢弃工作区的修改,若文件没add到暂存区,则回退到跟版本库一致;若add后做了修改,则回退到刚加入暂存区时的状态。
$ git reset HEAD file #将暂存区的文件放回工作区

4.3 删除文件

在工作区删除文件后,若为误删,可以从版本库中进行恢复

1
$ git checkout -- test.txt

若确实要从项目中删除,需用git rm命令:

1
2
$ git rm 'test.txt' #用该命令可直接对文件进行删除
$ git commit -m "remove text.txt again" #删除后需要进行提交

5 远程仓库

5.1 将本地项目推送到远程仓库

1
2
3
4
5
#添加远程仓库,名称为origin,后面为远程仓库的ssh地址
$ git remote add origin git@git.oschina.net:hsinan/learngit.git
#将本地的master分支推送到远程仓库origin,参数-u的目的是将本地的master与远程的master关联起来,只在第一次使用
$ git push -u origin master
$ git push origin master #后续推送到远程仓库时使用该命令即可

5.2 克隆远程仓库

1
2
3
4
#git协议,使用ssh,推荐,无需每次都输入口令
$ git clone git@git.oschina.net:hsinan/learngit.git
#无法使用ssh时使用,速度稍慢,每次都需输入口令
$ git clone https://git.oschina.net/hsinan/learngit.git

6 分支管理

git创建分支与切换分支非常快,当你需要开发一个大版本功能,无法在短时间内开发完成但是又想commit以防止本地代码丢失的时候,可以创建分支放心开发,开放完毕后再合并到master中

6.1 分支的创建与合并

1
2
3
4
5
6
7
$ git branch #查看分支列表,带*号的表示当前所在的分支
$ git branch dev #创建分支dev
$ git checkout dev #切换到分支dev下
$ git checkout -b dev #创建分支dev并切换过去
#合并分支dev到当前分支中,例如在分支dev中开发完成后,git checkout master,切换到主分支下,再合并dev中的代码到主分支
$ git merge dev
$ git branch -d dev #删除分支dev,若分支未被合并则会报错,需用-D参数进行强制删除

6.2 解决冲突

当要提交的代码在不同分支中存在冲突时,需要先合并有冲突的文件,再手动解决冲突,最后才能成功提交

1
2
$ git merge dev #分支内容有冲突后会报错,不能快速合并,但会对有冲突的文件进行合并
$ git status #查看发生冲突的是哪些文件

打开文件,可以发现如下格式的内容:

1
2
3
4
5
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev

以上内容即为有冲突的部分,手动修改后即可成功提交。

当本地仓库与远程仓库中的代码有冲突时,直接push会报错,需要先pull下远程仓库的代码,git会对有冲突的部分进行合并,之后在本地仓库中手动修改冲突部分,最后add-commit-push。

1
2
3
4
#从远程仓库中拉取代码,合并有冲突的代码。拉取其他分支时可能会报错,需要用$ git branch --set-upstream dev origin/dev 指定本地分支与远程分支的链接
$ git pull
#修改冲突部分后,重新提交到本地仓库
$ git push #推送到远程仓库中

6.3 分支策略管理

开发中要多利用分支,master作为主分支应该是要非常稳定的,不应该直接修改master。
而是建立个dev分支,以及开发者自己的分支,开发者在各自的分支上开发完毕后再合并到dev中进行测试,没问题后才合并到master中进行发布。

1
2
3
#关闭fast forward模式进行合并,删除分支后也不会丢失分支信息
$ git merge --no-ff -m "merge with no-ff" dev
$ git log --graph --pretty=oneline --abbrev-commit #树形查看日志

在修复bug时,也建议创建一个分支。例如“issue-101”,修复完毕后再合并回去。
在修复前若手上的开发工作进行到一半,无法提交但是又必须提前解决bug,那么可以用stash功能将当前的分支暂存起来:

1
2
3
4
$ git stash #暂存当前分支
$ git stash list #查看暂存空间内的内容
$ git stash apply #将暂存空间恢复到当前工作区,此时暂存空间没有被删除,需要用git stash drop命令手动删除
$ git stash pop #将暂存空间恢复到当前工作区,同时删除暂存空间

6.4 多人协作

将需进行协作的人的公钥添加到远程仓库的ssh设置中,他便能一起开发项目了

1
2
3
4
#默认克隆下来的只有master分支,如果需要其他分支,需用以下命令:
$ git clone https://git.oschina.net/hsinan/learngit.git
#复制远程仓库中的dev分支
$ git checkout -b dev origin/dev

多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream branch-name origin/branch-name

7 标签管理

git可以对当前的版本创建自定义的标签,方便版本管理

7.1 创建标签

1
2
3
4
$ git tag v0.2 #即可创建标签,单独tag没有参数则是查看所有标签列表
$ git tag v0.1 026d4b5 #加上commit id后可对历史的版本打标签,可以git log 来查看历史版本
$ git tag -a v0.1 -m "version 0.1 released" 026d4b5 # 指定标签信息
$ git show v0.1 #查看标签的详细信息

7.2 操作标签##

1
2
3
4
$ git push origin v0.1 #推送标签v0.1到远程仓库
$ git push origin --tags #推送全部尚未推送到远程的本地标签
$ git tag -d v0.01 #删除本地标签v0.01
$ git push origin :refs/tags/v0.01 #若本地标签已推送到远程仓库,那还需要该命令进行删除

8 自定义git

8.1 忽略特殊文件

通过在仓库根目录下添加”.gitignore”文件来实现,常见的配置文件可到github中下载。

1
2
$ git add -f App.class #强制添加被忽略的文件
$ git check-ignore -v App.class #检查想添加的文件被什么规则忽略

8.2 设置别名

将常用的命令设置成别名来快速使用

1
2
$ git config --global alias.lg "log --graph --pretty=oneline --abbrev-commit" #快速树形查询日志
$ git config --global alias.cm "commit -m" #提交并写信息