git是一款版本控制工具,所谓版本控制,也即是任何允许系统性地保存内容版本的系统。
第一部分 使用Git基础操作
1) 查看基础命令和版本
2) 用户配置
git config
配置 用户名 git config --global user.name "Wxx"
配置 邮箱 git config --global user.email "xxxxxxx@163.com"
3)查看配置(也就是查看配置了些什么)
git config -l
或者 git config --list
4 )配置工作空间
下图是将vscode配置为工作空间
5) git Bush上的快捷操作
以下是我初次使用git Bush 记录的一些命令操作。
复制 Ctrl+ins
粘贴 Shift+ins
当git界面不出现文字时 : reset + enter
进入全局 :cd ~
进入某一目录 ;cd 目录名/
进入某一目录(精确定位):cd e:/code/TEST/lsd
回退到上一个目录 :cd ..
切换目录(切换 E 盘下面的fff 目录):cd e:\fff
显示当前目录路径 :pwd
清屏 ;Ctrl +l
新建一个文件 :touch 文件名
打开文件 subl 文件名
第二部分 使用git 上传本地文件
2.1 创建远程仓库
进入Github 创建一个新的仓库,创建仓库时记得选择为这个仓库初始化一个README,用来介绍你的仓库。
2.2 创建本地仓库
以下步骤需要在git Bash上操作,需提前下载。
如果你本地项目已经存在,但是未和git关联,可以为该项目建一个本地仓库名,直接进入本地仓库 git init 初始化一个与git关联的仓库,如该仓库下出现.git的文件,则说明仓库与git关联成功。
如果本地没有项目,是从0开始写项目,以下有两种方法新建一个本地仓库
方法一 :本地创建仓库
以创建一个test1目录为例
git init : 建立一个新目录test1,在目录下使用命令初始化一个仓库
git init test1 :在tset1下面创建一个仓库
方法二 :克隆远程仓库
克隆仓库 : git clone 地址(GitHub的地址)
这一操作默认会在本地创建一个和你远程同名的仓库,也可以通过 :git clone 地址 名字;重命名这个仓库
然后通过 cd 仓库名/ 进入该仓库进行后续操作(记得要切换文件夹)
可以通过以下命令查看从仓库内的文件,确认是否创建成功
ls -a 查看所有文件 包括隐藏 . git隐藏文件。而ls 只能查看正常文件
2.3 为项目添加项目源地址
git remote add origin giturl(你仓库的地址)
通过git remote 查看远程名,如上设置的是origin。
通过git remote -v 查看远程性详细地址,一个是fetch地址(从远程到本地的下载地址),一个是push地址(从本地上传到远程的地址)
2.4 git pull README.md文件
如果是从远程直接clone过来的仓库不需要考虑这一步。
由于本地仓库缺少README.md,可能会导致本地提交时出现,文件合并错误,在此需要把README.md先下载到本地。
通过 git pull ,如果报错 就使用 git pull –rebase origin master
查看本地仓库是否存在README.md文件。
2.5 提交和更新代码
1)文件存入暂存区
git add . (注意中间空格)将所有修改添加至暂存区。
git add 文件名 :单次添加一份文件。
git diff –stadge :查看暂存区文件修改情况。
git add 之后文件呈现为staged状态。
1 | git add .//把编写的所有文件添加早暂存区 |
2)查看状态
git status 可以看到最后提交后更改的文件。git diff查看具体哪里修改了。
untracked files 未跟踪的文件
modified files 已修改的文件
3)提交
一次性提交版本 : git commit -m “描述” (commit语法是祈使句)。
单次提交一个文件:git commit 文件名。
git commit之后文件呈现committe状态。
1 | git commit -m"modify the README.md of Tmall" |
将所有文件添加到暂存区并且提交:
1 | git add . && git commit -m""; |
在上传过程中文件表现为3种阶段 modified staged committed,这三个阶段对应的状态分别为本地仓库、暂存区和远程仓库。详细见下图。

以下是一段操作例子
future (master) reflections $ git add today.txt
future (master +) reflections $ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: today.txt
future (master +) reflections $ git commit
hint: Waiting for your editor to close the file...
[master e3978a9] Add today
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 today.txt
4)上传代码
git push -u 远程名 分支名 : 上传代码
记得查看远程名称 在GitHub上clone的代码默认远程名是origin
1 | git push -u origin master |
2.6 删除文件
1)删除暂存区的文件
git add 之后会将文件添加至暂存区,如果我们需要撤销刚刚添加的文件。
仅仅删除暂存区里的文件
下面的命令仅仅删除暂存区的文件而已,不会影响工作区的文件
1 | git rm --cache 文件名 |
删除暂存区和工作区的文件
1 | git rm -f 文件名 |
2)删除错误提交的commit
有时,不仅添加到了暂存区,而且commit 到了版本库,这个时候就不能使用 git rm了,需要使用 git reset 命令。
git reset有三个选项,–hard、–mixed、–soft。
1 | //仅仅只是撤销已提交的版本库,不会修改暂存区和工作区 |
如果是在提交了后,对工作区的代码做了修改,并且想保留这些修改,那么可以使用 git reset –mixed 版本库ID,注意这个版本库ID应该不是你刚刚提交的版本库ID,而是刚刚提交版本库的上一个版本库。
如果不想保留这些修改,可以直接使用彻底的恢复命令,git reset –hard 版本库ID。
3)删除远程仓库的文件
下面的原理也就是将 工作空间里面的文件 删除,只有上传。
1 | //**删除远程仓库 但不删本地资源** |
如果以后都不希望某个文件上传到 github 上面,有如下两个方法
1)本地也不需要这个文件了: 直接删除文件,下次提交上传之后,远程仓库就没有这个文件了
2)本地仍然需要,比如一些配置文件,包之类的。这时候可以在仓库下面新建一个 .gitignore 文件。按照红框内写文件的目录就可以了。

2.7其他命令
git还提供许多命令辅助我们解决问题。
1)查看版本记录
git log -p : 查看记录同时还可以查看相邻两个版本的增删情况。
git log –oneline : 每个版本只显示一行 仅仅包括版本号和commit信息。
git log –graph –oneline : 图像化显示版本记录,如下图所示

2)回到历史版本
git checkout 版本号 :查看历史节点 此时编辑器也会回到当时那个版本;
You are in 'detached HEAD' state. 若出现如下提示,则表示脱离当前提交版本
git checkout - : 回到上一个节点;
git checout 标签名: 回溯到标签所在的提交。
3)使用标签
重要节点需要加上标签
git tag -a 版本名 -m ‘描述’ :添加一个标签;
git tag : 查看所有标签;
git tag -a ‘版本名’ -m ‘描述’ 版本号 : 给历史版本添加标签;
git show 标签名 :查看某个标签得详细信息。
4)git diff的使用

diff的使用,如图所示。
git diff 时间迟一点版本 / 早一点版本: 查看xx版本和前xx版本的不同
git diff: 对比工作目录和暂存区的不同 git diff 不加参数就可查看
git reset –hard :放弃工作目录和暂存区的所有修改 不可撤回。
git diff –staged : 查看已暂存未提交 和 仓库之间的不同.
当文件修改了却忘记暂存会出现如下提示
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: lesson_2_reflections.txt
通过 git diff,当我们查看尚未暂存的文件更新了哪些部分,
5)git branch的使用
git branch: 会显示你当前的分支,*
表示该分支是当前检出的分支。
git branch easy-mode : 新建了一个easy-mode分支(注意分支名没有空格 命令是不识别空格的)
git checkout easy-mode : 修改当前检出的分支,当前检出指向另一个分支,可通过 git branch再次检查是否修改成功。
git checkout :是自动检出当前分支 当你仅仅只是新建了一个分支 当前检出分支仍是master。
git checkout -b 新分支名字 : 是git branch 分支名 和 git checkout 分支名 的合并
6) git merge的使用
自动合并: git merge
合并的版本中包含当前检出的分支,因此,如果检出了 branch1,并且运行 git merge branch2 branch3,则合并的版本会将 branch1 以及 branch2 和 branch3 组合起来。
如果想将 branch2 合并到 branch1 中,只需键入 git checkout branch1,然后键入 git merge branch2 即可
git merge 始终将所有指定的分支合并到当前检出的分支中,并为该分支新建一个提交
7) 合并冲突
A和B吧 把同一份文件拷贝到自己的本地仓库,A对文件做了修改,B也对文件做了修改。当他们同时提交时,就会出现合并冲突。此时开可通过检查两份文件的不同之处,进行手动合并,具体方式再次不展开。
8)fork
fork他人的库到自己的仓库里,再此之上修改。git clone某一地址后,会将之前fork的地址当做remote的默认地址。
下图介绍了Branch、clone 、fork之间的区别。

9) Git 错误和警告解决方案
- Should not be doing an octopus(不应执行 octopus)
Octopus 是 Git 用来合并多个不同代码版本的一种策略。如果在不合适的情况下尝试使用该策略,则可能会出现此消息。
- You are in ‘detached HEAD’ state(你处于“分离的 HEAD”状态)
Git 将你目前所在的提交称为 HEAD。可通过切换到前一个提交来“分离”HEAD,虽然此警告听起来不太好,但分离 HEAD 实际上不是坏事。Git 只是向你发出警告,以便你知道自己正在这样做。
- Panic! (the ‘impossible’ happened)((天哪!“不可能的事”发生了))
这是真正的错误消息,但它不是由 Git 输出的,而是由 GHC(编程语言 Haskell 的编译器)输出的。它仅在发生特别让人惊讶的错误时才会出现
10) git提交代码总是需要输入密码
可能是因为git默认的远程地址采用的方式是https,将其更改为ssh即可。
首先再给自己的github设置一个ssh。
然后就是更改远程地址,详见下图

总结
下图详细描述了在使用git将本地文件上传到github仓库之间,文件的状态转换 ,以及一些基本的操作命令。
这篇文章是我在学习git上传本地文件到github仓库的一些总结,具体细节可参考学习网站。
第三部分 git 初始化上传项目 流程
方法一 先在 github 上建库 (推荐)
- 在github 上面新建一个仓库
- 在本地克隆这个仓库
- 在开发工具里面打开克隆的仓库,开始编辑
方法二 本地和 github 都建库
这种方法分两种情况
1 github 库没有文件(可能会在初始化的时候添加一个 readme.md )或者本地的库里没有文件
这种情况为本地仓库添加一个 remote 地址(远程仓库地址),之后就可以直接 add remote push
2 github 库 和本地库里面的内容不一致
上传代码前需要先把远程的仓库 pull 到本地
1 | git pull origin master --allow-unrelated-histories //把远程仓库和本地同步,消除差异 |