一、Git和GitHub的设置

官网下载git,git的环境变量会随着下载安装自动添加

1.设置用户名和邮件地址

git config --global  user.name "这里换上你的用户名"
git config --global user.email "这里换上你的邮箱"

查看当前用户名和邮箱:
git config --global  --list
  • 在此处设置用户名和邮件地址时,如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。
  • 想针对特定项目使用不同的用户名称与邮件地址,可以在那个项目目录下运行没有 --global 选项的命令来配置。

2.与GitHub设置ssh配对

首先,需要生成ssh公钥。键入

ssh-keygen -t rsa -C "这里换上你的邮箱"

然后,就会出现等待你的三次输入,内容分别是:

  • 确认秘钥的保存路径(如果不需要改路径则直接回车);
  • 如果上一步置顶的保存路径下已经有秘钥文件,则需要确认是否覆盖(如果之前的秘钥不再需要则直接回车覆盖,如需要则手动拷贝到其他目录后再覆盖);
  • 创建密码(如果不需要密码则直接回车)

最后,在上述指定的保存路径下(默认C:\Users\Administrator.ssh)会生成名为id_rsaid_rsa.pub的文件。将生成的id_rsa.pub文件中的内容拷贝到GitHub中的key(其名称通常是用来区分不同主机),然后保存。

  • C:\Users\Administrator.ssh该路径下的.ssh文件夹如果存在,可以直接删除,按上述重新生成ssh文件夹

  • 注意:秘钥对:id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

查看当前本地与GitHub的连接情况:
ssh -T git@github.com

二、本地库操作

1.创建版本库

1.创建空目录(这里目录名为learngit)

$ mkdir learngit

2.进入目录

$ cd learngit

3.显示当前目录

$ pwd

4.将当前目录变为Git可以管理的仓库

$ git init

 .git目录是Git来跟踪管理版本库的,要放到Git仓库的文件要放在该目录或者其子目录下

2.把文件添加到版本库

1.在分支中新建文件(这里文件为readme.txt)

$ touch readme.txt

2.vim编辑文件

$ vi readme.txt

按 “i” 进入编辑,按 “esc” “:wq”保存并推出

3.把文件添加到仓库

$ git add readme.txt

4.把文件提交到仓库

$ git commit -m "wrote a readme file"

commit可以一次提交很多文件,所以你可以多次add不同的文件

Git告诉我们当前没有需要提交的修改(nothing to commit),而且,工作目录是干净(working tree clean)的。

3.修改文件、查看修改

1.查看仓库当前的状态(如:是否修改了文件、修改是否已提交、删除了什么文件、冲突的文件等)

$ git status

2.查看具体修改了什么内容

$ git diff readme.txt

4.版本回退

每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

1.查看提交日志的历史记录

$ git log

简略版

$ git log --pretty=oneline

一大串类似1094adb...的是commit id(版本号)

在Git中,用HEAD表示当前版本,最新的提交上一个版本是HEAD^``,上上一个版本就是HEAD^^

2.回退到上一个版本

$ git reset --hard HEAD^

3.指定回到未来的某个版本

(1)只要上面的命令行窗口还没有被关掉,你就可以顺着往上找,找到那个未来版本的commit id,这里1094adb...

$ git reset --hard 1094a

(2)已经关闭了命令行,想恢复到新版本

  • 查看命令日志的历史记录(为了找commit id)
$ git reflog
  • 找到待恢复版本的commit id,用$ git reset –hard 1094a回到新版本

5.撤销修改

1.丢弃工作区的修改

$ git checkout -- readme.txt

自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令

2.修改后已经git add到暂存区,但是还没有提交

$ git reset HEAD readme.txt

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

接下来通过命令$ git checkout -- readme.txt丢弃工作区的修改

3.已经提交到版本库(前提是没有推送到远程库)

想要撤销本次提交,参考四.版本回退

6.删除文件

1.从工作空间删除文件(和直接在文件管理器删除相同)

$ rm test.txt

2.从版本库删除文件

如果该文件已经提交到了版本库,从工作空间删除文件后,那么此时工作区和版本库就不一致了

$ git rm test.txt
然后
$ git commit -m "remove test.txt"

文件就从版本库中被删除了

3.从版本库恢复工作空间误删的文件

$ git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

7.分支操作

1.查看分支

$ git branch

2.创建分支(这里分支名为dev)

$ git branch dev

3.切换分支

$ git checkout dev

或者

$ git switch dev

注意:在切换分支时,分支上的文件要及时的add和commit,否则只是保存在工作空间,每个分支都会有共同的文件

4.创建+切换分支

$ git branch -d dev

或者

$ git switch -c dev

5.合并某分支到当前分支

$ git merge dev

6.删除分支

$ git branch -d dev

7.查看分支合并图

查看分支的合并情况,包括分支合并图、一行显示、提交校验码缩略显示

$ git log --graph --pretty=oneline --abbrev-commit

8.禁用fast forward的合并

$ git merge --no-ff -m "merge with no-ff" dev

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

三、远程库操作

1.本地仓库与远程库相关联

在本地的learngit仓库下运行命令

$ git remote add origin GitHub仓库地址

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库

2.本地仓库分支推送到远程库

$ git push -u origin master

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。以后只要本地作了提交,就可以把本地master分支的最新修改推送至GitHub

$ git push origin master

3.克隆仓库

$ git clone github仓库地址

4.本地创建远程库分支并推送(这里本地库名为dev)

  • 待创建分支名称与本地相同
$ git push origin dev

此时GitHub仓库里也会创建一个名为dev的分支,内容和本地库相同

  • 待创建分支名称与本地不同(这里远程库名为dev1)
$ git push origin dev:dev1

5.在本地创建和远程分支对应的分支(这里远程库名为dev)

$ git checkout -b dev origin/dev

6.本地删除远程库分支(这里远程库分支为dev)

$ git push origin :dev

7.查看远程库的信息

$ git remote

更详细的信息

$ git remote -v

8.指定本地dev分支与远程origin/dev分支的链接

$ git branch --set-upstream-to=origin/dev dev

参考资料:廖雪峰老师博客