一、概念
1.为什么要使用Git
为了更好的去管理我们每次的更改(版本控制)
2.Git的诞生
- linux之父:Linus
- linux开源
- 提交补丁和保存归档
- 2002,专有的分布式版本控制系统bitkeeper来管理和维护代码
- 2005,结束,收回使用权
- 2个星期用c写出来
- 源代码管理的好处:方便多人协同开发;方便版本控制
3.结构分析

二、操作
1.安装
-
ubuntu下安装
sudo apt-get install git -
windows下安装
git --version
git --help
2.创建本地仓库
方式一:当前目录作为git仓库
# 初始化
git init
#已初始化仓库
>>>Initialized empty Git repository in /home/lemon/.git/
方式二:指定目录作为Git仓库
git init 指定目录
3.配置个人信息
# 1.全局配置个人信息
git config --global user.name "xf"
git config --global user.email "xf@mq.com"
# 配置信息在家目录下 ~/.gitconfig
===========================================
# 2.针对项目配置个人信息
git config user.name "xf"
git config user.email "xf@mq.com"
# 配置信息在 .git/config

4.文件添加、修改
git status
git add 文件 # 工作区---》暂存区
git add . # 全部文件
git commit -m '备注信息' # 暂存区---》仓库
git commit -am "备注信息"# 工作区---》仓库
5.查看历史记录
git log [option]
git log --pretty=oneline 将提交信息显示为一行
git log --all 显示所有分支
git log --abbrev-commit 使得输出的commitId更简短
git log --graph 以图的形式显示
================================
简化:
# 用于输出git提交日志
alias git-log='git log --pretty=oneline --all --abbrev-commit --graph'
# 用于输出当前目录所有文件及基本信息
alias ll='ls -al'
================================
git reflog # 删除commit,也能查询
**
git reflog用的多
**
git diff HEAD -- readme.txt# 查看修改的difference
6.回退版本
git reset
--soft(回退仓库)
--mixed(回退仓库、暂存区)
--hard (回退仓库、暂存区、工作区)
#--hard用的多
HEAD
-HEAD 当前版本
-HEAD^ 上一个版本
-HEAD^^上上一个版本
。。。。
~数字
-HEAD~0 当前版本
-HEAD~1 上一个版本
。。。。
版本号

撤销缓存区

- 从工作区和仓库区中间的暂存区,撤回到工作区
git reset HEAD <file>
git reset --hard 4b8ed33 # 序号可用reflog查看
7.删除
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master b84166e] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
8.分支
# 查看分支
git branch
git branch -v
# 创建分支
git branch 分支名
# 切换分支
git checkout 分支名
# 或者:
git switch <name>
# -b:创建并切换
git checkout -b dev
# 或者
git switch -c dev
# 相当于两条命令:
$ git branch dev
$ git checkout dev
# 合并分支
合并到你的主分支,一定要checkout回主分支
git merge feifei(自己的分支)
# 合并冲突
场景:两个分支在同一个文件的同一个位置有两套不同的修改。Git无法决定用哪一个,必须人为来决定
vim
git add .
git commit -m '备注'
# 删除分支
git branch -d <name>
9. 远程仓库
# 连接远程库(SSH)
$ git remote add origin git@gitee.com:lemon_guess/test4854.git
# 连接远程库(HTTPS)
$ git remote add origin git@gitee.com:lemon_guess/test.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
# 查看远程库信息
$ git remote -v
# 移除掉远程仓库的配置
$ git remote rm origin
# 针对本项目配置个人信息
git config user.name "xf"
git config user.email "xf@mq.com"
# 代码推送到远程仓库
git push 远程仓库别名 分支名
# 代码拉取到本地仓库
git pull 远程仓库别名 分支名
Gitee相关
参考链接:https://gitee.com/help/articles/4181#article-header0
1.生成密钥
$ ssh-keygen -t rsa -C "lemon_guess@163.com"
然后一路enter,结果如下:

2.查看公钥
$ cat /home/lemon/.ssh/id_rsa.pub
3.连接测试
$ ssh -T git@gitee.com
四、常见问题
问题一:
别人先提交了自己的工作代码到远程仓库,导致自己提交时时,由于自己当前版本落后远程最新版本,导致提交失败。
解决:当前分支落后了远程仓库的分支,推送不进去如何解决呢!
# 1. 使用git stash save "暂存" 将自己修改的代码,进行一个本地仓库的临时缓存。
$ git stash save "暂存"
Saved working directory and index state On master: 暂存
# 2. 使用git stash list 查看缓存代码片段。
$ git stash list
stash@{0}: On master: 暂存
# 3. 执行pull命令 将远程仓库更新到本地。
$ git pull origin master
# 4. 将我们的修改合并到更新后的代码中,stash@{0} 就是我们自己暂存的标记
$ git stash pop stash@{0}
# 5. 回到自己代码中,合并或删除不需要的代码。
# 6. git status 查看文件修改状态
# 7. git checkout 文件名称 (各个文件名之间用空格 隔开) 撤销不需要的提交文件
# 8. git add 提交文件名称 (各个文件名之间用空格 隔开) 需要提交的文件。不建议直接使用git add .
# 9. git commit –m” 修改记录说明” 提交到本地仓库
# 10. git push origin master 是推到远程master库
问题二:
在使用git协同开发时,难免会出现不同的人员,同时修改某个文件导致代码冲突的问题。
这时候我们提交代码前,应该首先获取远程最新版本,与本地版本合并。回到代码中解决冲突,在做提交。
# 查询当前远程的版本
$ git remote -v
# 获取最新代码到本地(本地当前分支为[master],获取的远端的分支为[origin/master])
$ git fetch origin master [示例1:获取远端的origin/master分支]
$ git fetch origin pin[示例2:获取远端的origin/pin分支]
# 查看版本差异
$ git log -p master..origin/master [示例1:查看本地master与远端origin/master的版本差异]
$ git log -p dev..origin/pin[示例2:查看本地dev与远端origin/dev的版本差异]
# 合并最新代码到本地分支
$ git merge origin/master [示例1:合并远端分支origin/master到当前分支]
$ git merge origin/pin[示例2:合并远端分支origin/dev到当前分支]
问题三:
有时候,我们用Git的时候有可能commit提交代码后,发现这一次commit的内容是有错误的
那么有两种处理方法:
1、修改错误内容,再次commit一次
2、使用git reset 命令撤销这一次错误的commit
$ git reset --soft HEAD^ # 撤销这一次错误的commit
问题四:
日常开发中,由于一个项目可能有多个人维护,每个人开发不同的模板,造成别人提交了代码再当你提交代码时提示版本不一致,无法push。
解决办法:
1.首先将远程仓库的master(或dev)下载到本地的分支上
$ git fetch origin master:tmp
2.查看tmp分支与本地有什么不同
$ git diff tmp
3.将tmp分支与本地分支结合
$ git merge tmp
这时候可能会出现两个版本有冲突的界面,出现这个界面不要慌,如果想退出这个界面的话,按“q”
然后用idea打开项目,看看有哪些文件有冲突,一般变红色的文件是有冲突的地方
第一步:在<<<<<<< <分支名> ======== >>>>>>>><分支名> 删掉,冲突代码自行合并修改
第二步:
git add <已修改冲突文件>,比如pom.xml
$ git add pom.xml
第三步:合并,注意:这里commit提交时不能带上文件
$ git commit -m "合并日志"
分支名由(first|MERGING)变成(first)说明合并成功
如果不知道怎么add冲突文件,可以先执行第三步,它会提示你哪些文件冲突没添加,再进行二、三步。
由于一个项目有多个人维护,不可能直接提交到远程master,那么我们就提交到远程分支上
$ git push origin master:dev
如果远程仓库上有dev分支,则直接提交到这个分支;如果没有,则创建。
4.最后别忘了删除分支
$ git branch -d tmp
补:本地切换分支为
$ git checkout dev # 切到dev分支